PDO 使用 foreach 绑定 n 次相同的值

tom*_*ozo 2 php foreach binding pdo prepared-statement

我在 PHP 中有一个函数,它应该在 MySQL IN 语句中绑定这么多变量,即数组中的变量。我的问题是变量和键正在更改,但函数仅绑定最后一个值 n 次。

我不知道问题出在哪里...

这是我的类方法:

public function getOtListByOtNumbers($conditions){
        $data_array = $conditions[SEARCH_OT];
    # To find last key (remove coma)
        $quantity = count($data_array);
        $marks = '';
    # Bind name string && rewriting value as integer
        foreach ($data_array as $key => $value){
            $i = $key+1;
            if ($i == $quantity){
                $marks .= ':key'.$i;
            }
            else {
                $marks .= ':key'.$i.', ';
            }
        }
    # Query
        $sql="
        SELECT
            c_int_id,
            c_ot,
            c_tickets_amount,
            c_basket_value,
            c_person,
            c_company,
            c_city,
            c_package_number,
            c_delivery_method,
            c_ot_date,
            c_email,
            c_phone,
            c_comment,
            c_send
        FROM ws_orders
        WHERE c_ot IN (".$marks.")
        ORDER BY c_int_id DESC
        LIMIT :first, :last ";
        $stmt = $this->PDO->prepare($sql);

    # Bind n values
    // Here is a problem
        var_dump($data_array); // var dump 1
         foreach ($data_array as $key => $param){
            $key_number = $key +1;
            $key_name = 'key'.$key_number;
            $stmt->bindParam($key_name, $param, PDO::PARAM_INT);
            var_dump($key_name); // var dump 2
            var_dump($param); // var dump 3
        }

    # Bind limit values
        $stmt->bindParam('first', $conditions[OT_SEARCH_FIRST_ROW], PDO::PARAM_INT);
        $stmt->bindParam('last', $conditions[OT_SEARCH_ROW_LIMIT], PDO::PARAM_INT);

    # If executed return result
        if ($stmt->execute() != FALSE) {
            $stmt_result = $stmt->fetchAll();
            $stmt->closeCursor();
            var_dump($stmt_result); // var dump 4

    # If not executed print debug and return FALSE
        } else {
            var_dump($stmt->errorInfo());
            $this->debugQuery($stmt);
            $stmt_result = FALSE;
        }

        return $stmt_result;
    }
Run Code Online (Sandbox Code Playgroud)

这是 var dupm:

变量转储 1

array (size=2)
 0 => string '2761531'
 1 => string '2760650'
Run Code Online (Sandbox Code Playgroud)

变量转储 2 和 3

string 'key1' (length=4)

string '2761531'

string 'key2' (length=4)

string '2760650'
Run Code Online (Sandbox Code Playgroud)

此次执行的 SQL 查询

        SELECT
            c_int_id,
            c_ot,
            c_tickets_amount,
            c_basket_value,
            c_person,
            c_company,
            c_city,
            c_package_number,
            c_delivery_method,
            c_ot_date,
            c_email,
            c_phone,
            c_comment,
            c_send
        FROM ws_orders
        WHERE c_ot IN ('2760650', '2760650')
        ORDER BY c_int_id DESC
        LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)

那么我做错了什么?

编辑




所以我做到了;)问题出在 foreach 上

代替:

     foreach ($data_array as $key => $param){
        $key_number = $key +1;
        $key_name = 'key'.$key_number;
        $stmt->bindParam($key_name, $param, PDO::PARAM_INT);
        var_dump($key_name); // var dump 2
        var_dump($param); // var dump 3
    }
Run Code Online (Sandbox Code Playgroud)

我给:

        for ($key_number = 0; $key_number < $quantity + 1; $key_number++) {
            $key_name = 'key'.$key_number;
            $stmt->bindParam($key_name, $data_array[$key_number], PDO::PARAM_INT);
        }
Run Code Online (Sandbox Code Playgroud)

它有效,但我仍然不知道早期 foreach 的问题是什么......

Ale*_*ruk 5

PDO::bindParam()和之间是有区别的PDO::bindValue()PDO::bindParam 绑定引用,而不是值。当 foreach 进程结束时,$param将引用最后一个数组值。在调用时,execute所有绑定引用将被评估为相同的值。

官方PDO::bindParam文档说:

与 PDOStatement::bindValue() 不同,该变量被绑定为引用,并且仅在调用 PDOStatement::execute() 时才进行计算。

foreach如果您想使用绑定值PDO::bindValue