Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和Codeigniter-如何检查模型是否存在和/或是否抛出错误? 示例#1_Php_Codeigniter_Error Handling - Fatal编程技术网

PHP和Codeigniter-如何检查模型是否存在和/或是否抛出错误? 示例#1

PHP和Codeigniter-如何检查模型是否存在和/或是否抛出错误? 示例#1,php,codeigniter,error-handling,Php,Codeigniter,Error Handling,Bchaeffer对问题的回答-在他的最后一个例子中: $this->load->model('table'); $data = $this->table->some_func(); $this->load->view('view', $data); 当'table'不存在时,您如何处理此问题 示例2 但运行此操作后(显然模型不存在,但有时会存在),它仍会失败,并出现以下错误: 遇到错误 找不到您指定的型号:SERVICE\U forms 我通过以下方式

Bchaeffer对问题的回答-在他的最后一个例子中:

$this->load->model('table');
$data = $this->table->some_func();
$this->load->view('view', $data);
'table'
不存在时,您如何处理此问题


示例2 但运行此操作后(显然模型不存在,但有时会存在),它仍会失败,并出现以下错误:

遇到错误

找不到您指定的型号:SERVICE\U forms


我通过以下方式获得此函数调用:

1) 获取一些JSON:

2) 并将其转换为函数调用:

$this->load->model('SERVICE_u'、'model_1'、'my_model')

3) 我所说的:


解决方案 问题在于CodeIgniter的
show_error(…)
函数显示错误,然后
退出。。。不酷。。。所以我重写了:
model(…)
->
my_model(…)
(如果你只是重写它,你会得到错误)并删除了
show_错误(…)
,因为某些原因你不能重写它-对于Codeigniter来说很奇怪)。然后在
my_model(…)
中使其抛出异常

我个人的意见:调用函数应该
返回
显示错误(“消息”)其中显示错误返回
FALSE
——该或 您可以取出
出口-并使
显示错误(…)
压倒


您可以查看“模型”文件夹中是否存在该文件

$model = 'my_model';
if(file_exists(APPPATH."models/$model.php")){
   $this->load->model($model);
   $this->my_model->my_fcn($prams);
}
else{
  // model doesn't exist
}

也许这个助手函数将帮助您检查是否加载了模型

function is_model_loaded($model)
{
    $ci =& get_instance();      
    $load_arr = (array) $ci->load;

    $mod_arr = array();
    foreach ($load_arr as $key => $value)
    {
        if (substr(trim($key), 2, 50) == "_ci_models")
            $mod_arr = $value;
    }
    //print_r($mod_arr);die;

    if (in_array($model, $mod_arr))
        return TRUE;

    return FALSE;
}

不要担心您的应用程序可能会使用包装。此帮助器功能可查看所有模型(即使在CI应用程序中包含的软件包中)


干杯

@Endophage不,您不必明确说明正在加载的模型是什么。它们可以动态加载。 例如:

因此,您可以有一个使用URL或POST变量的控制器


我经常在ajax调用中使用这个概念。所以OP的问题很有道理。我想在尝试加载之前确保模型存在。

这是有意义的(可能是我必须解决这个问题的方式),但这个函数用于生成一个将被大量使用的页面-我看到这会杀死服务器,每次它必须生成页面时,它都会强制进行此查询。。。另外,我不希望将所有模型都绑定到这里的一个文件夹中-最终我计划进一步分离我的模型,并且不想担心文件的位置。@Walter:您需要知道文件的位置才能加载它。@Rocket模型映射可以有模型所在的子目录。在这种情况下,您需要编辑您的代码片段。@true。我原以为load->model()函数会无声地失败。@沃尔特:如果文件不在同一台服务器上,你如何加载模型?顺便说一句,这里是CodeIngiter用来加载模型的代码:既然您必须手动将模型名称放在代码中的某个位置,为什么您要在知道文件不存在的情况下尝试加载模型?CI 2.x的包路径将允许您非常轻松地在目录结构中分发模型。E.X.-我想要
model_1
的HTML,JSON:
“model_1:{”pram_1:“1”,“pram_2:“1”}
->
$this->load->model('service_.”“model_1”,“my_model”);
试图构建这个可扩展的系统我的观点仍然成立,你已经为“model_1”编程了“在你的代码中的某个地方,为什么不把它放在服务器上,在你的控制器中有一堆小包装函数呢?”。无论哪种方式,模型可能不存在的唯一情况是,如果所需的模型是通过用户生成的内容以某种方式请求的,这将有点疯狂…我明白你的意思-问题是,我尝试使它成为这样的程序员,他们对错误不像我那样敏感,可以在系统中构建内容。。。在这种情况下,“非编程人员”可能会更改原始JSON字符串,因此错误处理非常重要(至少在这个特定软件的早期版本中是如此),如果您还没有这样做,请投入一些时间来寻找替代的体系结构解决方案。听起来你以后会遇到真正的问题。Codeigniter已经提供了一种访问控制器及其功能的非常健壮的方法,听起来您只是试图将这种访问深入到模型中,而不是在控制器中编写一些简短的干净包装。如果它使代码更易于维护,那么编写更多的代码行是可以的,多写一点不会明显影响性能。我将此作为解决方案的基础。因为我已经有了一个MY_Loader类,我用它来添加不同的目录来存储模型,所以我向该类添加了一个新方法:[编辑超时]
function model_exists($name){$CI=&get_instance();foreach($config_model_路径作为$config_路径)if(file_exists(FCPATH.$config_path.'models/'.$name..php'))return true;return false;}
至于“您怎么可能不知道您的模型文件是否存在?”这是一个具有站点特定模型和扩展名的框架,可能不适合添加到核心文件,但可能存在。
$this->my_model->function_name(pram_1=1, pram_2=1);
$model = 'my_model';
if(file_exists(APPPATH."models/$model.php")){
   $this->load->model($model);
   $this->my_model->my_fcn($prams);
}
else{
  // model doesn't exist
}
function is_model_loaded($model)
{
    $ci =& get_instance();      
    $load_arr = (array) $ci->load;

    $mod_arr = array();
    foreach ($load_arr as $key => $value)
    {
        if (substr(trim($key), 2, 50) == "_ci_models")
            $mod_arr = $value;
    }
    //print_r($mod_arr);die;

    if (in_array($model, $mod_arr))
        return TRUE;

    return FALSE;
}
if ( ! function_exists('model_exists')){
    function model_exists($name){
        $CI = &get_instance();
        foreach($CI->config->_config_paths as $config_path)if(file_exists(FCPATH . $config_path . 'models/' . $name . '.php'))return true;
        return false;
    }
}
$path = 'path/to/model/';
$model = 'My_model';
$method = '_my_method'; 
$this->load->model($path . $model);
return $this->$model->$method();