"子查询返回超过1行"没有子查询MySQL?

时间:2017-10-11 15:56:29

标签: php mysql

我有一个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过滤了表格:

enter image description here

更新2:我缩小了发生此错误的实际MySQL查询:

UPDATE files
SET docViewed = '1'
WHERE fileloc = '30294/1492682311085.pdf'

1 个答案:

答案 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());
}
?>