mysqli准备陈述使用选择失败的一些未知的原因

问题描述:

这是为什么失败?我连接到正确的数据库,并且键肯定存在。mysqli准备陈述使用选择失败的一些未知的原因

//verify key against key list in database 
if ($prep_statement = $db->prepare("SELECT id FROM key_list WHERE keys=?")) 
{ 
    $prep_statement->bind_param('s',$key); 
    $prep_statement->execute(); 
    echo $prep_statement->num_rows; 
    $prep_statement->close(); 
} else { 
    printf("Prepared Statement Error: %s\n", $db->error); 
    die();  
} 

我得到以下错误,if语句返回false

Prepared Statement Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key=?' at line 1 

这里是我的表结构:

-- MySQL dump 10.11 
-- 
-- Host: localhost Database: gameserverdev 
-- ------------------------------------------------------ 
-- Server version 5.0.51a-24+lenny4 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

-- 
-- Table structure for table `key_list` 
-- 

DROP TABLE IF EXISTS `key_list`; 
SET @saved_cs_client  = @@character_set_client; 
SET character_set_client = utf8; 
CREATE TABLE `key_list` (
    `id` bigint(20) unsigned NOT NULL auto_increment, 
    `keys` char(16) NOT NULL, 
    `datetime_registered` datetime NOT NULL, 
    `banned` tinyint(1) NOT NULL, 
    `comment` char(255) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 
SET character_set_client = @saved_cs_client; 

-- 
-- Dumping data for table `key_list` 
-- 

LOCK TABLES `key_list` WRITE; 
/*!40000 ALTER TABLE `key_list` DISABLE KEYS */; 
INSERT INTO `key_list` VALUES (2,'1111222233334444','2010-07-31 16:04:30',0,NULL); 
/*!40000 ALTER TABLE `key_list` ENABLE KEYS */; 
UNLOCK TABLES; 

-- 
-- Dumping routines for database 'gameserverdev' 
-- 
DELIMITER ;; 
DELIMITER ; 
/*!40103 SET [email protected]_TIME_ZONE */; 

/*!40101 SET [email protected]_SQL_MODE */; 
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
/*!40014 SET [email protected]_UNIQUE_CHECKS */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
/*!40111 SET [email protected]_SQL_NOTES */; 

-- Dump completed on 2010-07-31 23:00:56 

你要绑定一个结果,没有约束力a parameter 。将bind_result更改为bind_param,它应该可以正常工作。


key是一个MySQL reserved word。您需要将列名更改为不是保留字的内容,否则您需要引用它。在MySQL中,default identifier quote character是backtick,`,但如果ANSI引用启用,则可以使用双引号"

所以,你的说法应该是:

SELECT id FROM key_list WHERE `key` = ? 
+0

我已经纠正了我的代码。同样的错误。更新原始帖子。 – Eric 2010-07-31 23:04:18

+0

阿 - 哈,我没有注意过,但你使用的是保留字。答案已更新。 – Charles 2010-07-31 23:38:49

+0

现在工作。我尝试了钥匙和钥匙,但显然他们都是保留的。谢谢!! – Eric 2010-07-31 23:59:02