主页加载时出现 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 行
我该如何解决这个问题?!
【问题讨论】:
为什么From
和WHERE
用反引号括起来?
('Select sex From char WHERE user_id = :user')
我认为这是问题所在,但仍然出现错误。
连接打开后立即添加$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
。
另外:要检查一个值是否不为 NULL,您不能使用像 != 或 = 这样的简单比较运算符。您应该改用IS NOT NULL 运算符。
【参考方案1】:
尽管from
和where
是保留字,但需要用反引号括起来的是char
,而不是你的from
和where
。您正在从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 连接时出现致命错误