PDO从先前选择插入的绑定参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDO从先前选择插入的绑定参数相关的知识,希望对你有一定的参考价值。

执行以下脚本时,我的INSERT中出现错误,表示参数号无效:没有绑定任何参数。

如果我根据之前选择的值手动运行插入,那就没关系。我知道语法和关系都没问题。我的问题是我如何绑定参数或调用执行。

同样,这个脚本的第一部分返回它需要的所有内容,但是我的问题发生在我的insert语句中,特别是在调用insert语句后出错。

也许这仍然是我缺乏PDO的经验,但从我的文档来看,这似乎应该有效。

$order_ids = [];
while ($row = $ordStat->fetch(PDO::FETCH_ASSOC)) {
    $order_ids[] = $row['order_id'];
}
if (count($order_ids) > 0) {
    $placeholders = implode(',', array_fill(0, count($order_ids), '?'));
    $detailStatCheck = "
        SELECT 
             invnoc as INVOICE,
             fstatc as STATUS,
             cstnoc AS DEALER,
             framec AS FRAME,
             covr1c AS COVER,
             colr1c AS COLOR ,
             extd2d AS SHIPDATE,
             orqtyc AS QUANTITY
        FROM GPORPCFL
        WHERE invnoc IN ($placeholders)
    ";
    try {
        $detailCheck = $DB2conn->prepare($detailStatCheck);
        $detailRslt = $detailCheck->execute($order_ids);


        $count2 = $detailCheck->fetch();
        print_r($order_ids);
        print_r($count2);
    } catch(PDOException $ex) {
        echo "QUERY FAILED!: " .$ex->getMessage();
    }

    while ($row2 = $detailCheck->fetch(PDO::FETCH_ASSOC)){

        $insertPlacement = "
            INSERT INTO placements_new (sku_id, group_id, dealer_id, start_date, expire_date, locations, order_num)
                SELECT 
                     id, 
                     sku_group_id, 
                     :DEALER, 
                     DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 7 DAY) as start_date,
                     DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 127 DAY) as expire_date, 
                     :QUANTITY,
                     :INVOICE  
                FROM skus s
            WHERE  s.frame=:FRAME AND s.cover1=:COVER AND s.color1=:COLOR
        ";
        try{
            $insert = $mysqlConn->prepare($insertPlacement);
            $insertRslt = $insert->execute();
        }catch(PDOException $ex){
            echo "QUERY FAILED!!!: " . $ex->getMessage();
        }

    }
}
答案

您需要实际绑定参数(错误在这里很有用:invalid parameter number: no parameters were bound)。您需要将包含要分配给每个参数的值的数组传递给execute()

$values = [
    ":DEALER" => $row2["DEALER"],
    ":SHIPDATE" => $row2["SHIPDATE"],
    ":QUANTITY" => $row2["QUANTITY"],
    ":INVOICE" => $row2["INVOICE"],
    ":FRAME" => $row2["FRAME"],
    ":COVER" => $row2["COVER"],
    ":COLOR" => $row2["COLOR"],
];

然后

$insertRslt = $insert->execute($values);

请注意,如果您将ATTR_EMULATE_PREPARES设置为false,则不能使用两个(或更多)次命名参数,因此您需要将:SHIPDATE作为:SHIPDATE:SHIPDATE2以及$values数组中的相应附加值。

以上是关于PDO从先前选择插入的绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

Pdo - 将值插入数据库错误 SQLSTATE [HY093] [重复]

PDO:显示表键无法正确绑定参数[重复]

PDO 案例存在不适用于绑定参数

如何将 ISO8601 TSQL DATETIME 参数与 PDO 绑定?

了解 PDO 准备好的语句和绑定参数

DB2 根据 php 脚本中的绑定参数选择和插入