2012-03-05 72 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

從您的佔位符刪除引號。否則,它們被視爲字符串文字並直接插入。

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

並刪除陣列上的嵌套:

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

是一致的,我喜歡上佔位符數組鍵使用:

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

現在我得到$ st-> errorInfo()顯示沒有詳細錯誤消息:數組 ( [0] => HY093 [1] => [2] => ) – user121196 2012-03-05 19:42:25

+0

@ user121196我現在就看到它 - 當它應該是單個數組時,您有一個嵌套數組'$ data'。見上面的增加。 – 2012-03-05 19:45:14

+0

我已經花了將近12個小時來嘗試解決這個錯誤。謝謝你,@MichaelBerkowski! – IIllIIll 2015-10-18 22:36:58

1

你需要在sql和參數中定義你的數組,你缺少「:」。你也不需要兩個數組,只有一個。

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

查詢也不需要引號,因爲PDO已經知道這是一個參數

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

我相信實際工作與或使用':',即使它沒有記錄。 – 2012-03-05 19:38:35

+0

@Developer:我嘗試過:,它沒有區別..事實上,我用$ st-> bindParam(「:a」,「test」),它沒有任何區別... – user121196 2012-03-05 19:41:24

+0

你可能是正確的,我只是總是把它包括在內以保持一致 – Developer 2012-03-05 19:41:32

0

你是執行預先準備帶有指定佔位符的語句。因此,您需要從佔位符中刪除引號,否則它們將被視爲各個列的值並直接更新。

是一致的,我更喜歡用:上佔位符數組鍵:

$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());