在PDO中将几列绑定到一个变量上

3

我将我的网站迁移到了新的服务器,发现PDO的行为很奇怪:

$q = $db->prepare("INSERT INTO tabel SET info = :info, time = :date, active = :date");
$q->bindParam(':info', $info);
$q->bindParam(':date', $date);
$q->execute();

只有time列得到了$date,而active没有得到任何内容。
如果我改变它们active = :date, time = :date,那么情况就反过来了。只有第一列接收变量。其他的什么也没有接收到。

如何做才能将绑定的一个:date发送到两个列中?而不是重复使用:date1 :date2

2个回答

2
您需要为所有参数命名并将它们与值匹配,所以您需要使用像您说的这样的东西::date2,并确保绑定它们,这样您就会得到三个bindParam语句。
请参见此处:https://bugs.php.net/bug.php?id=33886 :: 这是一个可移植性问题(只是分享)
[编辑/附加] :: 我想建议一种更好的做法,虽然一开始可能看起来很麻烦:为什么不使用存储过程?请查看此处:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html 这可以帮助您仅接受两个值作为参数,但在三个列更新中使用它们。以下是一个示例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertIntoTabel`
    (IN paramINFO VARCHAR(50), IN paramDATE DATETIME)
BEGIN
    INSERT INTO tabel 
    SET info = paramINFO
    , time = paramDATE
    , active = paramDATE;
END

然后将您的代码更改为:

$q = $db->prepare("CALL InsertIntoTabel (?,?)");
$q->bindParam(1, $info);
$q->bindParam(2, $date);
$q->execute();

这只是一个建议,不过。 :)

我看到了,它解释了一切。但是为什么大多数Web服务器都可以接受这个(我尝试了3个不同的服务器和我的本地服务器)? - Qiao
等一下..你的意思是在其他的Web服务器上,你能够将$date值绑定到多个参数吗?@Qiao :: 顺便说一句,我修改了我的帖子并分享了额外的信息。 - Nonym
是的,这是第一次(在不同的Web服务器上有4次)多重绑定不起作用。所以,我现在正在重写我的代码。 - Qiao

0
根据PHP,bindParam的第二个参数是mixed类型,你可以尝试这样做:
$date = array();
$q->bindParam(':date', $date);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接