В кодеигнитре, как вы знаете, страница формы: /class/function/ID
, где class – имя контроллера, функция – это метод внутри контроллера, а ID – это параметр, который нужно передать этому методу.
Типичным использованием будет (например, для книжного сайта) передать идентификатор книги функции, которая затем будет запрашивать базу данных для соответствующей книги. Моя проблема заключается в следующем: я беспорядочно и беспорядочно (в строке url) набрал идентификатор, отсутствующий в базе данных (с обычной точкой и просмотром страниц, это никогда не произойдет), и я получаю ошибки базы данных из-за остаточных запросов Я пытаюсь выполнить использование несуществующего идентификатора.
Я написал код, чтобы проверить, нет ли каких-либо строк, прежде чем пытаться использовать ID, но если идентификатор отсутствует, я хотел бы, чтобы пользователь получил страницу ошибки 404, а не пустую страницу или что-то в виду (так как это похоже на надлежащая функциональность). Это должно быть истинная 404 страница (а не просто загрузка вида, похожего на страницу 404), чтобы не закручивать поисковые системы. Хорошо – так мой вопрос таков: в нормальном потоке логики программы (как описано выше), как я могу заставить ошибку 404 использовать codeigniter? Благодарю.
Обновление : у воспламенителя кода есть show_404('page')
но я не думаю, что это приведет к истинной ошибке HTTP 404 …
show_404()
фактически отправляет соответствующие заголовки для поисковой системы, чтобы зарегистрировать ее как страницу 404 (она отправляет статус 404).
Используйте Firefox-аддон для проверки заголовков, полученных при вызове show_404()
. Вы увидите, что он отправляет правильный код состояния HTTP.
Проверьте application/errors/error_404.php
по умолчанию application/errors/error_404.php
. Первая строка:
<?php header("HTTP/1.1 404 Not Found"); ?>
Эта строка устанавливает статус HTTP как 404. Это все, что вам нужно, чтобы поисковая система читала вашу страницу как страницу 404.
Если вы хотите создать страницу с пользовательскими ошибками, вы можете сделать следующее. В ваших библиотеках создайте имя файла MY_Exceptions и расширьте его с помощью CI_Exceptions . Затем переопределите функцию show_404 (). В этой функции теперь вы можете создать экземпляр класса Controller используя функцию get_instance (). Используя этот экземпляр, вы можете загрузить свою страницу 404 Error.
class MY_Exceptions extends CI_Exceptions { public function __construct(){ parent::__construct(); } function show_404($page = ''){ // error page logic header("HTTP/1.1 404 Not Found"); $heading = "404 Page Not Found"; $message = "The page you requested was not found "; $CI =& get_instance(); $CI->load->view('/*Name of you custom 404 error page.*/'); }
Только следуйте этим шагам:
Шаг 1 Обновите файл приложения / config / routes.php
$route['404_override'] = 'error/error_404';
Шаг 2 Создайте собственный контроллер в папке контроллеров ex. error.php
<?php class Error extends CI_Controller { function error_404() { $data["heading"] = "404 Page Not Found"; $data["message"] = "The page you requested was not found "; $this->load->view('error',$data); } } ?>
Шаг 3 Создайте свой просмотр в папке views ex. error.php
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" /> <title><?php echo $heading;?></title> </head> <body> <?php echo $message;?> </body> </html>
$this->output->set_status_header('404');
для генерации 404 заголовков.
Да show_404 () Отправляет 404, но это похоже на ад. Здесь было предложено несколько хаков, но зачем взломать, когда вы можете использовать встроенные функции?
Перейдите на CI 2.0, и вы сможете использовать потрясающие:
$route['404_override'] = 'errors/error_404';
Тогда вы можете иметь общий контроллер ошибок, не беспокоясь о том, чтобы загружать представления, библиотеки и помощники WY слишком рано в экземпляре CI для правильной работы.
попробуйте использовать это
set_status_header(404);
Создайте контроллер в папке приложений / контроллеров.
class Error extends Controller { function error_404() { $this->load->view('error'); } }
Затем в вашем приложении / библиотеке расширьте класс Router, создав приложение / библиотеки / MY_Router.php
class MY_Router extends CI_Router { private $error_controller = 'error'; private $error_method_404 = 'error_404'; function MY_Router() { parent::CI_Router(); } // this is just the same method as in Router.php, with show_404() replaced by $this->error_404(); function _validate_request($segments) { // Does the requested controller exist in the root folder? if(file_exists(APPPATH.'controllers/'.$segments[0].EXT)) { return $segments; } // Is the controller in a sub-folder? if(is_dir(APPPATH.'controllers/'.$segments[0])) { // Set the directory and remove it from the segment array $this->set_directory($segments[0]); $segments = array_slice($segments, 1); if(count($segments) > 0) { // Does the requested controller exist in the sub-folder? if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) { return $this->error_404(); } } else { $this->set_class($this->default_controller); $this->set_method('index'); // Does the default controller exist in the sub-folder? if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) { $this->directory = ''; return array(); } } return $segments; } // Can't find the requested controller... return $this->error_404(); } function error_404() { $segments = array(); $segments[] = $this->error_controller; $segments[] = $this->error_method_404; return $segments; } function fetch_class() { // if method doesn't exist in class, change // class to error and method to error_404 $this->check_method(); return $this->class; } function check_method() { $class = $this->class; if (class_exists($class)) { if ($class == 'doc') { return; } if (! in_array('_remap', array_map('strtolower', get_class_methods($class))) && ! in_array(strtolower($this->method), array_map('strtolower', get_class_methods($class)))) { $this->class = $this->error_controller; $this->method = $this->error_method_404; include(APPPATH.'controllers/'.$this->fetch_directory().$this->error_controller.EXT); } } }
}
Если страница не существует, она будет перенаправлена на контроллер ошибок
У меня была такая же проблема с вами, и я нашел полное решение для этого в CodeIgniter 3. Здесь я хотел бы поэтапно поработать над ее решением. Конечно, нам нужно поддерживать пользовательскую страницу 404, чтобы удовлетворить потребности SEO.
class ErrorController extends CI_Controller { public function __construct() { parent::__construct(); } public function index() { $this->output->set_status_header('404'); return $this->load->view('errors/error_404'); } }
<div> <p>We are so sorry. The page you requested could not be found.</p> </div>
$route['404_override'] = 'ErrorController';
$config['subclass_prefix'] = 'MY_';
class MY_Exceptions extends CI_Exceptions { public function __construct() { parent::__construct(); } function show_404($page = '', $log_error = TRUE) { $CI = &get_instance(); $CI->output->set_status_header('404'); $CI->load->view('errors/error_404'); echo $CI->output->get_output(); exit; } }
abstract class MY_Model extends CI_Model { protected $table = 'table_name'; public function __construct() { parent::__construct(); $this->load->database(); } public function find($id) { $result = $this->db->get_where($this->table, ['id' => $id]); $data = $result->row_object(); if (!$data) { show_404(); } return $data; } }