Задать вопрос
@CynVox
CSS, HTML, JS далее TS & React

PHP Переадресация на ошибку?

Обучаюсь php по 2ому изданию "PHP и MySQL исчерпывающее руководство. Бретт Маклафлин".
(в учебнике используются mysql, я использую mysqli)


Застрял на 226 стр. где идет идет переадресация на страницу с ошибкой (show_error.php) в случае если неправильно введены данные при подключении в к mysql. У меня проблема, если в mysqli_connect ввожу неправильные данные (DB5_USERNAME), то страница выдает такую картину, и переадресация (на show_error.php) не срабатывает.

Такая картина
Warning: mysqli_connect() [function.mysqli-connect]: (28000/1045): Access denied for user 'DB5_USERNAME'@'localhost' (using password: YES) in D:\OpenServer\OpenServer\domains\Less\scripts\db_connection.php on line 6

Warning: Cannot modify header information - headers already sent by (output started at D:\OpenServer\OpenServer\domains\Less\scripts\db_connection.php:12) in D:\OpenServer\OpenServer\domains\Less\scripts\db_connection.php on line 7

Упростил код, до такого состояния (такая же проблема)
Исходный код
define("DB_HOST", "localhost");
define("DB_USERNAME", "Admin");
define("DB_PASS", "123");
define("DB_NAME", "Less");

if(!mysqli_connect(DB_HOST, DB5_USERNAME, DB_PASS)){
    header("Location: ../../scripts/show_error.php");
    exit();    
}

(p.s. приму совет по учебникам, с каких можно начать обучение php, mysql)
  • Вопрос задан
  • 165 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас, по видимому, включен вывод ошибок. Значит, в момент ошибки mysqli в буфер выводится первое сообщение, после чего вывод заголовков через header невозможен.
Запретите показ ошибок, добавив в начало файла строки
ini_set('display_errors', 0);
error_reporting(0);
Ответ написан
Sanovskiy
@Sanovskiy
Веб-разработчик с 2005 года
Как уже говорили
0. Давим вывод ошибок
ini_set('display_errors', 0);
error_reporting(0);
ini_set('log_errors', 'On');

1. Очень рекомендую для работы с БД использовать PDO.
mysqli морально устарел и есть подозрение, что его поддержка в скором времени прекратится

2. Не стоит хранить конфиги в константах. Гораздо удобнее описать класс конфига, и создавать его экземпляр, с указанием файла конфига. Пример
Файл конфига
<?php
return [
  'database' => [
    'host' => 'localhost',
    'name' => 'Less',
    'user' => 'Admin',
    'pass' => '123',
  ]
];


Код инициализации конфига
$config = new Config(include('/path/to/config.php'));

try {
    $pdo = new PDO(
        'mysql:host='.$config->database['host'].';dbname='.$config->database['name'],
        $config->database['user'],
        $config->database['pass'],
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING]
    );


    $stmt = $pdo->prepare('SELECT * FROM mytable WHERE login=:login');
    $stmt->execute([':login'=>'admin']);
    $admin = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) { 
    // Тут стоит логировать ошибку
    header("Location: /scripts/show_error.php");
    exit();
}


3. Не используйте относительные урлы типа ../../scripts.

4. Не советую в качестве учебника сайты вроде phpfaq.ru и подобные, так как практики описанные там еще пять лет назад уже были устаревшими. Используйте официальную документацию и, по возможности, версии PHP 7.1 и выше В случае проблемы, не описанной в официальной документации, обращайтесь на Тостер.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы