尝试访问空值类型的数组偏移量(PHP)

4
问题已解决(在评论中)
我正在为学校做一个项目,但出现了这个错误:在这行代码上尝试访问类型为null的值的数组偏移量。
<div class="user-name"><?php echo $guests["firstName"] ?></div>

这段代码从数据库中检索信息。

foreach((array)$result as $guests)
        {
    ?>
    <div class="posts-container">
        <div class="post-header">
            <div class="user-details">
                <div class="user-name"><?php echo $guests["firstName"] ?></div>
                <div class="user-email"></div>
            </div>
            <div class="time"></div>
        </div>
        <div class="post-message">
            <h3></h3>
            <p></p>
        </div>
    </div>
    <?php } ?>

有人要求提供SQL代码和$result的类型/结构。 类型/结构: object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(9) ["lengths"]=> NULL ["num_rows"]=> int(5) ["type"]=> int(0) SQL/数据库:

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "guestbook";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT id, firstName, lastName, email, title, message, URL, showEmail, Date FROM guestbook";
$result = $conn->query($sql);

$conn->close();

1
如果你的数组是子数组,那么请使用foreach($result as $k => $guests)。 - Hammad Ahmed khan
1
请同时发布数组。但是@HammadAhmedkhan可能是正确的。 - Alexander Dobernig
你调试过代码吗?经常使用一些var_dump()可以帮助你看到正在发生什么。首先,使用var_dump($result)来查看你实际拥有的数据类型/结构,并与我们分享。 - berend
你的 $guest 值为 null。请参见 https://3v4l.org/oOXmO - Syscall
这个回答解决了您的问题吗?使用PHP出现了"Notice: Undefined variable", "Notice: Undefined index" 和 "Notice: Undefined offset"。 - Nico Haase
谢谢@HammadAhmedkhan,它可以工作了,不知道为什么,但它可以工作。 - Olaf van Gelder
3个回答

1

您正在尝试将null值作为数组访问。

在您的情况下,$guest的值为null。因此,访问$guest['something']将抛出一个"Notice: Trying to access array offset on value of type null"

两个建议:

  1. Check $guest value (quick) :

    foreach((array)$result as $guests)
    {
        if (!is_array($guests)) {
            continue;
        }
    
  2. Check $result value (better) :

    If $result is a result of a SQL query, maybe try to add conditions to avoid NULL results. Or, use array_filter() before to remove empty values.


第一种选项可以工作,但是foreach没有给出结果,第二种选项会出现错误:array_filter()期望参数1为数组,但给出的是对象。 - Olaf van Gelder

1
这是因为这一行。
$result = $conn->query($sql);

那不是你想要的,你需要像这样获取结果。
if ($result->num_rows > 0)
while($guest = $result->fetch_assoc()) {
{?>
    <div class="posts-container">
        <div class="post-header">
            <div class="user-details">
                <div class="user-name"><?php echo $guest["firstName"] ?></div>
                <div class="user-email"></div>
            </div>
            <div class="time"></div>
        </div>
        <div class="post-message">
            <h3></h3>
            <p></p>
        </div>
    </div>
<?php } ?>

最后一个错误已经消失了,但是现在我有一个新的错误:非法字符串偏移量'firstName'。 - Olaf van Gelder
它修复了错误,但我从数据库中没有得到任何东西,但它可以与其他解决方案一起工作,谢谢。 - Olaf van Gelder
如果我的回答对您有所帮助,我很高兴能为您服务。如果您愿意,请给我的回答点赞并选择它作为最佳答案。 - azibom

-1
你可以尝试这样做:
<?php
//Array to be shown
$guests = [
        ['firstName' => 'Alex', 'email' => 'user@user.ru'] ,
        ['firstName' => 'Jhon', 'email' => 'user@user.ru']
];
?>
<div class="posts-container">
    <div class="post-header">
        <div class="user-details">
        <!-- foreach alternate syntax -->
        <?foreach ($guests as $guest):?>
            <div class="user-name"><?=$guest['firstName']?></div>
            <div class="user-email"><?=$guest['email']?></div>
        <!-- foreach alternate syntax -->
        <?endforeach;?>
    </div>
    <div class="time"></div>
</div>
<div class="post-message">
    <h3></h3>
    <p></p>
</div>

请分享更多细节,以便他人可以从中学习。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接