php - CodeIgniter 自定义库未加载

标签 php codeigniter

我是 CodeIgniter 的新手,并试图用它开发一个相当简单的应用程序——只是一个表格来处理想要获得娱乐中心通行证的员工的注册。我正在尝试将事物分开以使它们更清洁。

这是代码:

应用程序/ Controller /reccenter.php

class RecCenter extends CI_Controller {

    public function register() {
        $data['title'] = "Utah Valley Rec Center Registration";

        $this->output->enable_profiler(TRUE); // Put all the debug statements at the bottom of the page
        $this->load->helper('html');

        $this->load->library('form_validation');
        $this->form_validation->set_rules('userRecCenter', 'recreation center selection', 'required');

        $userRecCenter = $this->input->post('userRecCenter');
        $registerSelf = $this->input->post('registerSelf');
        $dependents = $this->input->post('dependents');

        if($this->input->post('registerSelf') && !$registerSelf) { // Employee not registering themselves
            $this->form_validation->set_rules('dependents', 'self selection or dependents', 'required');
        } else if($this->input->post('dependents') && count($dependents) == 1 && $dependents[0] == "") { // Employee only registering themselves
            $this->form_validation->set_rules('registerSelf', 'self selection or dependents', 'required');
        }

        if ($this->form_validation->run() == FALSE) {
            $this->load->view('templates/header', $data);
            $this->load->view('pages/reccenter/register', $data);
            $this->load->view('templates/footer', $data);
        } else {
            $this->load->library('Reccenterdao');
            $numRows = $this->reccenterdao->getRecCenterInfo();
            var_dump($numRows);

            // Check if already registered 
                // Redirect to different view to change their registration

            // Do the registration
                //redirect('reccenter/confirm');
        }
    }

    public function confirm() {
        $data['title'] = "Utah Valley Rec Center Registration Confirmation";

        $this->load->view('templates/header', $data);
        $this->load->view('pages/reccenter/confirm', $data);
        $this->load->view('templates/footer', $data);
    }
}

应用程序/库/Reccenterdao.php
if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

class Reccenterdao {

    private $CI;

    public function __construct() { 
        $this->CI =& get_instance();
    }

    private function connect() {
        $this->CI->load->database();
    }

    private function disconnect() {
        $this->CI->db->close();
    }

    public function getRecCenterInfo() {
        $this->connect();

        var_dump("Made it here");
        $result = $CI->db->query("SELECT * FROM ucfitness");
        var_dump($result->result());

        $this->disconnect();
        return $result->num_rows();
    }


}

这里有几个额外的配置项,所以你知道我做了什么来定制它。

应用程序/配置/autoload.php
$autoload['helper'] = array('form', 'url');

webroot/index.php(用于环境定义)
if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == "my prod server") {
    define('ENVIRONMENT', 'prod');  
} else if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == "my stage server") {
    define('ENVIRONMENT', 'stage'); 
} else {
    define('ENVIRONMENT', 'test');  
}

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'test':
            error_reporting(E_ALL);
        break;

        case 'stage':
        case 'prod':
            error_reporting(0);
        break;

        default:
            exit('The application environment is not set correctly.');
    }
}

我也复制了application/config/database.php分为三个文件夹,application/config/test/database.php , application/config/stage/database.php , 和 application/config/prod/database.php , 配置各自的连接参数。每个环境都有不同的数据库服务器和凭据。

