我在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;
}
以下是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查询
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
那么我做错了什么?
修改
所以我做到了;) 问题在于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
}
我给:
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);
}
它有效,但我仍然不知道早期的foreach问题是什么......
答案 0 :(得分:3)
PDO::bindParam()
和PDO::bindValue()
之间存在差异。 PDO::bindParam
绑定参考,而不是值。当foreach进程结束时,$param
将引用最后一个数组值。在execute
调用时,所有绑定的引用都将被评估为相同的值。
官方PDO::bindParam
文件说:
与PDOStatement :: bindValue()不同,该变量被绑定为引用 并且只会在PDOStatement :: execute()的时候进行评估 调用。
如果您希望foreach
中的绑定值使用PDO::bindValue
。
答案 1 :(得分:0)
如果您将变量作为参考传递,它将适用于值,但不适用于密钥。
示例:强>
foreach ($data_array as $key => &$param) {
$key_number = $key + 1; //this won't work
$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
}
答案 2 :(得分:0)
问题是BindParam通过引用传递第二个值。 PHP重用(或在这种情况下似乎)$ param的地址,而不是实际值。 你的foreach本可以使用:
$stmt->bindParam($key, $data_array[$key]);
这具有在该密钥位置绑定数组的地址位置的效果,因此当您的sql执行时,它将获得正确的值。
你可能想要:
$stmt->bindValue($key, $param);
应该在foreach循环中而不是在execute语句中进行求值,并且是传递的值而不是地址位置。