Php 加载主页时发生PDO错误

Php 加载主页时发生PDO错误,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我在主页上有以下代码: 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->ass

我在主页上有以下代码:

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为null,这是错误:

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


我怎么能解决这个问题

即使
from
where
是保留字,也需要用反勾号包装,而不是你的
from
where
。您正在从
char
表中进行选择


请参阅MySQL.com上的列表:


进一步阐述如果您的查询是,并且作为示例:

然后必须在这些列和表名周围使用反勾号:

('Select `from` From `char` WHERE `where` = :user')
我只是提到这一点,因为有些人在消息传递系统等的查询中使用
from
(和
to
)和其他MySQL保留字,而他们并不知道;这种情况经常发生(我已经见过好几次了)。我们不能期望记住所有的保留字是什么,这就是为什么检查对开发人员来说很重要

例如:


尽管
from
where
是保留字,但它需要用反勾号包装,而不是你的
from
where
。您正在从
char
表中进行选择


请参阅MySQL.com上的列表:


进一步阐述如果您的查询是,并且作为示例:

然后必须在这些列和表名周围使用反勾号:

('Select `from` From `char` WHERE `where` = :user')
我只是提到这一点,因为有些人在消息传递系统等的查询中使用
from
(和
to
)和其他MySQL保留字,而他们并不知道;这种情况经常发生(我已经见过好几次了)。我们不能期望记住所有的保留字是什么,这就是为什么检查对开发人员来说很重要

例如:

这是正确的语法,您还可以跳过除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]);
这将是另一种方法

这是正确的语法,您还可以跳过除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]);

这是另一种方法。

为什么将
From
WHERE
包装在backticks中?
('Select sex From char WHERE user_id=:user')
我认为这是问题所在,但仍然会出错。添加
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)在连接打开后立即执行。此外:要检查值是否为NULL,不能使用简单的比较运算符,如!=或=。你应该改为使用操作符。为什么将
From
WHERE
用反勾号包装?
('Select sex From char WHERE user\u id=:user')
我认为这是问题所在,但仍然会出错。添加
$dbh->setAttribute(PDO::ATTR\u ERRMODE,PDO::ERRMODE\u异常)在连接打开后立即执行。此外:要检查值是否为NULL,不能使用简单的比较运算符,如!=或=。你应该改用接线员。谢谢。。这就是问题所在。。但我不明白为什么在用户id为null的情况下仍然运行查询…@MárioPassos你是受欢迎的Mário。你说“当用户id为空时”。您的查询显示为
!=空
。如果查询继续,因为它是空的,那么我会说这可以解释它。谢谢。。这就是问题所在。。但我不明白为什么在用户id为null的情况下仍然运行查询…@MárioPassos你是受欢迎的Mário。你说“当用户id为空时”。您的查询显示为
!=空
。如果查询继续,因为它是空的,那么我会说这可以解释它。
$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]);