【问题标题】:Code Igniter Load Database seem to stop process threadCodeigniter 加载数据库似乎停止了进程线程
【发布时间】:2010-10-23 17:28:09
【问题描述】:

我刚刚在 Windows 7 机器上建立了一个简单的 PHP Code Igniter 项目,IIS 7,快速 CGI,没有模块。

当我通过这样做this->load->database() 在 Model 类的函数之一中加载数据库时,线程似乎停止在该特定行上。后面的操作都不做。

class Account_model extends Model {

  var $userId = '';
  var $userName = '';
  var $requestToken = '';
  var $accessToken = '';
  var $enabled = false;
  var $startOfDay;
  var $endOfDay;

  function Account_model() {
      parent::Model();
  }

  function get($userId) {
      $this->load->database();
      $query = $this->db->get_where('accounts', array('userId' => $userId), 1, 0);
      return $query->result();
  }

  function insert() {
      $this->load->database();
      // ** stop **
      $this->db->insert('accounts', $this); //never gets to this
  }
}

如果我完全省略该行,我会在模型中得到一个 php 异常未定义变量 $db。

调用者控制器:

class SignUp extends Controller {

  function SignUp() {
      parent::Controller();
  }

  function createUser() {
      echo 'processing';

      $this->load->model('Account_model');

      $this->Account_model->userId = 'asd';
      $this->Account_model->userName = 'test_user_pls_delete';
      $this->Account_model->enabled = true;
      $this->Account_model->startOfDay = time();
      $this->Account_model->insert();

      echo 'done'; // never gets to this
  }
}

我已验证数据库配置正确(主机名、驱动程序等),并且能够使用 MySQL workbrench 从机器连接到数据库服务器。

$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "{omitted}";
$db['default']['username'] = "{omitted}";
$db['default']['password'] = "{omitted}";
$db['default']['database'] = "{omitted}";
$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";

数据库表名:accounts

  • Id int(11) 主键 auto_increment
  • UserId varchar(255) utf8_general_ci
  • 用户名 varchar(255) utf8_general_ci
  • requestToken varchar(255) utf8_general_ci
  • AccessToken varchar(255) utf8_general_ci
  • 启用 tinyint(1)
  • startOfDay 时间
  • endOfDay 时间

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 介意发布你的database.php吗?
  • 不贴代码就帮不上忙了。我们需要查看引发此错误的代码、错误本身以及您的数据库配置设置。
  • 经过进一步的尝试和错误,我发现我一定没有正确配置IIS,fast-cgi,php。相同的代码适用于 VS.php Web 开发服务器,但不适用于具有 fast-cgi 的适当 IIS。

标签: php codeigniter


【解决方案1】:

嗯……这是我的模型……

class Account_model extends Model {

function Account_model() {
    // Call the Model constructor
    parent::Model();
    $this->db = $this->load->database('default', TRUE);
}

function showTables() {
    $query = "show tables";
    $rs = $this->db->query($query);
    return $rs->result_array();
}

在 $db 中加载数据库,以便 $db 可以处理查询。

【讨论】:

    【解决方案2】:
    1. 您需要在模型或自动配置中加载数据库(请参阅 Anzeo 的帖子)
    2. 无法访问像 $this->Account_model->userId = 'asd' 这样的模型; - 需要调用函数
    3. 您不能插入 $this(同样不安全)
    4. 将 db 中的 Enabled 字段更改为 BOOLEAN(不需要 TinyInt)

    以下内容应该可以帮助您入门...
    控制器:

    class SignUp extends Controller {
      function SignUp(){
          parent::Controller();
      }
      function createUser(){
          echo 'processing';
          $this->load->model('Account_model');
          $result = $this->Account_model->insert($userId = 'asd', $userName = 'test_user', $enabled = 'true', $startOfDay = time());
          echo ($result == TRUE) ? 'insert successful' : 'insert failed';
      }
    }
    

    模型:

    class Account_model extends Model {
      function Account_model(){
          parent::Model();
          $this->db = $this->load->database('default', TRUE);
      }
      function add_user($userId, $userName, $requestToken = '', $accessToken = '', $enabled = 'false', $startOfDay = '', $endOfDay = '') {
          $user = array(
               'UserId' => $userId,
               'UserName' => $userName,
               'requestToken' => $requestToken,
               'accessToken' => $accessToken,
               'Enabled' => $enabled,
               'startOfDay' => $startOfDay,
               'endOfDay' => $endOfDay
            );
          $this->db->insert('accounts', $user);
          return ($this->db->affected_rows() > 0) ? TRUE : FALSE;
          }
      }
    }
    

    【讨论】:

    • 感谢 Mitchell,如上所述,我的问题实际上是一个尚未解决的 Web 服务器配置问题。不过感谢您的解释-我觉得它很有帮助。你的实现让我担心的一件事是,你将模型用作数据访问对象,就像“域”模型一样。
    • 感谢您的投票。很多人在 CI 中以我上面展示的方式使用数组而不是传递对象(我的公司对此进行了标准化),但每个人都有自己的:D
    【解决方案3】:

    您可以通过在 autoload.php 文件中的库数组中添加“数据库”来自动加载数据库库,位于:

    application/config/autoload.php
    

    或者,临时加载它。在这两种情况下,它都会让我们使用您的配置,位于:

    application/config/database.php
    

    您能否验证您的配置是否如上?

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多