редактирование новости в БД через codeigniter

Serebos

Новичок
Всем привет.
Создал форму добавления новостей в БД через codeigniter. Все работает.
Потом создал форму редактирования новостей, код выводит значение с БД в форму для дальнейшего редактирования и сохранения.

При загрузке страницы, например http://news/edit/news-3/
10.jpg
Вношу изменения в содержание новости и сохраняю.
На странице появляется ошибка
PHP:
A PHP Error was encountered
Severity: Notice

Message: Trying to access array offset on value of type null

Filename: controllers/News.php

Line Number: 71

Backtrace:

File: C:\xampp\htdocs\kinomonster\application\controllers\News.php
Line: 71
Function: _error_handler

File: C:\xampp\htdocs\kinomonster\index.php
Line: 315
Function: require_once

A PHP Error was encountered
Severity: Notice

Message: Trying to access array offset on value of type null

Filename: controllers/News.php

Line Number: 72

Backtrace:

File: C:\xampp\htdocs\kinomonster\application\controllers\News.php
Line: 72
Function: _error_handler

File: C:\xampp\htdocs\kinomonster\index.php
Line: 315
Function: require_once

A PHP Error was encountered
Severity: Notice

Message: Trying to access array offset on value of type null

Filename: controllers/News.php

Line Number: 73

Backtrace:

File: C:\xampp\htdocs\kinomonster\application\controllers\News.php
Line: 73
Function: _error_handler

File: C:\xampp\htdocs\kinomonster\index.php
Line: 315
Function: require_once
Под этой ошибкой выводиться пустая форма и подтверждение, что новость отредактирована
11.jpg
В БД изменения вносятся!

Сама ошибка касается этой части кода - 3 строки, я так думаю:
PHP:
public function edit($slug = NULL) {
        $data['title'] = "редактировать новость";
        $data['news_item'] = $this->news_model->getNews($slug);

        $data['title_news'] = $data['news_item']['title'];         ЭТА СТРОКА
        $data['content_news'] = $data['news_item']['text'];    ЭТА СТРОКА
        $data['slug_news'] = $data['news_item']['slug'];         ЭТА СТРОКА

        if($this->input->post('slug') && $this->input->post('title') && $this->input->post('text')) {
           
            $slug = $this->input->post('slug');   
            $title = $this->input->post('title');  
            $text = $this->input->post('text');   


            if($this->news_model->updateNews($slug, $title, $text)) {

               echo "Новость успешно отредактирована!";
            }
        }

        $this->load->view('templates/header', $data);
        $this->load->view('news/edit', $data);
        $this->load->view('templates/footer');
    }
В инете рекомендуют поставить немного старшую версию XAMPP.
Но, все дело в коде.

Подскажите, пожалуйста, как исправить эту ошибку!

СПАСИБО.
 

WMix

герр M:)ller
Партнер клуба
Возможно такое, что ошибка не в опубликованной части кода, а в момент его вызова?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Возможно такое, что ошибка не в опубликованной части кода, а в момент его вызова?
Ты сам-то веришь в это? Человек не может пойти и проверить кусок своего же кода. Ему php явно говорит где проблема.

ТС, у тебя скорее всего $data['news_item'] не привет, как ты и думаешь, (а null). Соответственно надо как-то выбирать данные правильно и делать массив, если ты работаешь как с массивом. Ну и проверка бы не помешала, что $data['news_item'] вообще есть и т.д.
 

Serebos

Новичок
WMix и c0dex, спасибо за обсуждение вопроса. Такой вот вариант с массивом нашел в инете
PHP:
$arr_tmp = $this->data['news_item'];
        $this->data['title_news'] = $arr_tmp['title'];
        $this->data['content_news'] = $arr_tmp['text'];
        $this->data['slug_news'] = $arr_tmp['slug'];
но он также не решает ничего.
 

Serebos

Новичок
Понемногу добираюсь к истине: причина поведения кода уже понятна.

"ошибка возникает потому, что происходит попытка считывать что-то из массива по ключу, но то, к чему идет обращение как к массиву, в данный момент - "нулевое""

можно перед присвоением выполнять проверку, например такую:
Код:
$data['title_news'] = (empty($data['news_item']['title'])) ? $data['news_item']['title'] : NULL ;
добавил в код эту строку
Код:
public function edit($slug = NULL) {

        $data['title'] = "редактировать новость";
        $data['news_item'] = $this->news_model->getNews($slug);
        $data['title_news'] = (empty($data['news_item']['title'])) ? $data['news_item']['title'] : NULL;


        $data['title_news'] = $data['news_item']['title'];
        $data['content_news'] = $data['news_item']['text'];
        $data['slug_news'] = $data['news_item']['slug'];
        ......

Но, все равно, сообщение не исчезло, и оно уже содержит 4 блока (рнр ругается также и на добавленную строку).
Непонятно как реализовать эту идею!
Возможно, кто-то понимает суть происходящего?!
СПАСИБО.
 

Serebos

Новичок
WMix, если это вопрос ко мне - я не знаю как это определить (стадию возникновения ошибки). Сейчас поищу ответ, как узнать это. СПАСИБО
 

WMix

герр M:)ller
Партнер клуба
ну гдето edit($slug = NULL) вызывается? может она не всегда должна вызываться ? от $slug зависит
$data['news_item'] = $this->news_model->getNews($slug);
 

Serebos

Новичок
Решил проблему! Будет интересно! Вот ссылка поясняющая суть:
https://stackoverflow.com/questions/59336951/message-trying-to-access-array-offset-on-value-of-type-null/59337091#59337091

заменил три строки
Код:
$data['title_news'] = $data['news_item']['title'];
        $data['content_news'] = $data['news_item']['text'];
        $data['slug_news'] = $data['news_item']['slug'];
на проверку isset
Код:
 $data['title_news'] = (isset($data['news_item']['title'])) ? $data['news_item']['title'] : 0;
        $data['content_news'] = (isset($data['news_item']['text'])) ? $data['news_item']['text'] : 0;
        $data['slug_news'] = (isset($data['news_item']['slug'])) ? $data['news_item']['slug'] : 0;
И все заработало корректно! Всем спасибо за обсуждение.
 

Serebos

Новичок
Единственное, что после обновления в полях формы ноли появляются вместо контекстной подсказки!
1465
В первом варианте под текстом ошибки было такое окно!
11.jpg
 

Serebos

Новичок
Все решили "пустые кавычки" вместо нолей при проверке!
Код:
        $data['title_news'] = (isset($data['news_item']['title'])) ? $data['news_item']['title'] : "";
        $data['content_news'] = (isset($data['news_item']['text'])) ? $data['news_item']['text'] : "";
        $data['slug_news'] = (isset($data['news_item']['slug'])) ? $data['news_item']['slug'] : "";
 

AnrDaemon

Продвинутый новичок
А зачем вообще отправлять форму для сообщения о завершении редактирования?
 
Сверху