将多个列绑定到PDO中的一个变量

时间:2011-11-18 17:50:30

标签: php pdo

我将网站移至新服务器并发现了奇怪的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列获得$dateactive一无所获 如果我改变它们active = :date, time = :date那么反之亦然。只有第一列接收变量。其他人一无所获。

可以做什么,让它将两个:date绑定到两列?没有重复:date1 :date2

2 个答案:

答案 0 :(得分:2)

您必须将所有参数命名并匹配到它们的值,因此您必须使用您所说的内容::date2并确保绑定它们,这样您最终会得到它们三个bindParam语句。

见这里:https://bugs.php.net/bug.php?id=33886

::这是一个可移植性的问题(只是为了分享)

[编辑/追加] :: 我想建议一个更好的练习,虽然在开始时它可能看起来很多工作:你为什么不使用stored procedures?检查一下: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();

但这只是一个建议。 :)

答案 1 :(得分:0)

根据PHP,bindParam的第二个参数是混合的,也许你可以试试这个:

$date = array();
$q->bindParam(':date', $date);