Php 虽然正确地传递了POST变量,但使用Ajax时PDO更新失败

Php 虽然正确地传递了POST变量,但使用Ajax时PDO更新失败,php,ajax,pdo,Php,Ajax,Pdo,单独运行时,表单提交和数据库更新按需要执行。当使用ajax时,它会提交正确的POST变量,但我不知道如何修复PDO异常,因为它在不生成ajax POST时工作正常PDO和Ajax都是新功能。 <form id="privacy" action="privacy.php" method="post"> <input type="hidden" name="id" class="id" value="<?php echo $user->id; ?

单独运行时,表单提交和数据库更新按需要执行。当使用ajax时,它会提交正确的POST变量,但我不知道如何修复PDO异常,因为它在不生成ajax POST时工作正常PDO和Ajax都是新功能。

    <form id="privacy" action="privacy.php" method="post">
        <input type="hidden" name="id" class="id" value="<?php echo $user->id; ?>">
        <label>
            <input type="radio" name="name" class="name" value="private" />
            <img src="img/lock.png">
        </label>
        <label>
            <input type="radio" name="name" class="name" value="friends"/>
            <img src="img/friends.png">
        </label>
        <label>
            <input type="radio" name="name" class="name" value="fof"/>
            <img src="img/friends-of-friends.png">
        </label>
    </form>

    <script>
        $(function() {
        $("#privacy").change(function() {
            var name = $(".name:checked").val();
            var id = $(".id").val();
            $.ajax({
                type: "POST", 
                url: "privacy.php",  
                data: {"name":name, "id":id},  
                success: function() { 
                    alert("form submitted: "+ id +" name:" + name);
                    }
                });
             });
         });
    </script>
致命错误:未捕获PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解在C:\xampp2\htdocs\platform\library\library.php:151中第1行“id=”1”附近使用的正确语法 堆栈跟踪: 0 C:\xampp2\htdocs\platform\library\library.php(151):PDO->prepare('updateuser_pri…')) 1 C:\xampp2\htdocs\platform\privacy.php(24):DemoLib->privacy('1','private',NULL) 2{main} 在第151行的C:\xampp2\htdocs\platform\library\library.php中抛出


那么,如果在添加ajax post submit之前正确更新了错误,我怎么会在那里出错呢。我可以看到ajax正在传递post数据('1','private',NULll)。真糊涂

所以经过几天的研究,我终于找到了答案。仍然不知道问题是什么,但这是现在的工作代码。如前所述,除了“id”字段外,始终只有一个其他字段,但另一个字段是动态的。。。随着我进一步发展技能,我肯定会进一步修改它,以清理它并正确地构建它

    $(function() {
        $("#privacy").change(function() {
             var uname = $(".name:checked").val();
             var uid = $(".id").val();
        $.ajax({
            type: "POST", 
            url: "privacy.php",  
            data: {"name":uname, "uid":uid},  
            success: function() { 
                }
            });
       });
    });
还有处理

    $uid = $_POST['uid'];
    $sql = "UPDATE user_privacy";
        $data = array_filter($_POST);
        foreach ($data as $key => $value) {
            if($key != 'uid'){  
                $field = $key;
                $fieldValue = $value;
                $sql .= ' SET '. $key.' = :'.$key;
            }
        }
        $sql .= ' WHERE parentid = :uid';

        $query = $db->prepare($sql);
        $query->bindParam(':uid', $uid, PDO::PARAM_STR);
        $query->bindParam(':'.$field, $fieldValue, PDO::PARAM_STR);
        $query->execute();

$query->bindParam(':'.$key,$value,PDO::PARAM_STR)不应该出现吗
是否在foreach中?每次通过
foreach
循环都要添加
SET
WHERE
。开始时应该只有一个
集合
,结尾处应该有一个
集合,每个赋值之间应该有逗号。试着打印
$sql
,你会发现它有多错。循环完成后,你还使用了
$key
$value
。您需要在循环中使用
bindValue()
。@S.Dev除了post['id']之外,总是只有一个post变量。。。单选按钮。;)
    $uid = $_POST['uid'];
    $sql = "UPDATE user_privacy";
        $data = array_filter($_POST);
        foreach ($data as $key => $value) {
            if($key != 'uid'){  
                $field = $key;
                $fieldValue = $value;
                $sql .= ' SET '. $key.' = :'.$key;
            }
        }
        $sql .= ' WHERE parentid = :uid';

        $query = $db->prepare($sql);
        $query->bindParam(':uid', $uid, PDO::PARAM_STR);
        $query->bindParam(':'.$field, $fieldValue, PDO::PARAM_STR);
        $query->execute();