gpt4 book ai didi

php - CodeIgniter 自定义库未加载

转载 作者:行者123 更新时间:2023-12-02 03:40:44 25 4
gpt4 key购买 nike

我是 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com