PDO与foreach绑定n次相同的值 [英] PDO binds n times same value with foreach

查看:143
本文介绍了PDO与foreach绑定n次相同的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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



以下是我的课程方法:

  public function getOtListByOtNumbers($ conditions){
$ data_array = $ conditions [SEARCH_OT];
#查找最后一个键(删除昏迷)
$ quantity = count($ data_array);
$ marks ='';
#绑定名称字符串&&重写值为整数
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,:最后;
$ stmt = $ this-> PDO-> prepare($ sql);

#绑定n个值
//这是一个问题
var_dump($ data_array); // $ 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


绑定限制值
$ stmt-> bindParam('first',$ conditions [OT_SEARCH_FIRST_ROW],PDO :: PARAM_INT);
$ stmt-> bindParam('last',$ conditions [OT_SEARCH_ROW_LIMIT],PDO :: PARAM_INT);
$ b $如果执行返回结果
if($ stmt-> execute()!= FALSE){
$ stmt_result = $ stmt-> fetchAll();
$ stmt-> closeCursor();
var_dump($ stmt_result); // var dump 4

#如果未执行print debug并返回FALSE
} else {
var_dump($ stmt-> errorInfo());
$ this-> debugQuery($ stmt);
$ stmt_result = FALSE;
}

return $ stmt_result;

以下是var dupms:


$ b

var dump 1

  array(size = 2 )
0 =>字符串'2761531'
1 =>字符串'2760650'

var dump 2& 3

  string'key1'(length = 4)

string'2761531'

字符串'key2'(长度= 4)

字符串'2760650'

来自此执行的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
限制0,30

所以我在做什么错误?

编辑










所以我做到了)
问题是用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
}

我给:


($ key_number = 0; $ key_number <$ quantity + 1; $ key_number ++){
$ key_name ='key'。$ key_number;
$ b pre $
$ stmt-> bindParam($ key_name,$ data_array [$ key_number],PDO :: PARAM_INT);
}

它可以工作,但我仍然不知道问题所在之前的foreach ...

解决方案

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



官方 PDO :: bindParam 文档说:


与PDOStatement :: bindValue()不同,变量绑定为一个引用
,只会在PDOStatement :: execute()被
调用的时候评估。

如果要在 foreach中绑定值,请使用 PDO :: bindValue


I have function in PHP, which should bind in MySQL IN statement so many variables, that is in array. My problem is that variable and key is changing but function bind only last value n times.

I don't have idea where is the problem...

Here is my class method:

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;
    }

Here are var dupms:

var dump 1

array (size=2)
 0 => string '2761531'
 1 => string '2760650'

var dump 2 & 3

string 'key1' (length=4)

string '2761531'

string 'key2' (length=4)

string '2760650'

SQL query from this execution

        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

So what I am doing wrong?

EDIT




So i did it ;) The problem was with foreach

Instead of:

     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
    }

I give:

        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);
        }

And it works, but i still don't know what the problem was with earlier foreach...

解决方案

There is the difference between PDO::bindParam() and PDO::bindValue(). PDO::bindParam binds reference, not value. When foreach process ends, $param will reference to the last array value. In the time of execute call all binded references will be evaluated to same value.

Official PDO::bindParam documentation says:

Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

If you want bind values in foreach use PDO::bindValue.

这篇关于PDO与foreach绑定n次相同的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