主页加载时出现 PDO 错误


PDO error when home page load

>我在主页上有这段代码:

if ($interface->getsession("userid") != Null) {
    $dbh->query('Select sex `From` char `WHERE` user_id = :user');
    $dbh->bind(':user',$interface->getsession("userid"));
    $_gender = $dbh->single();
    $smarty->assign("gender",$_gender);
}

用户 ID 为空,这是错误:

致命错误:

未捕获的异常"PDOException",消息为"SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在第 76 行 F:''wamp''www''StayAlive''bd''pdo.class.php第 1 行的"char WHERE user_id = '0'"附近使用的正确语法

我该如何解决这个问题?!

即使fromwhere是保留词,也需要用反引号括起来的是char,而不是你的fromwhere。您正在从char表中进行选择。


请参阅 MySQL.com 上的列表:

  • http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

为了进一步详细说明; 如果你的查询是,并作为一个例子:

('Select from From char WHERE where = :user')

然后,您将不得不在这些列和表名周围使用反引号:

('Select `from` From `char` WHERE `where` = :user')

我只是提到这一点,因为有些人确实在他们不知道的情况下在消息传递系统等的查询中使用了from(和to(和其他MySQL保留字;它发生了(我已经看过很多次了(。我们不能指望我们记住所有的保留字是什么,这就是为什么检查保留关键字列表对开发人员很重要的原因。

例如:

('SELECT `from` FROM `tablename` WHERE `to` = :user')
$dbh->query('SELECT `sex` FROM `char` WHERE `user_id` = :user');

这将是正确的语法,您也可以跳过除字符之外的所有 ',因为它是一个 SQL 语法词。

$stm_getsex = $dbh->prepare("SELECT `sex` FROM `char` WHERE `user_id` = ?");
$stm_getsex->execute(array($interface->getsession("userid"));
$gender = $stm->fetchAll();
$smarty->assign("gender", $gender[0]);

将是另一种方法。