为啥我的 foreach 循环与 users.json 文件中的键不匹配

Posted

技术标签:

【中文标题】为啥我的 foreach 循环与 users.json 文件中的键不匹配【英文标题】:Why is my foreach loop not matching the keys in users.json file为什么我的 foreach 循环与 users.json 文件中的键不匹配 【发布时间】:2020-01-25 09:01:35 【问题描述】:

我正在尝试使用 php 和 JSON(无数据库)设置登录脚本,但我一直有这个错误

警告:使用未定义的常量电子邮件 - 假定为“电子邮件”(这将 在 PHP 的未来版本中抛出错误) C:\xampp\htdocs\networth-app\index.php 在第 37 行

注意:数组到字符串的转换 C:\xampp\htdocs\networth-app\index.php 在第 37 行

警告:使用未定义的常量电子邮件 - 假定为“电子邮件”(这将 在 PHP 的未来版本中抛出错误) C:\xampp\htdocs\networth-app\index.php 在第 37 行


    <?php
    session_start();
    $msg = '';

    /* Trigger when the login btn is clicked */
    if (isset($_POST['log'])) 

        /* Fetch users.json file */
        $data = json_decode(file_get_contents("users.json"), true);

        /* Get form data */
        $email = $_POST['email'];
        $pwd = $_POST['password'];

        /* Form validation */
        if (empty($email || $pwd)) 
            $msg = 'Please fill in all fields';
         elseif (strlen($pwd) < 5) 
            $msg = 'Password must be more than 5 charcter.';
         else 
            /* loop through the users.json data */
            foreach ($data as $user) 
                /* Login the user */
                if ($email === $user['Email'] && $pwd === $user['Password']) 
                    $_SESSION['Name'] = $user['Name'];
                    header('location: home.php');
                    exit;
                
            
        
    

    ?>

users.json


    "users": [
        
            "Name": "Frank Spencer",
            "Email": "fraspecx@mail.com",
            "Password": "test"
        ,
        
            "Name": "Guy Daniel",
            "Email": "guyb@gmail.com",
            "Password": "test1"
        
    ],
    "user": null

我希望能够登录到我的 home.php 并回显会话名称

【问题讨论】:

你应该提供你的 json 对象 好的@MorganFreeFarm 【参考方案1】:

它的


    "users": [
        
            "Name": "Frank Spencer",

所以你可以像这样访问它:

foreach ($data['users'] as $user) 

【讨论】:

【参考方案2】:

首先,你错误的使用了json数据。

只需查看 foreach 循环中的 $user 变量即可。

您错误地使用它,因为您在其上附加了某种电子邮件常量(带有点 (.)),从逻辑上讲,该常量在您的文件中不存在。

你应该有类似的东西(当然要检查“电子邮件”或“密码”数组键是否正确写入):

if ($email === $user["Email"] && $pwd === $user["Password"]) 

【讨论】:

我这样做了,但我仍然有 【参考方案3】:

当你解码 user.json 时,它会转换为数组,所以如果你想直接访问任何数组键只需要像 $user['Email'] 而不是 $user.Email 那样编写,并且还要更改$user.Password 到 $user['Password'] 所以你需要像这样更新你的foreach

foreach ($data as $users) 
    foreach ($users as $user) 
        if(isset($user['Email'],$user['Password'])) 
            if ($email === $user['Email'] && $pwd === $user['Password']) 
                $_SESSION['Name'] = $user['Name'];
                header('location: home.php');
                exit;
            
        
    

因为您正在尝试直接获取电子邮件索引

【讨论】:

我这样做了,但我仍然有

以上是关于为啥我的 foreach 循环与 users.json 文件中的键不匹配的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 foreach 比我的 for 循环快? [复制]

为啥我的委托只使用我的 foreach 循环中的最后一项?

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]

为啥在foreach循环中不能修改值类型实例

为啥 for-each 循环适用于数组? (爪哇)