我是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.php
,application/config/stage/database.php
和application/config/prod/database.php
中,以配置各自的连接参数。每个环境都有不同的数据库服务器和凭据。
问题在于,当我提交表单并在表单验证$this->form_validation->run()
之后进入那个else语句时,我只得到一个空白屏幕。我没有绝望的var_dump
,没有。因此,经过我的所有尝试和不同的方法来实现这一点后,出现了一些问题。
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访问权限来测试)。
应用/配置/测试/ 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.php
和application/config/test/database.php
中的上述配置,它应该选择不同环境的设置并相应地处理它,对吗?但是,如果我在var_dump
或application/config/database.php
中添加application/config/test/database.php
,则根本不会显示{{1}}。我确认环境设置正确(至少在我正在进行测试时)。
答案 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安装程序!