CodeIgniter,显示从模型到视图的MySQL查询,最佳实践

时间:2016-01-27 22:46:45

标签: php mysql codeigniter model-view-controller

我有一个标准的应用程序,Controller从模型只有1行:

return $query->row();

,之后设置变量(Array)并将数据返回到某些View:

    $data['fname'] = $user->fname;
    $data['lname'] = $user->lname;
    $this->load->view('someView', $data);

,然后我从视图中获取它:

<?php echo $fname ; ?>
<?php echo $lname ; ?>

问题是这样,数据库可能有或不可能有结果。如果没有结果我会收到错误:

  

消息:尝试获取非对象的属性

我在修改Controller中的代码时解决了这个问题:

        $data['fname'] = $user['fname'];
        $data['lname'] = $user['lname'];

但是如果我这样做并且数据库表有结果,我会看到这个错误:

  

不能使用stdClass类型的对象作为数组

如何解决这个问题? 在这种情况下,最佳做法是什么? 我必须在Model中添加逻辑,如果数据库表中没有行,则返回一些属性,这些属性将为示例设置为NULL?

4 个答案:

答案 0 :(得分:0)

你好吗......? 阅读您的问题,我认为最好的办法是,如果您带来的对象包含数据,模型会实现一个条件......如果是这样,则从名为“results_ok”的模型中分配变量并根据不同的调用在同一视图中查看或使用变量“results_ok”执行条件并显示您想要的内容...

答案 1 :(得分:0)

您可以检查数据库中的结果是否与null不同。

if($user != null)
{
    $data['fname'] = $user->fname;
    $data['lname'] = $user->lname;
}

您收到的第一个错误是因为您尝试访问null的属性,这是没有意义的。你得到的第二个错误是因为你试图访问对象属性,就好像它是一个在你的情况下显然不是的数组。

答案 2 :(得分:0)

为什么不这样做:

return $query->row_array();
$data['user'] = $user;

并将其全部传递给视图?然后,您可以确定何时在视图中回显:

<!-- in view -->
<?= isset($user['fname']) ? $user['fname'] : 'No First Name Found';?>

答案 3 :(得分:0)

您可以考虑合并一个 $ displayName 变量,该变量将用作占位符,以告知用户是否未提供其完整名称。我们也可以仅接受名字作为显示目的的最小名称。

$data['fname'] = is_object($user) ? $user->fname : 'User';
$data['lname'] = is_object($user) ? $user->lname : '';
$data['displayName'] =  ($data['fname'] != '' && $data['lname'] != '') ? $data['fname'] . $data['lname'] : '(Enter your name)'; 
$this->load->view('someView', $data);
  • 默认 $ firstName 至&#34;用户&#34;如果没有提供。
  • 还添加一些错误处理以防止出现非对象错误。

CodeIgniter视图的不同方面可能需要使用 $ firstName ,而在标题或消息中,您可以使用 $ displayName 而不必每次都连接变量在视野中或担心它会丢失。

虽然当您的用户数据未正确完成时,最好在UI中抛出官方警报消息,而不是依赖于$ displayName。渲染完全不同的视图也是另一个合理的选择,特别是如果缺少视图所依赖的大量用户$数据。