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