Ошибка trying to access array offset on value of type null. как добавить проверку?

1

 ВСЕМ ПРИВЕТ! 

Модуль 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 строках, включаю добавленную выше.

ПОМОГИТЕ РАЗОБРАТЬСЯ С ДОПОЛНИТЕЛЬНОЙ ПРОВЕРКОЙ, о которой речь шла выше!

СПАСИБО!

codeigniter

9 ответов

3
и код который я написал и его исходный код одинаковы....

Неужели так сложно скопировать из архива исходный код, развернуть базу из исходного кода и настроить codeigniter? У меня это с первого раза получилось и все заработало. Просто нужно быть внимательным, особенно когда настраиваешь apache и codeigniter.

1
Вот вы такие умные, говорите скачать архив последнего урока и т.п., но вас спрашивали про 8 урок, ни одного нормального ответа

Если запустить исходный код автора, все работает. Нужно уже у себя в коде смотреть и сравнивать в каком месте допустил ошибку.

1

я тоже с этим столкнулся и не могу решить... и почему наш учитель Нконов еще не ответил на это вопрос, или проблему? и код который я написал и его исходный код одинаковы.... в чем причина...??? что неправильно...???

0

Спасибо, student_aPnalwdy. Попробую еще так.

На форумах меня спрашивают то, на что я не в состоянии дать адекватный ответ. 

1

Вот ссылку на этот ресурс подсказали мне!!! 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;

вместо проблемных трех строк!

Единственное замечание: после обновления новости в полях выводятся ноли, вместо контекстных подсказок содержимого поля! 

Если кто знает как решить с нолями после обновления - напишите!

Спасибо!

1

в проверках вместо нолей нужно поставить кавычки и после обновления в полях остается контекстное значение!

        $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

Также, существует вероятность того, что в уроке автор не упомянул о какой-то детали, но у себя в коде он реализовал ее! Поскольку многие столкнулись с одной и той же проблемой. Поэтому, нужно проанализировать исходный код автора, найти отличия и пересмотреть урок повторно!

0

Вот вы такие умные, говорите скачать архив последнего урока и т.п., но вас спрашивали про 8 урок, ни одного нормального ответа

0

Как решил эту ошибку я:

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 разархивировал исходный код (из последнего урока)

Все работает, ошибок нет. Авторизация работает, редактирование и так далее. 

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

1

Какая версия 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.

Sign up or Log in to write an answer