php - "Warning: PDO::prepare() expects parameter 2 to be array, string given"- 当仅指定一个参数时

标签 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

我还尝试在 concat_ws 中隐藏 $fliend var,或者删除所有 $varbindParam >;数据库连接和数据库表都正常。

为什么会出错?

如果我尝试将 PDO 与简单的 UPDATE 查询一起使用,而不使用 concat_ws,它就可以工作。

最佳答案

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

我已重新格式化您的查询,希望使错误更加明显。

没看到吗?

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

问题在于您将 SQL 语句括在单引号中,但希望在查询中使用单引号。真正发生的情况是,您打破了引用的参数,向 PHP 传递了一个逗号,然后再次打开引用,导致两个参数传递给 prepare: 'UPDATE pinfo SETfriends =concat_ws(' 然后 ' , friend , $friend) WHERE nick = :mynick'.这就是 PHP 提示第二个参数无效的原因。您需要转义单引号,或使用双引号来包装查询。

因此您需要:

  1. 此处使用双引号,以避免转义(反斜杠可能会变得极其难看),并且
  2. 正确绑定(bind) $friend 而不是让 PHP 对其进行插值,正如 @Ian Wood 所指出的,以及您注释掉的代码最初建议的那样

因此:

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

关于php - "Warning: PDO::prepare() expects parameter 2 to be array, string given"- 当仅指定一个参数时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5962726/

相关文章:

php - 带有 Action 的表单内具有不同目标的按钮

PHP:遍历数组并将客户依次分配给用户

mysql - 按相反顺序选择小于日期的 x 条记录

php - 为什么构建 PDO 连接很慢?

mysql - golang - mysql 驱动 - 数据库函数

mysql - 使用MySQL 5.7 for MySQL Aurora实现RDS在不同区域之间的快速迁移

php - 用户 'mysqlRoot' @'iis1.richware.net' 的访问被拒绝(使用密码 : YES)

php - 如何在Azure webapp的子文件夹中托管WordPress博客?

php - 如何处理其他 try catch block 中的异常?

php - 用 php 或 javascript 替换 Img 位置/src?