Php PDO更新查询在所有列上推送提交输入值

Php PDO更新查询在所有列上推送提交输入值,php,pdo,Php,Pdo,我有一个PDO更新查询,它获取$_POST(或任何其他键值数组),并根据给定的输入编写更新查询 我有一个exclude数组,可以指定不包含在SQL查询中的键,例如表单的submit键和值(在本例中是action_update_survey) 我通过foreach遍历数组来创建SQL查询,首先创建查询并插入参数占位符,然后将参数绑定到查询中的参数占位符 这是我的密码: function save_survey($post){ global $pdo;

我有一个PDO更新查询,它获取$_POST(或任何其他键值数组),并根据给定的输入编写更新查询

我有一个exclude数组,可以指定不包含在SQL查询中的键,例如表单的submit键和值(在本例中是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();
    }
在post之后执行我的函数后,数据库中的所有文本列都被设置为值“Save”,这是提交输入的值,名称为*action\u update\u 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”来执行查询。

好吧,在阅读了你一半的帖子之后,我可以告诉你你所做的是错的。你正在使用
global
这一事实足以证明你放弃了你的方法。这是怎么回事?假设我的$pdo对象是正确的,我总是使用一个全局变量将我的对象传递给我的函数,没有任何问题。但是,相信我。永远不要使用Globals,就是这样!我总是忘记检查我的值是否通过引用传递。所以我假设第二个循环中的$value变量无限期地设置为第一个循环中传递的最后一个值,即“Save”。这是因为foreach循环的key=>value格式也使用了引用吗?$key和$value仅在各自的循环中可用,如果不对它们使用相同的内存分配,则会浪费资源。我对php的内部知识不是很了解,但我会这样做。