有很多关于这个问题的问题,但我仍然找不到回答我的问题。
我得到了一些代码(显然),它对数据库进行查询,并且由于某种原因它返回了一个错误。
// ^ somewhere in the top session_start();
require("rw_conx.php");
try {
// Get answers from database
$db = new PDO ("mysql:host=$host;dbname=$dbname", $username, $pass);
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $db->prepare("SELECT antwoorden, commentaar
FROM antwoorden
WHERE vragenlijst = :vragenlijst
AND meting = :meting
AND behandeltraject = :behandeltraject
AND onderzoeksNR = :onderzoeksnummer");
$vragenlijst = "1";
$meting = "1";
$onderzoeksNR = trim(preg_replace('#[^0-9]#', '', $_SESSION["onderzoeksnummer"]));
$behandeltraject = trim(preg_replace('#[^0-9]#', '', $_SESSION["behandeltraject"]));
$stmt->execute(array('vragenlijst'=>$vragenlijst,'meting'=>$meting,'behandeltraject'=>$behandeltraject,'onderzoeksnummer'=>$onderzoeksNR));
// Render all questions (check if 5's should be hidden), input disabled, no answer categories.
$num_rows = $stmt->rowCount();
$row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);
// What this does is create a string like: 1=2,2=4,3=5|||COMMENTS|||1=blabla,2=blabla
if ($num_rows > 0) {
echo $row[0];
echo "|||COMMENTS|||";
echo $row[1];
} else {
echo "no data";
}
} catch(PDOException $e) {
echo "I'm sorry, I'm afraid I can't do that. (1)";
file_put_contents('../debug.log', $e->getMessage(), FILE_APPEND);
exit();
}
$stmt->execute(array('vragenlijst'=>$vragenlijst,'meting'=>$meting,'behandeltraject'=>$behandeltraject,'onderzoeksnummer'=>$onderzoeksNR));
---编辑---
为了说清楚这一点,我将解释。
1. 我在上面的问题中提到,会议没有问题。
我的意思是,发生的错误(SQLSTATE[HY093])没有被抛出,因为会话是空的。
2.问题仍然出现。
即使 session_start() 修复了查询(它现在返回它应该返回的行),我仍然收到同样的错误,这(当然)不应该发生。
我希望这能把事情弄清楚一点,因为每个人都在生我的气。我确实提到会话没有问题,对于发生的错误来说,它们没有问题。出于某种原因,即使查询成功运行,catch 函数仍然给我一个错误。
所以,如果还有人愿意帮助我,我将不胜感激。
---结束编辑---
有人看到(可能很明显的)缺陷吗?
您面临的问题是由于零宽度空格(Unicode中的​
)。这可能会自动添加到您正在使用的编辑器中。jQuery还将插入零宽度的空格字符,您可以在此处阅读。
但是为什么它会给我SQLSTATE[HY093]
错误呢?
这是因为未定义$behandeltraject
(前面有一个零宽度空间),因此参数不匹配。
看到 GuyT <=(edit) 已经解开了这个谜团,我根据我在 OP 问题下留下的评论发布以下内容:
你提到会话。你开始会话了吗?
是否包括session_start();
?
您在另一个关于var_dump($_SESSION);
的答案的评论中提到
session_start();
需要使用会话位于所有文件中。
原答案,上面加了一个:
您忘记了onderzoeksNR
的$
标志
'onderzoeksnummer'=> onderzoeksNR
^ right there
关于
$onderzoeksNR = "1";
将其更改为
'onderzoeksnummer'=>$onderzoeksNR
我的猜测是,错误要么来自不同的语句,要么其中一个值是使用会话变量的代码中的数组或 null
// Normally this are sessions, I checked them, and they contain a value.
您应该使用bindParam
成员,
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
。因为
- 它不会抛出奇怪的错误
- 使用
execute()
,所有参数都转换为string
。
http://php.net/manual/en/pdostatement.execute.php