CodeIgniter PHP模型访问"无法找到您指定的模型"


CodeIgniter PHP Model Access "Unable to locate the model you have specified"

我一直在尝试加载我正在建设的这个网站的一些模型。然而,由于未知的原因,它会产生以下错误:

An Error Was Encountered
Unable to locate the model you have specified: logon_model
现在,我已经做了我的研究。问题是IC处理小写文件名。但是,我的文件和文件调用都是小写的,如下所示:
echo "VALIDATING";
            // Validation passed. Off we go to account info verification from AA's database. God help us all.
            $this->load->model('logon_model');
            echo "FOUND MODEL";
            $res = $this->logon_model->verify_user($this->input->post('username'),$this->input->post('password'));
            echo $this->input->post('username');
            echo $this->input->post('password');

执行没有到达"FOUND MODEL",因此在模型加载时停止。我尝试使用:

 $this->load->model(site_url('logon_model'));

没有结果。需要提及模型文件是否正确地放置在正确的模型文件夹中吗?

如何解决这个问题?

编辑:模型文件头文件:

class Logon_model extends CI_Model {
....

在创建模型时,您需要将文件放在application/models/中,并将文件命名为全小写-如logon_model.php

logon_model.php应包含以下内容:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Logon_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }
    ...

现在,你可以做的,测试你的应用程序模型是否可访问,是试着在浏览器中打开它-像这样:http://example.org/application/models/logon_model.php

如果您看到文本No direct script access allowed,这意味着您击中了正确的文件(如果您有疑问,尝试在第一行的exit()中写入其他内容)。

其次,为了在控制器中加载模型,你应该能够这样做:
public function index()
{
    $this->load->model('logon_model');
    ...
}

如果上面的一切都如预期的那样,我将开始查看文件权限和/或可能的符号链接,如果你正在使用任何。

我使用codeigniter 3+。我有同样的问题,在我的情况下,我改变了模型文件名从大写开始。

Logon_model.php

模型应该是这样的:确保你的模型是这样的。

    <?php
    class Logon_model extends CI_Model {
    function __construct()
    {
         parent::__construct();
    }
    function myFunc()
    {
      // do something
    }
}

注意大写的类名。

加载:

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

请注意全部小写。

我用这种方式解决这个问题:

  1. 我重命名文件做Page_model.php
  2. Class name to Page_model extends…
  3. I call on autoload: $autoload['model'] = array('Page_model'=>'page');

没问题. .希望能有所帮助。

在CodeIgniter 3.0-dev(从github获取)中,这是不工作的,因为CI是搜索首字母大写。

您可以在system/core/Loader.php第282行或以下找到代码:

$model = ucfirst(strtolower($model));
foreach ($this->_ci_model_paths as $mod_path)
{
    if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
    {
        continue;
    }
    require_once($mod_path.'models/'.$path.$model.'.php');
    $CI->$name = new $model();
    $this->_ci_models[] = $name;
    return $this;
}

这意味着我们需要在application/models/Logon_mode.php上创建具有以下名称的文件

文件名的第一个字母和类名必须是大写的。

你的模型类将是

类Logon_model扩展CI_Model

,文件名为Logon_model.php

从控制器访问它,如

$ this ->加载>模型("Logon_model");

添加到@jakentus的答案,下面是我的工作:

  1. 将models包中的文件名更改为Logon_model.php(首字母大写,@jakentus正确表示)

  2. 将类名更改为与文件名相同,即

    class Logon_model extends CI_Model

  3. 将load方法中的名称也更改为

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

希望这对你有帮助。快乐的编码。

更改模型文件名,以大写字母开头,如下所示:

当我们将项目从windows服务器迁移到LINUX服务器时,会发生这种情况,因为LINUX是区分大小写的,而windows不是。

所以,在windows上,即使不写大写的文件名,它也会工作得很好,但在linux上不行。

模型的命名和调用必须使用模型名称的第一个字母大写,其余字母小写。

例如:$this->load->model('Logon_model');

:

class Logon_model extends CI_Model {
...

但是你的文件名是正确的。

我遇到了同样的问题,但我通过修改我的应用程序/config/routes.php文件来修复它。

我对我的控制器目录做了一些重组,但忘记在路由文件中起作用。

早些时候

:

$route['application/apply'] = 'ex/application/account/create';

现在:

$route['application/apply'] = 'application/account/create';

修改以大写字母开头的模型名可以工作。例如:Login_model.php而不是Login_model.php

你必须修改你的模型名第一个大写字母。在本地小字母工作正常,但在线这不是工作。例如:

common_model.php

将其替换为

Common_model.php

只是添加我的问题我有:

$this->load->model("planning/plan_model.php");

.php不应该在那里,所以它应该是:

$this->load->model("planning/plan_model");

希望这能帮助到一些人

如果你是在Linux上,那么确保你的文件名必须与加载模型方法中传递的第一个参数的字符串匹配。

$this->load->model('Order_Model','order_model');

你可以使用第二个参数,你可以从你的模型调用方法,它将在Linux和windows上工作

$result = $this->order_model->get_order_details($orderID);

确保:

  1. 首字母大写
  2. 类名与文件名相同
  3. 确保你的文件以。php扩展名结尾

在我的情况下,我有1和2正确,但忘记命名我的文件与。php扩展名。我是怎么忘记的,不知道,但它确实给了我一段艰难的时间试图找出问题

你可以给任何你想要的名字

样式指南是建议而不是必须

但是你必须注意在所有地方使用相同的

例如,对于Test_Model,你必须:

类名
        class Test_Model extends CI_Model
文件名

        Test_Model.php

加载模型
        $this->load->model('Test_Model');

使用模型
        $this->Test_Model

为了避免使用硬编码字符串,你可以像这样加载模型:

        $this->load->model(Test_Model::class);