어떤 이유로 든 올바르게 실행되지 않는다는 PDO 선언문이 있습니다. 거짓을 반환합니다. 그러나 PDO의 query()를 사용하여 똑같은 명령문을 실행하면 정상적으로 작동합니다. . .PHP에서 PDO의 이상한 동작
이 관련 코드 :
// 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은 행복합니다. 나는 이것이 지금 시간 이상 일을 얻기 위해 노력 해왔다
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
,하지만 난 심각하게 잘못 무슨하지 않습니다 또한, $getStatus->debugDumpParams()
로되어 있는지 보여줍니다. 아무도 여기서 문제를 볼 수 있습니까?
나는 모든 포인터에 크게 감사 할 것입니다!
//////////////////////////////////////////////////////////////////////////////편집하다: ///////////////////////////////////////////////
답장을 보내 주셔서 감사합니다. 바보 같았습니다. 실제로 저는 성명서를 잊어 버렸습니다. 이봐. . . 아주, 아주 당황 스럽네. 죄송합니다! 이처럼, 수행 업무 :
if (!$getStatus->execute()) {
errorHandler("Errorcode: {$getStatus->errorCode()},
errorinfo: {$getStatus->errorInfo()}.");
}
$newStatusArray = $getStatus->fetch();
var_dump($newStatusArray);
bindParam 수있는 상단에 숙박; 이것은이 방법의 가치에 대한 나의 이해와 일치합니다. PDO 문에서 슬롯에 변수를 지정할 수 있으며 쿼리가 실행될 때마다 그 순간의 변수 값이 전달됩니다. 여기 아마
$getStatus->bindParam(':teacher', $teacher_id, PDO::PARAM_INT);
를 문제입니다 :
$teacher_id = array_search($_POST['teacherName'], $acronyms);
바인드 명령 후 간다 : 당신의 지시가 왜
'LIMIT 1'은 무엇을위한 것입니까? 같은 이드를 가진 선생님이 한 명 이상 있습니까? 그렇다면 왜 그것을 기본 키로 만들지 않았습니까? 그렇지 않으면; 하나 이상의 결과가 결코 없을 것입니다. –
사실, id는 기본 키입니다 :-) 나는 기본 키로 LIMIT 1이 함축되었음을 깨닫지 못했습니다. MySQL을 조금 빠르게하는 데 사용하는 경향이 있습니다. 즉, '히트'를 발견하면 즉시 멈 춥니 다.하지만이 경우 MySQL은 아마이 필드가 기본 키라는 것을 알고 있기 때문에 어쨌든 MySQL을 사용합니다. – Matherion
듣는 모든 것을 믿지 마십시오. MySQL은 여전히 그 한 행을 검색해야합니다. 기본 키인 경우 MySQL은 해당 식별자가있는 행이 두 개 이상 존재하지 않는다는 것을 깨닫기에 충분히 똑똑합니다. 당신은 벤치 마크를 할 수는 있지만 그것이 차이를 만든다고 생각하지 않습니다. –