问题是,当我提交表单并在表单验证后将其放入 else 语句中时 $this->form_validation->run()我得到的只是一个空白屏幕。没有我绝望的var_dump s,什么都没有。因此,在我进行了所有尝试和不同的方法来使其发挥作用之后,出现了一些问题。
  • 什么在图书馆里不工作?在完成了我能找到的所有教程/问题之后,看起来我做对了。
  • 我如何做到这一点,以便我可以实际调试代码?我在浏览器中没有错误,Apache 错误日志中也没有错误。我还可以做些什么?
  • 将 DAO 与 Controller 分离的最佳实践是什么?据我所知,将其作为我正在尝试的图书馆将是最好的主意。它可能只会被这个 Controller 使用,它将处理注册和注册的修改。我将编写几个其他应用程序,它们都将位于此 CI 实例中,但它们将是相当独立的,并且不需要使用相同的 DAO。
  • 只要以大写字母开头,我可以使用 CamelCase 作为库文件名吗? Reccenterdao.phpRecCenterDAO.php 友好得多.

  • ==================================================== ==========

    编辑:我把整个东西改成了一个模型,但我得到了相同的功能——没有错误的空白屏幕。它似乎加载了模型,因为当我尝试使用 $numRows = $this->dao->getRecCenterInfo(); 行实际使用它时它会死掉。

    我知道现在整件事毫无意义,因为我没有使用数据库或解析用户输入的功能。这就是重点。在我努力投入所有业务逻辑之前,我试图让它发挥作用。

    应用程序/模型/rec_center_dao.php
    class Rec_center_dao extends CI_Model {
    
        public function __construct() { 
            parent::__construct();
        }
    
        private function connect() {
            $this->load->database();
        }
    
        private function disconnect() {
            $this->db->close();
        }
    
        public function getRecCenterInfo() {
            $this->connect();
    
            var_dump("Made it here");
            $result = $this->db->query("SELECT * FROM ucfitness");
            var_dump($result->result());
    
            $this->disconnect();
            return $result->num_rows();
        }
    }
    

    application/controllers/reccenter.php 的相关部分
        if ($this->form_validation->run() == FALSE) {
            $this->load->view('templates/header', $data);
            $this->load->view('pages/reccenter/register', $data);
            $this->load->view('templates/footer', $data);
        } else {
            $this->load->model('Rec_center_dao', 'dao');
            $numRows = $this->dao->getRecCenterInfo(); // This is where it dies
            var_dump($numRows);
    
            // Check if already registered 
                // Redirect to different view to change their registration
    
            // Do the registration
                //redirect('reccenter/confirm');
        }
    

    ==================================================== ==========

    EDIT2:感谢评论,我发现这是连接到数据库的问题。调用 $this->load->database(); 时出错.我已经确认使用我拥有的凭据,我可以使用 phpMyAdmin 管理数据库(我没有 shell 访问权限来在那里进行测试)。

    应用程序/配置/测试/数据库.php
    $active_group = 'default';
    $active_record = TRUE;
    
    $db['default']['hostname'] = 'my.hostname.com';
    $db['default']['username'] = 'db_username';
    $db['default']['password'] = 'db_password';
    $db['default']['database'] = 'db'
    $db['default']['dbdriver'] = 'mysql';
    $db['default']['dbprefix'] = '';
    $db['default']['pconnect'] = TRUE;
    $db['default']['db_debug'] = TRUE;
    $db['default']['cache_on'] = FALSE;
    $db['default']['cachedir'] = '';
    $db['default']['char_set'] = 'utf8';
    $db['default']['dbcollat'] = 'utf8_general_ci';
    $db['default']['swap_pre'] = '';
    $db['default']['autoinit'] = TRUE;
    $db['default']['stricton'] = TRUE;
    

    使用 webroot/index.php 中的上述配置和 application/config/test/database.php它应该选择不同环境的设置并相应地处理它,对吗?但是如果我把 var_dumpapplication/config/database.phpapplication/config/test/database.php它根本没有出现。我确认环境设置正确(至少在我进行测试时)。

    最佳答案

    当然,您的类(class)有这些错误(其余代码看起来不错):

    private function connect() {
        $CI->load->database();
    }
    

    应该是:
    private function connect() {
        $this->CI->load->database();
    }
    

    由于您已分配 $this->CI在构造函数中,并且您想使用该类属性,而不仅仅是新创建的 $CI 变量。 disconnect() 方法也是如此,它应该是:
    private function disconnect() {
        $this->CI->db->close();
    }
    

    那么 , 这里:
    public function getRecCenterInfo() {
        connect();
    
        var_dump("Made it here");
        $result = $CI->db->query("SELECT * FROM ucfitness");
        var_dump($result->result());
    
        disconnect();
        return $result->num_rows();
    }
    

    您应该改为(评论中突出显示的错误):
    public function getRecCenterInfo() {
        $this->connect(); // it's a method in the class, not a regular function
        $result = $this->CI->db->query("SELECT * FROM ucfitness"); // The property is $this->CI
        $this->disconnect(); // same as $this->connect();
        return $result->num_rows();
    }
    

    除了这些错误之外,到目前为止,您的类毫无用处,您可以在常规模型中使用 DB 类(可能是自动加载的)来实现相同的目的。

    关于php - CodeIgniter 自定义库未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250061/

    相关文章:

    php - 如何在FB中实现 "is user online"功能?

    php - 使用小型客户端从数据库帮助中使用 $_GET 检索信息。 PHP 和 MySQL

    JavaScript: "same-origin policy"失败

    php - 准备数据以在数据库中插入 ST_GeomFromText (Codeigniter + MySql)

    php - 在 mysql 中向逗号添加不需要的字符 - codeigniter

    php - 如何维护多个打开的查询?

    php - apache 2.4 (CentOS) 和 apache 2.4 (Red Hat) 有什么区别?

    javascript - 使用Javascript库SJCL加密,使用PHP解密

    php - 从数据库中获取过期的行

    php - 如何修复 PHP 中的参数错误?