PHP中PDO的奇怪行为

时间:2012-11-15 09:09:03

标签: php mysql debugging pdo

我有一个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 />");

普通查询,虽然它应该完全按照预备语句的作用完成,但是有效;但准备好的声明什么也没有。 。

$getStatus->errorCode()为空。 。 。 MySQL很高兴。此外,$getStatus->debugDumpParams()显示了它应该是什么:

SQL: [62] SELECT `active` FROM `teachers` WHERE `id` = :teacher LIMIT 1;
Params: 1 Key: Name: [8] :teacher paramno=-1 name=[8] ":teacher"
is_param=1 param_type=1 

我一直试图让这个工作超过一个小时,但我真的不知道出了什么问题。谁能看到这里的问题是什么?

我非常感谢任何指针!

///////////////////////////////////////////////编辑://///////////////////////////////////////////// < / p>

感谢您的回答!太愚蠢 - 事实上,我忘记了执行声明。呃。 。非常非常尴尬。抱歉占用了你的时间!!!像这样,它确实有效:

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

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

3 个答案:

答案 0 :(得分:4)

你忘记了->execute()你的陈述。

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

答案 1 :(得分:0)

我很好奇为什么你的指示:

$teacher_id = array_search($_POST['teacherName'], $acronyms);

追踪绑定指令:

$getStatus->bindParam(':teacher', $teacher_id, PDO::PARAM_INT);

也许这是你的问题。

答案 2 :(得分:0)

在从$teacher_id参数中检索值之前绑定$_POST。如果你之后移动bindParam()它应该可以工作。