【问题标题】:PDO update fails with Ajax though POST vars are passed correctly尽管正确传递了 POST 变量,但 Ajax 的 PDO 更新失败
【发布时间】:2018-05-01 21:47:38
【问题描述】:

表单提交和数据库更新在独立时按需要执行。使用 ajax 时,它会提交正确的 POST 变量,但我最终会遇到一个 PDO 异常,我不明白如何修复,因为它在不发布 ajax 帖子时可以正常工作。 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>

更新功能

    public function Privacy($id,$name)
{

        // Building INSERT QUERY
        $sql = "UPDATE user_privacy";

        // keep only wanted fields (change this) to 'field' => value
        $data = array_filter($_POST);

        $id = $_POST['id'];
        $cols = array('id' => 'id','name' => 'name');

        $count = 0;
        $i = 0;

        foreach ($data as $key => $value) {
            if(array_key_exists($key, $cols) && $cols[$key] != 'id'){
                $sql .= ' SET ' . $cols[$key] . ' = :'. $cols[$key] . ' WHERE parent_id = :id';
                unset($data[$key]);
                $count = count($data);

            } else { 
                if($count !== 0){
                   $i++;
                   $sql .= " $key = '$value' ";
                   $sql .= $i == $count ? " " : " AND ";
                }

            }
        }
        $query = $this->db->prepare($sql);
        $query->bindParam("id", $id, PDO::PARAM_STR);
        $query->bindParam(':'.$key, $value, PDO::PARAM_STR);
        $query->execute();
}

   and the exception

致命错误:未捕获的 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('UPDATE user_pri...') 1 C:\xampp2\htdocs\platform\privacy.php(24): DemoLib->Privacy('1', 'private', NULL) 2 {主要} 在 151

行的 C:\xampp2\htdocs\platform\library\library.php 中抛出

那么,如果在我添加 ajax 发布提交之前正确更新,我怎么会有错误。我可以看到 ajax 正在传递帖子数据('1','private',NULll)。好迷茫!

【问题讨论】:

  • $query-&gt;bindParam(':'.$key, $value, PDO::PARAM_STR); 行不应该在 foreach 内吗?
  • 您每次都通过FOREACH 循环添加SETWHERE。应该只有一个 SET 开头,一个 WHERE 结尾,每个作业之间用逗号分隔。
  • 尝试打印$sql,你会发现它有多么错误。
  • 循环完成后,您还使用了$key$value。您需要在循环内使用bindValue()
  • @S.Dev 除了 post['id'] ... 单选按钮之外,总是只有一个 post var。 ;)

标签: php ajax pdo


【解决方案1】:

所以经过几天的努力,我终于弄明白了。仍然不知道问题是什么,但这是现在的工作代码。如前所述,除了“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();

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2018-06-19
    • 2019-06-06
    • 1970-01-01
    • 2018-09-03
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多