PHP PDO INSERT不使用预准备语句

时间:2014-08-27 09:50:02

标签: php mysql pdo

我正在升级我的网站以使用PDO。大多数代码都运行正常,但我有一个INSERT语句,我无法工作。它适用于我的本地服务器,但不适用于实际站点。我检查了表结构,它们完全相同。

这是我的代码

try {

    foreach ($unique_product_line_ids AS $key => $value) {

        $query_insertSQL = "
            INSERT INTO tblCarts (
            date_created
            , session_id
            , product_line_id
            , posted_by_id
            , quantity
            ) VALUES (
              :date_created
            , :session_id
            , :product_line_id
            , :posted_by_id
            , :quantity1
            )
            ON DUPLICATE KEY UPDATE quantity = :quantity2
                    ";
        $insertSQL = $conn->prepare($query_insertSQL);

        $insertSQL->execute(array(
            ':date_created'=>$date_created
            , ':session_id'=>$session_id
            , ':product_line_id'=>$key
            , ':posted_by_id'=>$_SESSION['member']['individual_id']
            , ':quantity1'=>$value
            , ':quantity2'=>$value
        ));

        $rc_insertSQL = $insertSQL->rowCount();

        // close connection
        $insertSQL->closeCursor();

    }

} catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
}

我检查了unique_product_line_ids数组中的值,它们确实存在。我也尝试删除ON DUPLICATE KEY UPDATE行(及其相应的参数),但没有区别。

我花了好几个小时试图消除潜在的原因,并且没有成功地隔离问题。非常感谢任何帮助或指针。

由于

1 个答案:

答案 0 :(得分:3)

准备好的陈述的一个优点是你准备一次并执行多次,所以 我会像这样重新制作你的代码:

try {

    $totalInserts = 0;

    $query_insertSQL = 
    "
        INSERT INTO tblCarts (
              date_created
            , session_id
            , product_line_id
            , posted_by_id
            , quantity
        ) 
        VALUES (
              :date_created
            , :session_id
            , :product_line_id
            , :posted_by_id
            , :quantity
        )
        ON DUPLICATE KEY UPDATE 
            quantity = :quantity
    ";

    $insertSQL = $conn->prepare($query_insertSQL);


    foreach ($unique_product_line_ids AS $key => $value) 
    {
        $insertSQL->execute(array(
              ':date_created'   => $date_created
            , ':session_id'     => $session_id
            , ':product_line_id'=> $key
            , ':posted_by_id'   => $_SESSION['member']['individual_id']
            , ':quantity'       => $value
        ));

        $totalInserts += $insertSQL->rowCount();

        /**
         * to debug if any error
         */
        var_export($conn->errorInfo());

        // close connection - does not need anymore while you don't 
        // prepare it multiple times
        //$insertSQL->closeCursor();

    }

} 
catch(PDOException $e) 
{
    echo 'ERROR: ' . $e->getMessage();
}


备注:

您可以根据需要多次使用一个变量, 所以在它们不同之前不需要使用:quantity1:quantity2:quantity就足够了。

要调试是否有错误,您可以使用$conn->errorInfo();(连接级别)或$insertSQL->errorInfo();(查询级别)