-1

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

这就是问题所在:两个非 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
4

1 回答 1

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 。

于 2013-07-03T23:01:01.510 回答