php - PDO binds n times same value with foreach -
i have function in php, should bind in mysql in statement many variables, in array. problem variable , key changing function bind last value n times.
i don't have idea problem...
here class method:
public function getotlistbyotnumbers($conditions){ $data_array = $conditions[search_ot]; # find last key (remove coma) $quantity = count($data_array); $marks = ''; # bind name string && rewriting value integer foreach ($data_array $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 ws_orders c_ot in (".$marks.") order c_int_id desc limit :first, :last "; $stmt = $this->pdo->prepare($sql); # bind n values // here problem var_dump($data_array); // var dump 1 foreach ($data_array $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 , return false } else { var_dump($stmt->errorinfo()); $this->debugquery($stmt); $stmt_result = false; } return $stmt_result; } here 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 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 ws_orders c_ot in ('2760650', '2760650') order c_int_id desc limit 0, 30 so doing wrong?
edit
so did ;) problem foreach
instead of:
foreach ($data_array $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:
($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 works, still don't know problem earlier foreach...
there difference between pdo::bindparam() , pdo::bindvalue(). pdo::bindparam binds reference, not value. when foreach process ends, $param reference last array value. in time of execute call binded references evaluated same value.
official pdo::bindparam documentation says:
unlike pdostatement::bindvalue(), variable bound reference , evaluated @ time pdostatement::execute() called.
if want bind values in foreach use pdo::bindvalue.
Comments
Post a Comment