Ошибка trying to access array offset on value of type null. как добавить проверку?
ВСЕМ ПРИВЕТ!
Модуль Codeigniter , Урок 8: CRUD: страница редактирования новости.
При нажатие на кнопку "Редактировать новость" выскакивает ошибка "Попытка получить доступ к смещению массива по значению типа null" в 3 строках:
$data['title_news'] = $data['news_item']['title'];
$data['content_news'] = $data['news_item']['text'];
$data['slug_news'] = $data['news_item']['slug'];
Документ News.php (контроллер). В базе данных новость обновляется.
Этот вопрос неоднократно обсуждался на этом ресурсе (
https://fructcode.com/ru/qa/kak-ispravit-osibku-popytka-polucit-dostup-k-smeseniu-massiva-po-znaceniu-tipa-null--ja-vi/
https://fructcode.com/ru/qa/ne-idet-redaktirovanie-cto-delat-t98phy/
https://fructcode.com/ru/qa/osibka-trying-to-access-array-offset-on-value-of-type-null-kak-ispravit-rt7jlz/ ).
ОТВЕТ НЕ НАЙДЕН на этот вопрос. Написаны предложения о переустановке XAMPP и попробовать исходный код Сергея Никонова взять.
Я на форумах уже второй день ищу решение этой задачи.
Нашел я такие вот пояснения и предложение, как избавиться от проблемы:
"ошибка возникает потому, что происходит попытка считывать что-то из массива по ключу, но то, к чему идет обращение как к массиву, в данный момент - "нулевое"" можно перед присвоением выполнять проверку на "пустое значение/нулевое", например такую:
$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 строках, включаю добавленную выше.
ПОМОГИТЕ РАЗОБРАТЬСЯ С ДОПОЛНИТЕЛЬНОЙ ПРОВЕРКОЙ, о которой речь шла выше!
СПАСИБО!
9 ответов
и код который я написал и его исходный код одинаковы....
Неужели так сложно скопировать из архива исходный код, развернуть базу из исходного кода и настроить codeigniter? У меня это с первого раза получилось и все заработало. Просто нужно быть внимательным, особенно когда настраиваешь apache и codeigniter.
Вот вы такие умные, говорите скачать архив последнего урока и т.п., но вас спрашивали про 8 урок, ни одного нормального ответа
Если запустить исходный код автора, все работает. Нужно уже у себя в коде смотреть и сравнивать в каком месте допустил ошибку.
я тоже с этим столкнулся и не могу решить... и почему наш учитель Нконов еще не ответил на это вопрос, или проблему? и код который я написал и его исходный код одинаковы.... в чем причина...??? что неправильно...???
Спасибо, student_aPnalwdy. Попробую еще так.
На форумах меня спрашивают то, на что я не в состоянии дать адекватный ответ.
Вот ссылку на этот ресурс подсказали мне!!! https://stackoverflow.com/questions/59336951/message-trying-to-access-array-offset-on-value-of-type-null/59337091#59337091
ВСЕ РАБОТАЕТ. Дело было действительно в APACHE, а вернее версии PHP относительно проверки empty (что была предложена мне на форуме - для решения проблемы). Заработал код при проверке 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;
вместо проблемных трех строк!
Единственное замечание: после обновления новости в полях выводятся ноли, вместо контекстных подсказок содержимого поля!
Если кто знает как решить с нолями после обновления - напишите!
Спасибо!
в проверках вместо нолей нужно поставить кавычки и после обновления в полях остается контекстное значение!
$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'] : "";
у меня стоит PHP 7.4.2
Также, существует вероятность того, что в уроке автор не упомянул о какой-то детали, но у себя в коде он реализовал ее! Поскольку многие столкнулись с одной и той же проблемой. Поэтому, нужно проанализировать исходный код автора, найти отличия и пересмотреть урок повторно!
Вот вы такие умные, говорите скачать архив последнего урока и т.п., но вас спрашивали про 8 урок, ни одного нормального ответа
Как решил эту ошибку я:
1. Скачал и установил XAMPP последней стабильной версии 3.2.4. На всякий случай версию php напишу (PHP 7.4.4 (cli) (built: Mar 17 2020 13:49:19))
2. Из последнего урока скачал исходный код и базу данных (дамп)
3. В hosts домен для сайта указан kinomonster.com и в настройках codeigniter и dx_auth
4. Развернул дамп базы (kinomonster) и в настройках подключения к базе в codeigniter, указал реквизиты для нее
5. Настроил хосты настроек apache для kinomonster.com и на папку kinomonster
6. В папку kinomonster разархивировал исходный код (из последнего урока)
Все работает, ошибок нет. Авторизация работает, редактирование и так далее.
Сравнил со своим кодом, который вместе с лектором писал, были у меня ошибки с получением данных из массива и я пытался обращаться за пределы массива по ключам, которых нет в массиве.
Какая версия php стоит?
У меня так написано:
public function edit($slug = NULL) {
if(!$this->dx_auth->is_admin()) {
show_404();
}
$this->data['title'] = 'Редактировать новость';
$this->data['news_item'] = $this->News_model->getNews($slug);
if (empty($this->data['news_item'])) {
show_404();
}
$this->data['id_news'] = $this->data['news_item']['id'];
$this->data['title_news'] = $this->data['news_item']['title'];
$this->data['content_news'] = $this->data['news_item']['text'];
$this->data['slug_news'] = $this->data['news_item']['slug'];
if($this->input->post('slug') && $this->input->post('title') && $this->input->post('text')) {
$id = $this->data['news_item']['id'];
$slug = $this->input->post('slug');
$title = $this->input->post('title');
$text = $this->input->post('text');
if($this->News_model->updateNews($id, $slug, $title, $text)) {
$this->data['title'] = 'Успешно обновлено';
$this->load->view('templates/header', $this->data);
$this->load->view('news/edited');
$this->load->view('templates/footer');
}
}
else{
$this->load->view('templates/header', $this->data);
$this->load->view('news/edit', $this->data);
$this->load->view('templates/footer');
}
}
PHP 7.4.4 (cli) (built: Mar 17 2020 13:49:19). Без ошибок и дополнительных isset.