我是 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,什么都没有。因此,在我进行了所有尝试和不同的方法来使其发挥作用之后,出现了一些问题。Reccenterdao.php
比 RecCenterDAO.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_dump
在 application/config/database.php
或 application/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/