Codeigniter任务调度

时间:2018-07-01 07:50:09

标签: php codeigniter foreach

我不太确定我的标题问题是否正确,但是尽管数组中只有一项,但我面临着foreach中多个循环的严重错误。我在这里粘贴代码;

显示(控制器)

$table_data = array(
                'table_data' => $this->display_model->get_table_data($table_name),
                'edit_table_data'=>$this->display_model->get_table_data($table_name,$row_id) 
            );

$form_name='edit_'.$table_name;

$this->load->view('header');
$this->load->view($form_name,$table_data);
$this->load->view('footer');

您会看到 tabe_data edit_table_data 正在调用具有不同参数的相同函数。 在这里,我怀疑这两个函数调用之间的时间安排(老实说我错了,因为Codeigniter管理函数调用)

Display_model (模型)

public function get_table_data($table_name,$row_id=null)
{
    $return = "";

    if ($row_id != null) 
    {
        switch ($table_name) {

            case 'user':

                //$return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();
                $return = $this->db->select($table_name.'.*,country.country_name')
                ->join('country','country.country_id=user.user_country_id','left')
                ->where($table_name.'_id',$row_id)
                ->get($table_name)->result();
                break;

            case 'user_document':

                //$return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();
                $return = $this->db->select($table_name.'.*,document.document_name')
                ->join('document','document.document_id=use_document.document_id','left')
                ->where($table_name.'_id',$row_id)
                ->get($table_name)->result();
                break;

            default:

                $return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();

                break;
        }

    if($return != null)
    {
        return $return;
    }
    else
    {
        return "no_data";
    }
}

这是我遇到错误的观点

                <?php foreach ($edit_table_data as $etd_row) {?>
                <form method="post" class="form-horizontal" action="<?php echo site_url('admin/edit_row/user_type/'.$etd_row->user_type_id)?>">
                    <div class="form-group">
                        <label class="col-sm-4 control-label">User Type Name</label>

                        <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name" value="<?php echo $etd_row->user_type_name?>"></div>
                    </div>

                    <div class="hr-line-dashed"></div>

                    <div class="form-group">
                        <div class="col-sm-2 col-sm-offset-2">
                            <button class="btn btn-primary" type="submit">Edit changes</button>
                        </div>
                    </div>

                </form>
                <?php } ?>

在foreach循环行上,出现错误

Invalid argument supplied for foreach

提前感谢您的评论

错误

A PHP Error was encountered
Severity: Warning

Message: Invalid argument supplied for foreach()

Filename: views/edit_user_type.php

Line Number: 18

Backtrace:

File: C:\wamp\www\gmf\application\views\edit_user_type.php
Line: 18
Function: _error_handler

File: C:\wamp\www\gmf\application\controllers\Display.php
Line: 170
Function: view

File: C:\wamp\www\gmf\index.php
Line: 315
Function: require_once

2 个答案:

答案 0 :(得分:0)

如果$edit_table_data不是数组-在这种情况下可能是字符串,则会出现此错误。

我的CI知识有些生疏,但我想这些方面的东西可能会帮助您:

$query = $this->db->select($table_name.'.*,country.country_name')
->join('country','country.country_id=user.user_country_id','left')
->where($table_name.'_id',$row_id)
->get($table_name);

if ($query->num_rows() === 0){
    return []; // Make sure we're always returning an array.
    // I'd rather handle this stuff in the view...
    // Probably some kind of message that shows:
    // that there are not results when $edit_table_data is not an array, otherwise loop.

}

return $query->result();

或者您可以按照以下方式做一些事情:

<?php
if (!is_array($edit_table_data)) {
    echo 'No results here.';
} else {
    foreach ($edit_table_data as $etd_row) { ?>
        <form method="post" class="form-horizontal"
              action="<?php echo site_url('admin/edit_row/user_type/' . $etd_row->user_type_id) ?>">
            <div class="form-group">
                <label class="col-sm-4 control-label">User Type Name</label>

                <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name"
                                             value="<?php echo $etd_row->user_type_name ?>"></div>
            </div>

            <div class="hr-line-dashed"></div>

            <div class="form-group">
                <div class="col-sm-2 col-sm-offset-2">
                    <button class="btn btn-primary" type="submit">Edit changes</button>
                </div>
            </div>

        </form>
        <?php
    }
}
?>

答案 1 :(得分:0)

似乎没有理由两次调用get_table_data,一次调用$row_id,一次调用$table_data['$table_data'],因为您从未在视图中使用$table_data['edit_table_data'] = $this->display_model->get_table_data($table_name,$row_id) ; $form_name='edit_'.$table_name; $this->load->view('header'); $this->load->view($form_name,$table_data); $this->load->view('footer'); 。为了获得某些有用的东西,应该取消首次调用。修改后的控制器如下所示。

}

问题中的模型代码缺少大括号if ($row_id != null) { 以关闭此语句。

$row_id

因此,如果没有提供get_table_data,则很难准确地确定您要发生什么。如果没有更多信息,我认为public function get_table_data($table_name, $row_id) 不应为第二个参数提供默认值。换句话说,该函数应在没有$ row_id默认值的情况下定义-这样。

get_table_data()

没有$ row_id的默认值,如果没有提供任何值,则会发生致命错误。因此,控制器将需要确保提供了一个值。 同样,控制器应始终检查模型的返回值是否合适,或者模型应始终返回视图可以使用的内容。

where($table_name.'_id', $row_id)包含许多重复的代码-get($table_name)->result()public function get_table_data($table_name, $row_id) { if($table_name === 'user') { $this->db ->select($table_name.'.*, country.country_name') ->join('country', 'country.country_id = user.user_country_id', 'left'); } elseif($table_name === 'user_document') { $this->db ->select($table_name.'.* ,document.document_name') ->join('document', 'document.document_id = use_document.document_id', 'left'); } return $this->db ->where($table_name."_id", $row_id) ->get($table_name) ->row(); } 出现3次。通过重新排列逻辑,可以消除重复行,从而使功能更加简洁。考虑这个版本。

$table_name

以上内容从$table_name."_id" == $row_id中的任何row()返回数据。对于“ user”或“ user_document”表,将添加特定的“ select”和“ join”子句。

因为您似乎只对一行感兴趣,所以应该呼叫result()而不是db->row()

很重要的一点是,如果找不到记录,foreach将返回NULL。该事实可用于测试模型返回并做出适当反应。在这种情况下,我们在视图中进行检查。因为只有一排。不需要<?php if(isset($edit_table_data)) { ?> <form method="post" class="form-horizontal" action="<?php echo site_url('admin/edit_row/user_type/'.$edit_table_data->user_type_id) ?>"> <div class="form-group"> <label class="col-sm-4 control-label">User Type Name</label> <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name" value="<?php echo $edit_table_data->user_type_name ?>"></div> </div> <div class="hr-line-dashed"></div> <div class="form-group"> <div class="col-sm-2 col-sm-offset-2"> <button class="btn btn-primary" type="submit">Edit changes</button> </div> </div> </form> <?php } else { ?> <div>No Data Available</div> <?php } ?>

spring.batch.initialize-schema=always