Php PDO与foreach绑定n倍相同的值
我在PHP中有一个函数,它应该在MySQL语句中绑定这么多变量,也就是在数组中。 我的问题是变量和键在变化,但函数只绑定最后的值n次 我不知道问题出在哪里 这是我的上课方法:Php PDO与foreach绑定n倍相同的值,php,binding,pdo,foreach,prepared-statement,Php,Binding,Pdo,Foreach,Prepared Statement,我在PHP中有一个函数,它应该在MySQL语句中绑定这么多变量,也就是在数组中。 我的问题是变量和键在变化,但函数只绑定最后的值n次 我不知道问题出在哪里 这是我的上课方法: public function getOtListByOtNumbers($conditions){ $data_array = $conditions[SEARCH_OT]; # To find last key (remove coma) $quantity = count($d
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;
}
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
}
以下是var dupms:
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;
}
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
}
变量转储1
变量转储2和3
来自此执行的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);
}
for($key\u number=0;$key\u number<$quantity+1;$key\u number++){
$key\u name='key'。$key\u编号;
$stmt->bindParam($key\u name,$data\u array[$key\u number],PDO::PARAM\u INT);
}
它是有效的,但我仍然不知道早期foreach的问题是什么…如果将变量作为引用传递,它对value很有效,但对key不起作用 示例:
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;
}
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
}
和之间有区别
PDO::bindParam
绑定引用,而不是值。当foreach进程结束时,$param
将引用最后一个数组值。在execute
调用时,所有绑定的引用都将被计算为相同的值
官方PDO::bindParam
文档说明:
与PDOStatement::bindValue()不同,变量被绑定为引用
并且将仅在执行PDOStatement::execute()时进行计算
打电话来
如果希望在
foreach
中绑定值,请使用PDO::bindValue
问题在于BindParam通过引用传递第二个值。PHP重用(或在本例中似乎重用)$param的地址,而不是实际值。
您的foreach可以使用:
$stmt->bindParam($key, $data_array[$key]);
这具有将数组的地址位置绑定到该键位置的效果,因此当sql执行时,它会获得正确的值
你可能想要:
$stmt->bindValue($key, $param);
它应该在foreach循环中而不是在execute语句中求值,并且是一个传递的值而不是地址位置。很好,你让它工作了!你应该回答这个问题并自己接受。这是一个建议的“结束”问题的方法。我只有不到10次重复,所以我不能在8小时前完成:)也许有人会描述foreach不工作的原因有一点帮助:-)不知道foreach的
-正如我看到问题时所想的,一定有关于$conditions
,也许它并不完全包含预期的内容。现在没有时间,虽然-sry$conditions
是多维数组,但我只使用其中的一个子数组,该数组的内容列在var dump 1中。每个循环中的数据都在变化(var dump 2和3清单),但bindParam没有看到它