消息:非法字符串偏移从Codeigniter2x版本升级到Codeigniter 3x版本

时间:2019-06-06 11:26:04

标签: php codeigniter wampserver

我最近将项目包从Codeigniter 2X版本切换到了Codeigniter 3X版本。

以前,我所有的代码都能正常工作,但是现在有了新软件包,它显示了一些我无法运行代码的微小错误。

以下是错误: 消息:非法字符串偏移:

我的控制器:

public function proflist(){
          $data = "";
          $this->load->model('feedbackmodel');
          $data['teachers'] =  $this->feedbackmodel->getFaculty();
          $this->load->view('feedback/proflist',$data);
 }

我的模特:

public function getFaculty(){
        $query = $this->db->query('SELECT * FROM teacher');
        return $query->result_array();
}

我的观点:

<?php 

                  if(!empty($teachers)) {
                  foreach($teachers as $y){


                    ?>

                  <tr>
                    <td><?php echo $y->fid; ?></td>
                    <td><?php echo $y->fname." ". $y->lname; ?></td>
                    <td><?php echo $y->email; ?> </td>
                    <td>
...

有什么错误吗?我该如何更改。请让我知道:)谢谢。

2 个答案:

答案 0 :(得分:0)

原因很可能是您使用的PHP版本。在PHP 7.1之前,它仅是因使用非法偏移而引发的声明。 7.1+现在会发出警告。您可以通过在有问题的数组中的控制器中包装' isset 来避免这种情况。确保也强制转换数组。

You'll find a good explanation for it here.

public function proflist() {
  $data = "";
  $this->load->model('feedbackmodel');

  $data['teachers'] = (array) $this->feedbackmodel->getFaculty();
  if(!isset($data['teachers'])) {
     $data['teachers'] = '';
  }

  $this->load->view('feedback/proflist',$data);
 }

要确定您正在运行的PHP版本,可以使用phpinfo();

答案 1 :(得分:0)

您需要更多地了解变量类型是什么。

在您的控制器中

public function proflist(){
    $data = "";
    $this->load->model('feedbackmodel');
    $data['teachers'] =  $this->feedbackmodel->getFaculty();
    $this->load->view('feedback/proflist',$data);
}

您通过$data = "";

将$ data声明为STRING。

然后您将通过

决定它将成为一个数组
$data['teachers'] =  $this->feedbackmodel->getFaculty();

正确的是,应将$ data声明为空数组,而不是空字符串。

public function proflist(){
    $data = array(); // Using the older style of declaring an array.
    $this->load->model('feedbackmodel');
    $data['teachers'] =  $this->feedbackmodel->getFaculty();
    $this->load->view('feedback/proflist',$data);
}

现在在您的模型中,通过以下方式创建返回的数据

return $query->result_array();

如果您在此查找codeigniter文档,它将告诉您结果数据是关联数组,即$ data ['teachers']的格式为 $data['teachers']['fid']

您的视图要求它是一个对象。 因此,您可以从...更改需要$ teachers成为对象的视图。

<?php 
  // $teachers should be returned from result() which is an object.
  if(!empty($teachers)) {
    foreach($teachers as $y){
  ?>
  <tr>
  <td><?php echo $y->fid; ?></td>
  <td><?php echo $y->fname." ". $y->lname; ?></td>
  <td><?php echo $y->email; ?> </td>
  <td>
...

收件人

<?php 
  // $teachers is returned from result_array() which is an associative array.
  if(!empty($teachers)) {
    foreach($teachers as $y){
  ?>
  <tr>
  <td><?php echo $y['fid']; ?></td>
  <td><?php echo $y['fname']." ". $y['name']; ?></td>
  <td><?php echo $y['email']; ?> </td>
  <td>
  ...

或者只需更改模型的收益率(一个班轮即可)。因此,更改您的模型

public function getFaculty(){
  $query = $this->db->query('SELECT * FROM teacher');
  return $query->result_array(); // Return an associative array
}

收件人

public function getFaculty(){
  $query = $this->db->query('SELECT * FROM teacher');
  return $query->result; // Return an object
}

所以简短的版本是:

  1. 检查返回的数组结构。您应该为此使用var_dump()。

  2. 更改您的代码以适合。

    1. 将模型的收益从result_array()更改为result()或

    2. 将视图从寻址对象更改为关联数组。

在这个阶段,我被迫抽出时间来详细讨论,但这应该可以帮助您了解正在发生的事情。