我对 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
,或者删除所有 $var
和 bindParam
>;数据库连接和数据库表都正常。
为什么会出错?
如果我尝试将 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 提示第二个参数无效的原因。您需要转义单引号,或使用双引号来包装查询。
因此您需要:
- 此处使用双引号,以避免转义(反斜杠可能会变得极其难看),并且
- 正确绑定(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/