【问题标题】:CodeIgniter, display MySQL query from Model to View, best practiceCodeIgniter,显示从模型到视图的 MySQL 查询,最佳实践
【发布时间】:2016-01-27 22:46:45
【问题描述】:

我有控制器从模型中获取的标准应用程序只有 1 行:

return $query->row();

,然后设置变量(数组)并将数据返回到某个视图:

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

,然后我从视图中得到它:

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

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

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

我在更改控制器中的代码时解决了这个问题:

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

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

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

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

【问题讨论】:

    标签: php mysql codeigniter model-view-controller


    【解决方案1】:

    为什么不直接做:

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

    并将其全部传递给视图?然后就可以决定什么时候在视图中回显:

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

    【讨论】:

    • 这也是另一种解决方案。但是这样我必须在视图中添加逻辑,对吧?
    • Presentation logic 我觉得一般认为还可以
    • 返回 $query->row_array();我不需要检查它是否设置,如果查询为空则为NULL。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 如果fnamelname 未定义,他仍然会遇到问题。
      • 如果它作为一个字段存在于数据库中,它将被定义。也许是空的,但已定义。我猜他知道他在数据库中有哪些字段。整个事情的重点是识别数据库是否返回任何内容。
      • 但是您正在检查对象$user 是否为空,例如假设他的查询返回至少一个字段fname,那么您的代码将尝试分配未定义的属性。另一种方法是检查每个字段,即if(! isset($user-&gt;fname) 等...
      • 这 1 几乎是解决方案,因为我需要为我的所有模型都这样做,而且我还有另一个表。问题是我不知道表中是否存在。它就像网站,您可以在其中添加“关于我”的信息,或者您不想添加它。另一种解决方案是为每个表添加行,默认为空字段,但表太多。这种情况必须有标准的解决方案。
      • 如果$usernull 不同,并且如果他从中读取数据的表有一个名为fname 的列,那么他将不会访问(不按您所说的分配)未定义的属性.我再说一遍,他知道$user 对象将基于他的数据库具有哪些属性。编辑:您可以使用property_exists 函数检查属性是否存在
      【解决方案4】:

      您可以考虑合并一个 $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 为“用户”。
      • 还添加了一些错误处理以防止非对象错误。

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

      虽然当您的用户数据未正确完成时,最好在 UI 中抛出官方警报消息,而不是依赖 $displayName。渲染一个完全不同的视图也是另一个明智的选择,尤其是在视图所依赖的大量用户 $data 丢失的情况下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-23
        • 2011-09-16
        • 2011-04-08
        • 2010-11-16
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多