php 尝试从数据库检索用户数据时获取未定义的变量

hivapdat  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(60)

我试图将数据从“user_app”表检索到视图页面中的表格形式中。
下面是我的Controller(方法):

public function getUserApps($email) {

        $userAppsModel = new UserApps($this->pdo);

        $apps = $userAppsModel->get($email);

        return $this->view('user/dashboard', ['apps' => $apps]);
    }

下面是我用来获取数据的方法:

public function get($email) {
        
        $sql = "SELECT * FROM $this->table WHERE email = :email";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindParam(':email', $email, PDO::PARAM_STR);
        $stmt->execute();
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
    
        return $user;
    }

这是我的视图页面(dashboard.php)第107行:

<h1>User List</h1>
        <table>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Email</th>
                <th>Role</th>
            </tr>
            
       

     **Line 107:**    <?php foreach ((array) $apps as $app) : ?>
            <tr>
                <td><?= $app['app_name'] ?></td>
                <td><?= $app['app_desc'] ?></td>
                <td><?= $app['app_cat'] ?></td>
            </tr>
            <?php endforeach; ?>

        </table>

我的view()方法:

protected function view($filename, $data = []) { 
    if (file_exists('../view/' . $filename . '.php')) { 
        require_once '../view/' . $filename . '.php';  
    }
}

获取错误:警告:C:\xampp\htdocs\xxxxxx\view\user\dashboard中未定义的变量$apps。php在线107

uqjltbpv

uqjltbpv1#

您的view()方法没有extract()执行$data参数,因此$data['apps']对您的视图不可用。
require转换视图文件之前,您需要使用extract($data)

注意:extract()是一个危险的方法,不应该用于不可信的数据(例如来自$_GET$_POST),因为extract使数组键作为变量可用。
解决方案:

下面是使用extract重写的view()方法:

protected function view($filename, $data = []) { 
    if (file_exists('../view/' . $filename . '.php')) { 
        extract($data); // $data['apps'] is now exposed as $apps variable
        require_once '../view/' . $filename . '.php';
    }
}

但是,使用require_once可能会给您带来问题。如果一个视图要在同一个请求上显示两次,那么只有第一次调用view()才能做任何事情。将require_once替换为require

**无关建议:**我个人喜欢提前返回,而不是在if块中嵌套有意义的代码。我也喜欢明确的路径和类型。你可以忽略这个建议,但我个人会这样写方法:

protected function view(string $filename, array $data = []) { 
    $file_path = __DIR__.'/../view/'.$filename.'.php';
    if (!file_exists($file_path))return;
    
    extract($data); // expose each array key as a variable.
    require $file_path;
}

相关问题