Сообщение: незаконное обновление смещения строки с версии Codeigniter2x до версии Codeigniter 3x - PullRequest
2 голосов
/ 06 июня 2019

Я недавно переключил свой проектный пакет с версии 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 голосов
/ 06 июня 2019

Вам нужно больше знать о типах переменных.

В вашем контроллере

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

Вы объявляете $ data как STRING с помощью $data = "";,

Затем вы решаете, что это будет массив, с помощью

$data['teachers'] =  $this->feedbackmodel->getFaculty();

Чтобы быть правильным, $ data должен быть объявлен как пустой массив, а не как строка emtpy.

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 ['teacher'] будет иметь вид $data['teachers']['fid'] и т. Д.

Ваше мнение требует, чтобы это был объект. Таким образом, вы можете изменить свое представление, которое требует, чтобы $ учителя был объектом, с ...

<?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. Измените ваши представления с адресации объектов на ассоциативные массивы.

Я вынужден уделить время более подробным сведениям на этом этапе, но это должно помочь вам понять, что происходит.

0 голосов
/ 06 июня 2019

Причиной этого, скорее всего, является версия PHP, которую вы используете. До PHP 7.1 это было только Уведомление, выданное за использование недопустимого смещения. 7.1+ теперь выдаст предупреждение. Вы можете избежать этого, обернув ', если нет, isset ' в вашем контроллере вокруг ошибочного массива. Обязательно приведите массив также.

Хорошее объяснение вы найдете здесь.

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();.

...