尝试访问 null sql 错误类型值的数组偏移量

Trying to access array offset on value of type null sql error

提问人:Ryan 提问时间:5/11/2020 最后编辑:DharmanRyan 更新时间:5/11/2020 访问量:302

问:

我的表中有一个名为“已验证”的布尔列。我正在尝试检查 verified 是否等于 0 “false”,如果是,我想显示我的错误。下面是代码行

// If User Click the Login Button
if(isset($_POST['logbtn'])){
    $username = $_POST['username'];
    $password = $_POST['password'];
    $verified = "";

    $sql = "SELECT * FROM users WHERE verified=?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('b', $verified);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();
    $_SESSION['verified'] = $user['verified'];

    if($_SESSION['verified'] == 0){
        $errors['verified'] = "Please verify your Email";
    }

我没有检查列是否为 0,而是收到错误“尝试访问 null 类型值的数组偏移量”

PHP 会话 mysqli

评论

0赞 user1597430 5/11/2020
附带评论:你的SQL没有意义。您无法通过布尔标志“verified”加载所有用户来验证数据库中的特定用户。
0赞 Random Dude 5/11/2020
问题是您正在尝试将其中一个变量作为数组处理,当它的值为 null 时,您会收到以下错误消息:“尝试访问 null 类型值的数组偏移量”
0赞 Ryan 5/11/2020
好吧,与其降级我,不如详细说明并启发我如何解决这个问题?我最近才对编码产生了兴趣。
0赞 Ryan 5/11/2020
更新:我更改了' $sql = “SELECT * FROM users WHERE verified=?”;' to '$sql = “SELECT verified FROM users”;',现在它可以工作了,但是我收到错误“bind_param():变量数与预准备语句中的参数数不匹配。
0赞 Dharman 5/11/2020
您需要向我们显示完整的错误消息。正如之前有人说的,SQL意义不大,因为你选择的是随机行。如果要检查特定记录,则需要选择 where id=?和 verified=?。此外,mysqli 类型应该代替 .您没有发送二进制数据。sb

答:

-2赞 Josep Widtantio 5/11/2020 #1

你可以使用 所以如果值为 0 / null / 空字符串 / false ,它将返回 trueif (empty($_SESSION['verified']))$user['verified']

1赞 Dharman 5/11/2020 #2

您尚未向我们显示完整的错误消息,但很可能是没有从数据库返回的记录。您应该改为检查单个用户记录。

if (isset($_POST['logbtn'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $sql = "SELECT * FROM users WHERE username=?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($user = $result->fetch_assoc()) {
        $_SESSION['verified'] = $user['verified'];
    } else {
        // There is no such user in the database.
        $_SESSION['verified'] = false;
    }

    if (!$_SESSION['verified']) {
        $errors['verified'] = "Please verify your Email";
    }
}

我更改了您的 SQL 以获取仅与该用户名匹配的记录(假设它是唯一的用户标识符),然后我检查是否从数据库中获取了任何内容。我还更改了mysqli类型,因为在这种情况下您不应该使用二进制类型。s