“警告:PDO :: prepare()期望参数2为数组,字符串给出” - 当只指定了一个参数时

时间:2011-05-11 10:24:14

标签: php mysql pdo

我对PDO和MySQL查询不是很有经验..

看看这个功能:

function add($mynick, $friend) {
   $dbh = new PDO(DSN,USERNAME,PASSWORD);
   $sth = $dbh->prepare('UPDATE pinfo SET friends=concat_ws(',' , friends, $friend)  WHERE nick = :mynick');
   $sth->bindParam(':mynick', $mynick);
   //$sth->bindParam(':friend', $friend);
   $sth->execute(); 
}

此功能无效:

Warning: PDO::prepare() expects parameter 2 to be array, string given in /test5.php 
Fatal error: Call to a member function bindParam() on a non-object in /test5.php

我试图在$fliend varconcat_ws,或者删除所有$varbindParam;数据库连接和数据库表都可以。

为什么这是错的?

如果我尝试将PDO与简单的UPDATE查询一起使用,则无法使用concat_ws

2 个答案:

答案 0 :(得分:3)

$sth = $dbh->prepare('
     UPDATE pinfo 
        SET friends=concat_ws(',' , friends, $friend) 
      WHERE nick = :mynick
');

我重新格式化了您的查询,希望能让错误更明显。

不明白吗?

查看SO提供的语法高亮显示。看看SET中的逗号是黑色的吗?

问题是您将SQL语句括在单引号中,但希望在查询中使用单引号。真正发生的事情是你突破引用的参数,向PHP传递一个逗号,然后再次打开引用,导致两个参数传递给prepare'UPDATE pinfo SET friends=concat_ws('然后{{1} }。这就是为什么PHP抱怨第二个参数无效。您需要转义单引号,或使用双引号来包装查询。

因此你需要:

  1. 在这里使用双引号,以避免转义(反斜杠可能会非常丑陋),
  2. 正确绑定' , friends, $friend) WHERE nick = :mynick'而不是让PHP插入它,正如@Ian Wood所说,以及您最近建议的注释掉的代码
  3. 因此:

    $friend

答案 1 :(得分:0)

concat_ws(',' , friends, $friend)

认为应该是

concat_ws(',' , friends, :friend)

但我会考虑改变你的架构。

只需要一张人员表和一张朋友表...将人员详细信息保存在人员表和朋友表中有两列'person_id'和'friend_id'只存储关联人员的ID - 您将获得更有用和可管理的数据。

很多人可以拥有很多朋友,你需要一个“多对多”的关系...