我有一个PDO更新查询获取$_POST(或任何其他键值数组),并根据给定的输入写入UPDATE查询。
我有一个排除数组,我可以指定不包含在 SQL 查询中的键,例如提交键和表单的值(在本例中为 action_update_survey)。
我通过 foreach 遍历数组来创建 SQL 查询,首先创建查询并插入参数占位符,然后将参数绑定到查询中的参数占位符。
这是我的代码:
function save_survey($post){
global $pdo;
$exclude_names = array('action_update_survey');
$wp_userid = get_current_user_id();
$update_survey_query = "UPDATE kwc_surveysessions SET ";
foreach($post as $key=>$value){
if(!in_array($key, $exclude_names)) $update_survey_query .= $key." = :".$key.", ";
}
$update_survey_query = rtrim($update_survey_query, ", ")." WHERE wp_userid=:wp_userid";
$update_survey = $pdo->prepare($update_survey_query);
print_r($update_survey_query);
foreach($post as $key=>$value){
if(!in_array($key, $exclude_names)){
$update_survey->bindParam($key, $value);
}
}
$update_survey->bindParam("wp_userid", $wp_userid);
$update_survey->execute();
}
在帖子之后执行我的函数后,我数据库中的所有文本列都设置为值"Save",这是提交输入的值,名称为 *action_update_survey*,这很奇怪,因为它应该从分配键和值的两个 foreach 循环中排除。
在执行之前打印 PDO 查询显示我的查询中没有任何排除输入的设置:
UPDATE kwc_surveysessions SET s1q1 = :s1q1, s1q2 = :s1q2, s1q7 = :s1q7, s1q8 = :s1q8, s1q9 = :s1q9, s1q10 = :s1q10, s1q11 = :s1q11, s2q6 = :s2q6, s3q7 = :s3q7 WHERE wp_userid=:wp_userid
知道是什么导致提交输入将其值推送到我的所有字段中吗?
最可能的原因是 bindParam() 通过引用传递值。
尝试使用如下数组:
arr = array();
foreach($post as $key=>$value){
if(!in_array($key, $exclude_names)){
arr[$key] = $value;
}
}
$update_survey->execute($arr);
并使用"arr"执行查询。