主页加载时出现 PDO 错误

Posted

技术标签:

【中文标题】主页加载时出现 PDO 错误【英文标题】:PDO error when home page load 【发布时间】:2014-08-21 15:39:48 【问题描述】:

我在主页上有这个代码:

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 服务器版本相对应的手册以获取正确的语法,以便在 F:\wamp\www\StayAlive\bd\pdo.class.php 的第 1 行的 'char WHERE user_id = '0'' 附近使用第 76 行

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

【问题讨论】:

为什么FromWHERE 用反引号括起来? ('Select sex From char WHERE user_id = :user') 我认为这是问题所在,但仍然出现错误。 连接打开后立即添加$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 另外:要检查一个值是否不为 NULL,您不能使用像 != 或 = 这样的简单比较运算符。您应该改用IS NOT NULL 运算符。 【参考方案1】:

尽管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 保留字; 它发生了(我已经看过很多次了)。我们不能指望记住所有保留字是什么,这就是为什么检查the list of reserved keywords对开发人员很重要。

例如:

('SELECT `from` FROM `tablename` WHERE `to` = :user')

【讨论】:

谢谢.. 那是问题.. 但是为什么当我不明白的用户 id 为空时仍然运行查询... @MárioPassos 不客气,马里奥。你说“当用户ID为空时”。您的查询显示为!= Null。如果查询继续,因为它是空的,那么我会说这可以解释它。【参考方案2】:
$dbh->query('SELECT `sex` FROM `char` WHERE `user_id` = :user');

这将是正确的语法,您也可以跳过除 char 之外的所有 `,因为它是一个 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]);

将是另一种方法。

【讨论】:

以上是关于主页加载时出现 PDO 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 ODBC 使用 msaccess 创建 PHP PDO 连接时出现致命错误

在刷卡器中从 php 加载图像时出现空错误

使用 SSL 与远程数据库的 PDO 连接;验证服务器证书时出现 FastCGI 错误

访问主页时出现 Pythonanywhere 错误

刚安装的Tomcat访问主页时出现500错误

Actionscript 3 - 在我的 swf 中加载另一个 swf 时出现列表错误