За последние 24 часа нас посетили 23628 программистов и 1661 робот. Сейчас ищут 903 программиста ...

Проверка подключения файла: if (!include (...))

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 6 фев 2017.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте. Вопрос, может, глупый, но ничего путёвого я в гугле не нашёл. У меня есть несколько файлов в папке "pages", и в индексе я хочу их подключить, но если файл не найден - выдать ошибку, только не пхпшную, а человеко-понятную. Как бы это сделать? Конструкция
    PHP:
    1.     if ((include './pages/'.$page) == false) {
    2.         echo 'АШЫПКА';
    3.     }
    не работает, (Выводятся варнинги что файл не найден, и текст 'АШЫПКА' в коне. Но мне б без варнингов:)). Можно как-то сделать в одну строчку, или в несколько, но без перебора и поиска файлов?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    PHP:
    1. <?php
    2. try {
    3.     $file = '/path/file.php';
    4.     if (!file_exists($file)) {
    5.         throw new Exception ('Твою ж мать!... А куды файл-то делся?');
    6.     }
    7.     include $file;
    8.  
    9. } catch(Exception $e) {
    10.     echo $e->getMessage();
    11. }
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну так и я могу) Я же оговорил, без проверки файлов никак нельзя? Только так?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Можешь наговнокодить собаку для подавления варнинга об ошибке инклюда
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    -Ребят, мне бы дергать зубы научиться, пробую через задницу, все никак не получается.
    -Вот так вот, рот пациента открыл и готово.
    -Ну так и я могу, а без открытия рта никак нельзя?

    Ответ - тебе шашечки или ехать?
     
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Фу, так даже я не делаю)
    Ну я думал, может можно меньшим количеством кода обойтись как-то. Ну всё, понял, без проверки - никак:)
     
  7. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @SamyRed ерор_репорт в нолль сбросить? если @include удовлетворяет условиям задачи то почему нет?
     
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Каждый, уважающий себя программист не допускает репортов, даже если условия соблюдены.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Отличное решение проблемы. Закрыть на нее глаза.
     
  10. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Можно отключить php ошибки через .httaccess
    PHP:
    1. php_flag display_errors off
    2. #показать все ошибки кроме предупреждений (Notice)
    3. php_value error_reporting "E_ALL & ~E_NOTICE
    Источник
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @Danil005, ну не надо ерунду советовать. Возможность отключать вывод ошибок создана вовсе не для того, чтобы их можно было игнорить. Она нужна, чтобы сайт на продакшне, если вдруг в нём при отладке была пропущена какая-то ошибка (случайно!), не плюнул бы в конечного пользователя используемым SQL-запросом или именами файлов php, ну в общем тем, что пользователю знать не нужно, а вот хакеру было бы интересно :)
     
    Fell-x27 нравится это.
  12. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Если будут проблемы, то можно будет включить ошибки вновь.
     
  13. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Если будут проблемы связанные с вмешательством хакера, то включать ошибки, скорее всего, уже будет незачем ;)
     
    Fell-x27 и mahmuzar нравится это.
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Всё можно
    PHP:
    1. // Пример хандлера с php.net/manual/ru/class.errorexception.php#variable.post.basic
    2. function exception_error_handler($severity, $message, $file, $line) {
    3.     if (!(error_reporting() & $severity)) {
    4.         // Этот код ошибки не входит в error_reporting
    5.         return;
    6.     }
    7.     throw new ErrorException($message, 0, $severity, $file, $line);
    8. }
    9. set_error_handler("exception_error_handler");
    10. ////////
    11.  
    12. try {
    13.     include 'lol.php';
    14. } catch (ErrorException $e) {
    15.     // надо убедиться, что исключение пришло не из подключенного файла
    16.     // а именно из этой функции include
    17.     if ($e->getTrace()[1]['file'] === __FILE__
    18.         && $e->getTrace()[1]['function'] === 'include') {
    19.         echo 'Четыреста Четыре';
    20.     } else {
    21.         // левое исключение летит дальше
    22.         throw $e;
    23.     }
    24. }
    если нужно