我在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转储1
array (size=2)
0 => string '2761531'
1 => string '2760650'
var转储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 ($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的问题是什么。。。
PDO::bindParam()
和PDO::bindValue()
之间存在差异。PDO::bindParam
绑定引用,而不是值。foreach进程结束时,$param
将引用最后一个数组值。在execute
调用时,所有绑定的引用都将被评估为相同的值。
PDO::bindParam
官方文件中写道:
与PDOStatement::bindValue()不同,变量被绑定为引用并且仅在PDOState::execute()为呼叫。
如果要在foreach
中使用绑定值,请使用PDO::bindValue
。
如果您将变量作为引用传递,它对值来说很好,但对键来说不好。
示例:
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
}
$stmt->bindParam($key, $data_array[$key]);
这具有将数组的地址位置绑定到该键位置的效果,因此当您的sql执行时,它会获得正确的值。
你可能想要:
$stmt->bindValue($key, $param);
它应该在foreach循环中而不是在execute语句中求值,并且是一个传递值而不是地址位置。