PHP中PDO的奇怪行为

PHP中PDO的奇怪行为,php,mysql,debugging,pdo,Php,Mysql,Debugging,Pdo,我有一个PDO语句,由于某种原因拒绝正确执行。它返回false。但是,当使用PDO的query()运行完全相同的语句时,它的工作方式应该是 以下是相关代码: // Prepare PDO statement $getStatus = $dbHandle->prepare("SELECT `active` FROM `teachers` WHERE `id` = :teacher LIMIT 1;"); $getStatus-

我有一个PDO语句,由于某种原因拒绝正确执行。它返回false。但是,当使用PDO的query()运行完全相同的语句时,它的工作方式应该是

以下是相关代码:

// Prepare PDO statement
$getStatus = $dbHandle->prepare("SELECT `active` FROM `teachers`
                                 WHERE `id` = :teacher LIMIT 1;");
$getStatus->setFetchMode(PDO::FETCH_ASSOC);
$getStatus->bindParam(':teacher', $teacher_id, PDO::PARAM_INT);

// This statement retrieved the relevant teacher id;
// or false, if an invalid teacher was specified; in this
// case, we specify a valid teacher
$teacher_id = array_search($_POST['teacherName'], $acronyms);

// For debugging: show $teacher_id
echo("$teacher_id<br />");

// Execute query; should return an associative array
$newStatusArray = $getStatus->fetch();

// Nothing . . .
print_r($newStatusArray);

// returns "bool(false):
var_dump($newStatusArray);

// Trying with a query
foreach ($dbHandle->query("SELECT `active` FROM `teachers`
                           WHERE `id` = $teacher_id LIMIT 1;") as $row) {
  // This loop runs only once because of the LIMIT 1
  $newStatus = $row['active'];
}

// This prints the new status (was changed before, is always 0 or 1)
echo("$newStatus<br />");
我已经试着让它工作了一个多小时了,但我真的不知道出了什么问题。有人知道这里有什么问题吗

我将非常感谢任何指点

///////////////////////////////////////////////编辑:///////////////////////////////////////////////

谢谢你的回答!太愚蠢了——事实上,我忘记了execute语句。嗯。非常非常尴尬。很抱歉占用了你的时间!!!就像这样,它确实有效:

if (!$getStatus->execute()) {
  errorHandler("Errorcode: {$getStatus->errorCode()},
                errorinfo: {$getStatus->errorInfo ()}.");
}
$newStatusArray = $getStatus->fetch();
var_dump($newStatusArray);

bindParam可以保持在顶部;这符合我对该方法价值的理解;您只需将一个变量指定给PDO语句中的一个插槽,并且无论何时执行查询,都会传递该变量当时的值。

我很好奇为什么您的指令:

$teacher_id = array_search($_POST['teacherName'], $acronyms);
$getStatus->bindParam(':teacher', $teacher_id, PDO::PARAM_INT);
在bind指令之后执行:

$teacher_id = array_search($_POST['teacherName'], $acronyms);
$getStatus->bindParam(':teacher', $teacher_id, PDO::PARAM_INT);

这可能是您的问题。

在从
$\u POST
参数中检索值之前,先绑定
$teacher\u id
。如果在这之后移动
bindParam()
,它应该可以工作。

您忘记了执行您的语句

$getStatus->execute(); // added
$newStatusArray = $getStatus->fetch();

什么是
限制1
?您是否有多个具有相同id的教师?如果是这样,为什么不把它作为主键呢?若否,;永远不会有多个结果:)事实上,id是主键:-)我没有意识到,对于主键,限制1是隐式的。我倾向于使用它来提高MySQL的速度(即,当它发现“命中”时,它会立即停止),但是你是对的,在这种情况下MySQL可能会这样做,因为它知道这个字段是主键!不要相信你听到的一切。MySQL仍然需要搜索这一行。如果它是一个主键,MySQL足够聪明,可以意识到永远不会有超过一行带有该标识符。你可以设定基准,但我不认为这有什么区别。啊,很高兴知道-谢谢!通常,当我使用限制1时,它是关于主键的——我想这是有意义的,因为在那种情况下,你总是确定只有一个:-)很高兴知道我可以从现在起忽略它!就这样,非常感谢(见编辑后的问题)。对不起,我不能投票支持你(声誉太低)。但是非常感谢你@贝里朗格拉克:是的,但他要等一段时间才能做到这一点:)@都是——我做到了;我做到了:-)谢谢你的回答!然而,如果我理解正确(我很可能理解错误),那么在绑定变量时就没有必要这样做;绑定时不读取值,而是在执行查询时读取值。至少我是这么想的?否则,bindParam相对于bindValue的值是多少?谢谢您的回答!但我不确定这是否是解决方案;请参阅我对Olaf答案的评论和编辑后的问题。