CodeIgniter自定义库未加载

时间:2013-11-27 18:16:01

标签: php codeigniter

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

以下是代码:

应用/控制器/ 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.phpapplication/config/stage/database.phpapplication/config/prod/database.php中,以配置各自的连接参数。每个环境都有不同的数据库服务器和凭据。

问题在于,当我提交表单并在表单验证$this->form_validation->run()之后进入那个else语句时,我只得到一个空白屏幕。我没有绝望的var_dump,没有。因此,经过我的所有尝试和不同的方法来实现这一点后,出现了一些问题。

  1. 图书馆里没有什么工作?在完成了我能找到的所有教程/问题之后,看起来我做得对。
  2. 如何制作它以便我可以实际调试代码?我在浏览器中没有错误,并且Apache错误日志没有错误。我还能做什么?
  3. 将DAO与Controller分离的最佳做法是什么?从我所知道的,使这个像我正在尝试的库是最好的主意。它可能只会被这一个控制器使用,它将处理注册的注册和修改。我将编写一些其他应用程序,这些应用程序都将位于此CI实例中,但它们将是相当独立的,不需要使用相同的DAO。
  4. 只要以大写字母开头,我可以使用CamelCase作为库文件名吗? Reccenterdao.phpRecCenterDAO.php友好得多。
  5. =============================================== =============

    编辑:我将整个事情改为模型,但我得到了相同的功能 - 空白屏幕没有错误。它似乎加载了模型,因为当我尝试使用行$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访问权限来测试)。

    应用/配置/测试/ database.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.phpapplication/config/test/database.php中的上述配置,它应该选择不同环境的设置并相应地处理它,对吗?但是,如果我在var_dumpapplication/config/database.php中添加application/config/test/database.php,则根本不会显示{{1}}。我确认环境设置正确(至少在我正在进行测试时)。

2 个答案:

答案 0 :(得分:1)

当然,你的班级有这些错误(其余代码看起来很好):

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类实现相同的功能,也许是自动加载的。

答案 1 :(得分:0)

原来问题是我的PHP安装。我正在运行Windows 7并使用MSI安装程序安装PHP 5.2.14。我使用php-5.2.14-Win32-VC6-x86.zip重做安装。拉开它,把它放到位,重新配置php.ini,它工作。

不要使用MSI安装程序!