我对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 var
中concat_ws
,或者删除所有$var
和bindParam
;数据库连接和数据库表都可以。
为什么这是错的?
如果我尝试将PDO与简单的UPDATE
查询一起使用,则无法使用concat_ws
。
答案 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抱怨第二个参数无效。您需要转义单引号,或使用双引号来包装查询。
因此你需要:
' , friends, $friend) WHERE nick = :mynick'
而不是让PHP插入它,正如@Ian Wood所说,以及您最近建议的注释掉的代码因此:
$friend
答案 1 :(得分:0)
concat_ws(',' , friends, $friend)
认为应该是
concat_ws(',' , friends, :friend)
但我会考虑改变你的架构。
只需要一张人员表和一张朋友表...将人员详细信息保存在人员表和朋友表中有两列'person_id'和'friend_id'只存储关联人员的ID - 您将获得更有用和可管理的数据。
很多人可以拥有很多朋友,你需要一个“多对多”的关系...