2012-03-05 128 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());