【问题标题】:Convert old procedural PHP function into Model-View-Controller (MVC) in Codeigniter在 Codeigniter 中将旧的 PHP 程序函数转换为 Model-View-Controller (MVC)
【发布时间】:2015-09-21 05:34:21
【问题描述】:

我是 Model-View-Controller 的新手,我开始使用 Codeigniter 进行编码。我基本上是将我的项目转换为 MVC,但是,我遇到了这个函数(如下),我想将它拆分为 MVC。我有 100 多个这样的函数,如果我能找到最好的方法,我将能够自己将其余函数转换为 MVC。

这个函数集PHP、Mysql和HTML一切于一体。就像我们分别拆分查询和 HTML 一样,我也想使用 Codeingiter 框架来做到这一点。 就算你不能使用codeigniter默认函数来回答,也请告诉我如何拆分。

这里是:

 $fetch_projections = mysql_query("SELECT issue_id, emp_name, employeeId, sum(actualHoursPerDay) as ss FROM day_projections WHERE date = '$today' GROUP BY employeeId ORDER BY emp_name ASC");
    while ($r = mysql_fetch_array($fetch_projections)) {
        $maes_array[] = $r['issue_id'];
        $all_maes_for_emp = implode($maes_array);
        // echo $r['emp_name'] $r['ss'].'<br/>'; 

        $split_up_query = mysql_query("SELECT issue_id, actualHoursPerDay FROM day_projections WHERE date = '$today' AND emp_name = '" . $r['emp_name'] . "'");
        while ($t = mysql_fetch_array($split_up_query)) {
            $kk[] = $t['issue_id'] . ' = ' . $t['actualHoursPerDay'] . ' hrs';
        }
        $pp = implode(', ', $kk);
        $cap = round((((8 - $r['ss']) / 8) * 100), 2);
        echo '<tr><td>' . $r['emp_name'] . '</td><td>' . $cap . '%</td><td>' . $r['ss'] . ' hrs</td><td>' . $pp . '</td></tr>';
        unset($maes_array);
        unset($kk);
    }

谢谢

【问题讨论】:

    标签: php mysql codeigniter model-view-controller


    【解决方案1】:

    您的代码有点时髦,而且不是最佳的。您正在调用一个 sql 查询并在不需要的地方进行迭代。我要修复它是利用 MYSQL 的GROUP_CONCAT,然后使用 Codeigniter 将其全部转换为 MVC。这是我的方法:

    型号: application\models\My_model.php

    模型代表您的数据结构。通常你的模型 类将包含帮助您检索、插入和 更新数据库中的信息。

    class My_model extends CI_MODEL{
    
        function fetch_projections($today){
            $this->db->select("emp_name, sum(actualHoursPerDay) as ss, GROUP_CONCAT( issue_id,'=',actualHoursPerDay,'hrs' SEPARATOR ';') as pp");
            $this->db->from("day_projections");
            $this->db->where("date" , $today);
            $this->db->group_by("employeeId");
            $this->db->order_by("emp_name" , "asc");
            $query = $this->db->get();
            return $query->result();
        }
    
    }
    

    控制器: application\controllers\My_controller.php

    控制器充当模型、视图、 以及处理 HTTP 请求所需的任何其他资源 生成一个网页。

    class My_controller extends CI_Controller {
    
        function calculate() {
            $today = "0000-00-00"; // or whatever code you have to come up for "today"
            $this->load->model("My_model");
            $projections_results = $this->My_model->fetch_projections($today);
            if ($projections_results) {
                foreach ($projections_results as $projection) {
                    $projection->cap = round((((8 - $projection->ss) / 8) * 100), 2);
                }
            }
            $view_data["results"] = $projections_results;
            $this->load->view("my_view", $view_data);
        }
    
    }
    

    查看: application\views\my_view.php

    视图是呈现给用户的信息。一个看法 通常是网页,但在 CodeIgniter 中,视图也可以是 页面片段,如页眉或页脚。它也可以是一个 RSS 页面,或者 任何其他类型的“页面”。

    <table>
        <?php foreach ($results as $res) { ?>
            <tr>
                <td><?= $res->emp_name ?></td>
                <td><?= $res->cap ?>%</td>
                <td><?= $res->ss ?>hrs</td>
                <td><?= $res->pp ?></td>
            </tr>
        <?php } ?>
    </table>
    

    来源:http://www.codeigniter.com/userguide3/overview/mvc.html

    希望这会有所帮助。

    【讨论】:

    • 代码给了我零错误。在没有完整项目的情况下您可以理解我的部分代码并且能够如此完美地转换和运行它,这是非常值得赞赏的。非常感谢。
    • 我已经接受了答案。非常感谢您优化代码。只是一个与之相关的小问题,您使用了基于 codeigniter 的函数来运行查询。我们不能使用基于 mysql 或 mysqli 的传统查询吗?理解和应用这些功能很烦人。我的意思是,我可以用 1 或 2 行来编写查询,但是由于使用了 codeigniter,我正在编写更多额外的代码。还要告诉我们是否可以使用 mysqli_query 那么我们要给出的第一个参数的名称是什么?我知道 mysql_query 在 codeigniter 中已被弃用。
    • 是的,如果你愿意,你仍然可以写出普通的 mysql,你只需要使用 $this-&gt;db-&gt;query("SELECT * FROM whatever") 。但是我不会推荐它。由你决定,在这里查看codeigniter.com/user_guide/database/queries.html
    【解决方案2】:

    我假设您了解面向 Obect 的编程、php 5.5+ 和 Codeigniter v2+。 代码(下)展示了如何在 codeigniter 中实现 MVC。 在codeigniter框架下有很多文件夹,比如models、views、controllers ,config etc.put这些(下面的代码)提到。

    模型(数据库相关的东西/查询等)Example_model.php。 将此文件放在“应用程序/模型”文件夹下

    class Example_model extends CI_Model{
    
    function __construct() {
        parent::__construct();
    }
    
    public function getData($today=""){
    
    $query="SELECT issue_id, emp_name, employeeId, sum(actualHoursPerDay) as ss 
    FROM day_projections WHERE date = $today GROUP BY employeeId ORDER BY 
    emp_name ASC";
    
    $result=$this->db->query($query);
    
        if ($result->num_rows > 0) {
            foreach ($result->result() as $row) {
                $data[] = $row;
            }
    
            return $data;
        } else {
            return FALSE;
        }
    
    }
    
    
    }
    

    注意:您必须在项目目录的“application/config”文件夹中的 autoload.php 中自动加载“数据库”库,或者像这样在上面的构造函数中加载它。

     $this->load->library('database);
    

    Controller(帮助控制用户请求/数据流/路由等)Example.php,将此文件放在“application/controllers”下。

    class Example extends CI_Controller {
    
       function __construct() {
        parent::__construct();
    
      $this->load->model('Example_model');
    
       }
    
    
    public function index(){
    
    $today=now();
    $result=$this->Example_model->getData($today);
    
    $this->load->view('index_view',['result'=>$result]);
    
      }
    
    
      }
    

    查看(演示/用户可见页面等)index_view.php,将此文件放在“应用程序/视图”下。

    <body>
         <table>
               <tr>1</tr>
               <tr>2</tr>
    
               <?php   foreach($result as $r):    ?>
               <td><?=     $r->emp_name    ?></td>
    
               <?php      endforeach;     ?>
    
         </table>
    
    
    </body>
    

    注意:更多抽象信息。 http://www.codeigniter.com/userguide2/overview/at_a_glance.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多