如何使用PDO语句绑定for循环索引?

时间:2013-07-03 21:42:26

标签: php pdo

我有两个MySQL查询语句需要使用prepare和 BindParam。任何帮助表示赞赏。感谢。

问题在于: 两个非PDO语句都在for循环中,并且设置如下:

for ($i = 0; $i < $numItem; $i++) 
{
    // some codes…, then

    $sql = "SELECT pd_name, pd_qty, pd_type
            FROM ct_products 
            WHERE pd_id = ".$productId[$i]."";

            $result = dbQuery($sql);

    // Some more codes goes here, then.....the 2nd query

   $sql = "UPDATE ct_car
           SET ct_qty = $newQty
           WHERE ct_id = {$carId[$i]}";

           dbQuery($sql);

   // Some more code, some more codes goes here

   // end the for loop

现在,对于新的PDO语句,我想做类似的事情来替换上面for循环中的两个语句:

 // check stock
 $sql = "SELECT pd_name, pd_qty, pd_type
    FROM ct_products 
    WHERE pd_id = :productId[$i]";
try
{
     // Build the database statement
     $stmt = $this->_db->prepare($sql);
     $stmt->bindParam(":productId[$i]", $productId[$i], PDO::PARAM_INT);//not sure here
     $stmt->execute();

 // more code here....
 // more codes...


 // then the next sql pdo statement:

 // update 
 $sql = "UPDATE ct_car
        SET ct_qty = :newQty
        WHERE ct_id = {$carId[$i]}";
try
{
     // Build the database statement
     $stmt = $this->_db->prepare($sql);
     $stmt->bindParam(":newQty", $newQty, PDO::PARAM_INT);
     $stmt->bindParam(":cartId[$i]", $cartId[$i], PDO::PARAM_INT); // not sure here
     $stmt->execute();
     $count = $stmt->rowCount();

 //more codes....
 // code continues....

 //end for

1 个答案:

答案 0 :(得分:2)

查看http://php.net/manual/de/pdostatement.bindparam.php

占位符必须是字符串或?符号。 (但您不能将命名占位符与?占位符混合)

$sql = "SELECT pd_name, pd_qty, pd_type
    FROM ct_products 
    WHERE pd_id = :productId";

$stmt->bindParam(":productId", $productId[$i], PDO::PARAM_INT);

// update
$sql = "UPDATE ct_car
    SET ct_qty = :newQty
    WHERE ct_id = :cartId";

$stmt->bindParam(":newQty", $newQty, PDO::PARAM_INT);
$stmt->bindParam(":cartId", $cartId[$i], PDO::PARAM_INT);

PDO::PARAM_INT是正确的,如果它真的是一个整数值。如果您未设置,则默认值为PDO::PARAM_STR

另一件事:你可能会遇到bindParam的麻烦,因为变量被绑定为引用。在您的情况下,它应该无关紧要,因为您在绑定后立即运行execute。否则,请查看bindValue,您可以使用相同的方式。