2012-11-15 8 views
-1

어떤 이유로 든 올바르게 실행되지 않는다는 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); 

바인드 명령 후 간다 : 당신의 지시가 왜

+0

'LIMIT 1'은 무엇을위한 것입니까? 같은 이드를 가진 선생님이 한 명 이상 있습니까? 그렇다면 왜 그것을 기본 키로 만들지 않았습니까? 그렇지 않으면; 하나 이상의 결과가 결코 없을 것입니다. –

+0

사실, id는 기본 키입니다 :-) 나는 기본 키로 LIMIT 1이 함축되었음을 깨닫지 못했습니다. MySQL을 조금 빠르게하는 데 사용하는 경향이 있습니다. 즉, '히트'를 발견하면 즉시 멈 춥니 다.하지만이 경우 MySQL은 아마이 필드가 기본 키라는 것을 알고 있기 때문에 어쨌든 MySQL을 사용합니다. – Matherion

+0

듣는 모든 것을 믿지 마십시오. MySQL은 여전히 ​​그 한 행을 검색해야합니다. 기본 키인 경우 MySQL은 해당 식별자가있는 행이 두 개 이상 존재하지 않는다는 것을 깨닫기에 충분히 똑똑합니다. 당신은 벤치 마크를 할 수는 있지만 그것이 차이를 만든다고 생각하지 않습니다. –

답변

4

귀하의 진술은 실제로 ->execute()입니다.

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

그게 다, 고마워요 (편집 된 질문 참조). 미안하지만 투표 할 수는 없습니다 (평판이 너무 낮습니다). . . 하지만 정말 고마워요 !!! – Matherion

+0

@Matherion 당신은 대답을 받아 들일 수 있습니다. –

+0

@BerryLangerak 네,하지만 그는 그렇게하기 전에 잠시 기다려야 할 것입니다. –

0

이 궁금 해요.

+0

답변 해 주셔서 감사합니다. 그러나 이것이 해결책인지 여부는 확실하지 않습니다. 올라프의 대답과 편집 된 질문에 대한 내 의견을 참조하십시오. . . – Matherion

0

$_POST 매개 변수에서 값을 검색하기 전에 $teacher_id을 바인딩합니다. 그 후 bindParam()을 움직이면 작동 할 것입니다.

+0

답변 해 주셔서 감사합니다. 그러나, 내가 올바르게 이해한다면 (그리고 나는 잘못 이해했을 수도 있습니다) 변수를 바인딩 할 때 필요하지 않습니다. 바인딩시 값은 읽히지 않지만 조회가 실행될 때 값은 읽 t집니다. 그게 적어도 내가 생각한거야. 그렇지 않으면, bindValue보다 bindParam의 값은 무엇입니까? – Matherion

+0

네 말이 맞아. 나는 그걸 섞어. 혼란을 드려 죄송합니다. –