2012-03-05 3 views
2

다음 php pdo 코드를 사용하여 mysql 데이터베이스에 데이터를 삽입했지만 삽입 성공했습니다. 그러나 업데이트 된 데이터베이스는 문자열 리터럴 'a', 'b : 값' 각각 필드에서. 뭐가 문제 야?PHP pdo 바인드 매개 변수가 작동하지 않습니다.

 
$data = array(
    array('a' => 'John', 'b' => 'OK'), 

); 
    $st=$dbh->prepare("insert into mytable (a, b) values(':a', ':b')"); 
    $st->execute($data) or print_r($st->errorInfo()); 

답변

2

걸 알고 있기 때문에

$data = array(':a' => 'John', ':b' => 'OK'); 

쿼리는 따옴표가 필요하지 않습니다. 그렇지 않으면 문자열 리터럴로 간주되어 직접 삽입됩니다.

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 

그리고 어레이의 중첩을 제거 :

$data = array(':a' => 'John', ':b' => 'OK');  
+0

자세한 오류 메시지없이 표시되는 $ st-> errorInfo()가 표시됩니다. 배열 ( [0] => HY093 [1] => [2] => ) – user121196

+0

@ user121196 이제는 하나의 배열이되어야 할 때 중첩 배열'$ data'가 있습니다. 위의 추가 사항을 참조하십시오. –

+0

저는이 버그를 해결하기 위해 거의 12 시간을 보냈습니다. 고마워요, @MichaelBerkowski! – IIllIIll

1

sql과 매개 변수에서 배열을 동일하게 정의해야하는 경우 ":"이 누락됩니다. 또한 두 개의 배열은 필요 없으며 하나만 필요합니다. PDO는 이미 당신의 자리에서 따옴표를 제거 매개 변수

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 
$st->execute($data) or print_r($st->errorInfo()); 
+1

을 나는 실제로 일을 생각 문서화되어 있지 않더라도':'와 함께 또는 함께 사용한다. –

+0

@ 개발자 : 나는 시도했다 :, 그것은 차이를 만들지 않았다 .. 실제로 $ st-> bindParam (": a", "test")을 사용했지만, 어떤 차이도 만들지 않았다 ... – user121196

+0

You 맞을지도 모릅니다. 일관성을 유지하기 위해 항상 포함합니다. – Developer

0

당신은 준비를 실행됩니다 : 나는 자리 배열의 키에 :를 사용하는 것을 선호

// $data is an associative array, it should not contain another array! 
$data = array('a' => 'John', 'b' => 'OK'); 

이 일치하도록 성명서를 가진 성명서. 따라서 자리 표시 자의 따옴표를 제거해야합니다. 그렇지 않으면 각 열의 값으로 취급되어 직접 업데이트됩니다. 자리 표시 자 배열의 키에 :

일치하려면, 내가 사용하는 것을 선호

$data = array(':a' => 'John', ':b' => 'OK'); 

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 

또한 물음표 자리에 준비된 문을 실행할 수 있습니다

$data = array(
    array('John','OK'), 

); 
$st=$dbh->prepare("insert into mytable (a, b) values(?, ?)"); 
$st->execute($data) or print_r($st->errorInfo()); 
관련 문제