我有一个标准的应用程序,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?
答案 0 :(得分:0)
答案 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);
CodeIgniter视图的不同方面可能需要使用 $ firstName ,而在标题或消息中,您可以使用 $ displayName 而不必每次都连接变量在视野中或担心它会丢失。
虽然当您的用户数据未正确完成时,最好在UI中抛出官方警报消息,而不是依赖于$ displayName。渲染完全不同的视图也是另一个合理的选择,特别是如果缺少视图所依赖的大量用户$数据。