Почему изменилась ссылка новостей?
После выполнения урока 8 codeigniter (добавление формы редактирования новости) перестали работать ссылки на просмотр содержания новостей, т.е. с адреса http://kinomonster.com/news, при нажатии на Новость 1 - идет перенаправление на страницу http://kinomonster.com/view/news-1 (ошибка), потому что должна открываться страница http://kinomonster.com/news/view/news-1
Ссылки просмотра новостей работают нормально до момента выполнения задания по созданию формы редактирования новости. ЭТО ЖЕСТЬ. Целую неделю, прихожу после работы и начинаю заново в первого урока - все работает. И тут на 8 уроке слетает, хотя правок в модель/вид/контролер никаких не вношу - что отвечают за "блок" просмотра новостей.
Сегодня, AOMEI Backupper создал резервную копию каталога kimonoster на этапе, когда ссылки еще работали. Слетели. Удалил все содержание kinomonster и восстановил. Ссылки все равно не работают!
Подскажите, пожалуйста, где ошибка?
роутер
$route['news'] = 'news';
$route['news/create'] = 'news/create';
$route['news/edit'] = 'news/edit';
$route['news/(:any)'] = 'news/view/$1';
котроллер
defined('BASEPATH') OR exit('No direct script access allowed');
class News extends CI_Controller {
public function __construct () {
parent::__construct ();
$this->load->model('news_model');
}
public function index() {
$data['title'] = "Все новости";
$data['news'] = $this->news_model->getNews();
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}
public function view($slug = NULL) {
$data['news_item'] = $this->news_model->getNews($slug);
if (empty($data['news_item'])) {
show_404();
}
$data['title'] = $data['news_item']['title'];
$data['content'] = $data['news_item']['text'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
}
модель
class News_model extends CI_Model {
public function __construct () {
$this->load->database();
}
public function getNews ($slug = FALSE) {
if($slug === FALSE) {
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug'=>$slug));
return $query->row_array();
}
public function setNews ($slug, $title, $text) {
$data = array (
'title' => $title,
'slug' => $slug,
'text' => $text
);
return $this->db->insert('news', $data);
}
public function updateNews ($slug, $title, $text) {
$data = array (
'title' => $title,
'slug' => $slug,
'text' => $text
);
return $this->db->update('news', $data, array('slug'=>$slug));
}
}
вид
<h3><?php echo $title; ?></h3>
<p><?php echo $content; ?></p>
СПАСИБО!
5 ответов
Посмотрел код страницы с ошибкой (ctrl-U) и вспомнил, как удалось поправить ситуацию пару дней назад
внес изменение в цикл, ХОТЯ В УРОКЕ по-другому код записан.
Вообщем, ссылки начинают работать при таком виде цикла
<?php foreach ($news as $key => $value): ?>
<p><a href = "news/view/<?php echo $value['slug']; ?>"><?php echo $value['title']; ?></a></p>
<?php endforeach ?>
далее, пришлось и edit видоизменять
<?php foreach ($news as $key => $value): ?>
<p><a href = "news/view/<?php echo $value['slug']; ?>"><?php echo $value['title']; ?> | <a href = "news/edit/<?php echo $value['slug']; ?>">edit</a></p>
<?php endforeach ?>
в самом уроке ссылка имеет следующий вид и она работает сначала в моем коде
<?php foreach ($news as $key => $value): ?>
<p><a href = "view/<?php echo $value['slug']; ?>"><?php echo $value['title']; ?></a></p>
<?php endforeach ?>
ВАЖНО понять причину такого поведения!
Кто-то понимает суть причины?
Спасибо!
Код не трогал. Повносил изменения через edit в содержания новостей (добавил изменения в БД, вывел - посмотрел, через браузер....). Начал просматривать список новостей - и вновь изменились адреса ссылок - в адресах добавилось .../news/.,.. тоже ошибка вместо вывода страниц.
Изменил вновь тело цикла
<h1>Все новости</h1>
<?php foreach ($news as $key => $value): ?>
<p><a href = "view/<?php echo $value['slug']; ?>"><?php echo $value['title']; ?> | <a href = "edit/<?php echo $value['slug']; ?>">edit</a></p>
<?php endforeach ?>
и все нормально работает.
Мистика. Но в реальной проекте такая нестабильность работы - может обойтись очень дорого!
По какой причине так нестабильно работает код в отрезке времени отсутствия каких либо изменений в самом коде?
Спасибо, student_difqYdQc, сравню с кодом, что к 9 уроку прикреплен. Поскольку конечный файл (в конце курса) - другой, и об этом не упоминается во время презентации самого 8 урока, возможно далее по курсу будет идти речь! Так, в начало некоторых запросов добавлена запись $this.
при каждом добавлении или удалении с БД через форму новости, происходит изменение ссылки. Например, все работает, добавляю или удаляю новость, новость добавилась/удалилась. После чего появляется ошибка при просмотре/редактировании/удалении новости. Дописываю news/ в ссылки (index.php<-news<-view) - опять начинает все работать. Снова, добавляю или удаляю новость. Происходят изменения в БД. и та же ошибка со ссылками. Теперь нужно удалить news/со ссылок....
Взял исходный код автора для тестирования проблем, вышеописанных.
Поведение аналогичное со ссылками.
Но я заметил некую закономерность и думаю причина в этом!
Создал CRUD приложение для постов и подключил вывод постов на главную страницу.
Так, например, после нажатия кнопки читать открывается страница просмотра поста по адресу http://kinomonster.com/posts/view/posts-1
Соответственно ссылка на CRUD приложение
http://kinomonster.com/posts
и если я перехожу по ней, то действительно открывается список постов. НО РАБОТА С НИМИ СТАЕТ НЕВОЗМОЖНОЙ (при нажатии просмотр, редактирования - изменяются адреса ссылок). Изначально я действовал, как описывал ранее (периодически, от сбоя к сбою, корректировал адреса). Но все оказалось гораздо проще!
Для корректной работы CRUD приложения (новости, посты) в конце ссылки необходимо ставить / (слеш). То есть,
http://kinomonster.com/posts/
Итак, загрузил страницу http://kinomonster.com/posts - вывелись посты, но далее работать с ними невозможно. В адресной строке добавляю в конец / и перезагружаю страницу и все ГУД.
Возможно, некоторые люди воспринимают данную деталь как само-собой разумеющуюся аксиому, но мне как "новичку" пришлось целую неделю переписывать заново блок с новостями в поисках ошибки в коде, какую я так и не нашел! НО, за ту неделю я приспособился дописывать news/ потом убирать его, чтобы продолжать курс.
Возможно, так себя ведет PHP 7.4.2 (что уже обсуждалось при ошибке NULL, которая у автора отсутствует. Ее удалось мне обойти проверкой isset. XAMPP я не переустанавливал на версию РНР 7.2 (кажется ее рекомендовали)).
Если же дело не в XAMPP и версии PHP, тогда, полагаю, можно дописать файл .htaccess, чтобы по умолчанию дописывался / в конце адреса, в случае его отсутствия! Хотя CDUD приложение работает и в этом случае http://kinomonster.com/posts//edit/posts-1 (два слеша)
Надеюсь, эти наблюдения станут полезны еще для кого-то!
Также, было бы интересно услышать дополнение по данному поводу!
Проще я думаю исходный код развернуть из последнего урока и сравнить со своим кодом. Таких ошибок не наблюдаю.