我有一个webapp,当点击文档的链接时,会调用一个PHP脚本来更新"已查看" DB中文档的状态。这是点击发生时调用的脚本:
<?php
include '../../variables.php';
// The document that is passed through POST
$document = $_POST['document'];
$conn = new mysqli($dbhost, $dbuser, $dbpassword, $db);
if (!$conn){
die('Could not connect to db: '.mysqli_error($conn));
}
$sql = "UPDATE files
SET docViewed = '1'
WHERE fileloc = '$document'";
$query = mysqli_query($conn, $sql);
if (!$query){
die('Could not update docViewed: '.mysqli_error($conn));
}
?>
正如您所看到的,我在MySQL查询中没有子查询来更新我想要的字段,但我仍然收到此错误:
无法更新docViewed:子查询返回超过1行
我尝试过追加查询:
"...
WHERE fileloc = '$document'
LIMIT 1";
但是,我仍然得到相同的结果。
要明确,每个$document
必须在数据库中是唯一的,因此没有重复的条目。
更新:此帖子不是建议帖子的副本,因为该OP正在使用子查询。在这个例子中,我没有在任何地方使用子查询。
这是我使用的files
表的结构。另外为了显示$document
没有重复,我使用fileloc
30294/1506012960606.pdf
过滤了表格:
更新2:我缩小了发生此错误的实际MySQL查询:
UPDATE files
SET docViewed = '1'
WHERE fileloc = '30294/1492682311085.pdf'
答案 0 :(得分:1)
这不会改变太多,但可以添加更多日志记录点,以深入了解问题所在。我将你的mysqli用法更新为面向对象的方法,以及使用预准备语句参数化查询(总是很好,以避免sql注入,但在这种情况下更实用,因为它允许我们在几个步骤中测试查询)。
<?php
try {
include '../../variables.php';
// The document that is passed through POST
$document = filter_input(INPUT_POST, 'document', FILTER_SANITIZE_STRING);
$conn = new mysqli($dbhost, $dbuser, $dbpassword, $db);
if ($conn->connect_error){
throw new Exception("({$conn->errno}) {$conn->error}");
}
$sql = "UPDATE files
SET docViewed = '1'
WHERE fileloc = ?";
$stmt = $conn->prepare($sql);
if (!$stmt) {
throw new Exception("({$conn->errno}) {$conn->error}");
}
$stmt->bind_param('s', $document);
$exec = $stmt->execute();
if (!$exec) {
throw new Exception($stmt->error);
} else if ($stmt->affected_rows === 0) {
throw new Exception('No file location found');
}
} catch (Exception $e) {
error_log($e);
die($e->getMessage());
}
?>