Showing all errors and warnings [duplicate]
After restarting Apache, I still get no errors/warnings. UPDATE 1: I have changed error_reporting in php.ini from:
But the page will still not display errors/warnings of any kind. ORIGINAL QUESTION: The following script is generating a warning because the $err being inside the if statement. Why is this warning not being displayed on the PHP page in a web browser? I have to look at the Apache logs to see the warning. Also, if I deliberately change the «insert into» to «delete into», it does not display an error on the PHP page. Why are the errors not displaying on the actual PHP page?
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $STH = $DBH->prepare("delete into table1 (display_name, email, password) values ( :display_name, :email, :password )"); $STH->bindParam(':display_name', $_POST['display_name'], PDO::PARAM_STR, 100); $STH->bindParam(':email', $_POST['email'], PDO::PARAM_STR, 100); $STH->bindParam(':password', $_POST['password'], PDO::PARAM_STR, 100); $STH->execute(); $STH = $DBH->prepare("delete into table2 ( username, status, users_id ) values ( :username, :status, :users_id )"); $strStatus = 1; $STH->bindParam(':username', $_POST['display_name'], PDO::PARAM_STR, 100); $STH->bindParam(':status', $strStatus, PDO::PARAM_INT, 1); $STH->bindParam(':users_id', $_POST['referer'], PDO::PARAM_INT, 1); $STH->execute(); $DBH = null; > catch (PDOException $e) < echo $e->getMessage(); > header("Location: " . $_SERVER['PHP_SELF']); exit; > else < foreach ($_POST as $key =>$val) < $form[$key] = htmlspecialchars($val); >> > else < $form['display_name'] = $form['email'] = $form['password'] = ''; >?> ?> Register
Please re-read my question, we already know your error_reporting setting because it is in the script.
Please re-re-read my question. display_errors is entirely different from error_reporting . Also, your script overrides the error_reporting value set in the INI file.
6 Answers 6
Display errors could be turned off in the php.ini or your Apache configuration file.
You can turn it on in the script:
error_reporting(E_ALL); ini_set('display_errors', '1');
You should see the same messages in the PHP error log.
@oshirowanen ini_set() does not actually change the php.ini file, the script only «acts» like it is set like that in php.ini . From manual: Sets the value of the given configuration option. The configuration option will keep this new value during the script’s execution , and will be restored at the script’s ending .
@Charles Why would E_ALL remove E_NOTICE ? Doesn’t E_ALL by itself including everything, including E_NOTICE?
I was able to get all errors via the below code:
ini_set('display_startup_errors', 1); ini_set('display_errors', 1); error_reporting(-1);
error_reporting(-1); should not be used. It may not work on every system. Instead should be error_reporting(E_ALL);
error_reporting(-1) should work just fine as it is given as example here: php.net/manual/en/function.error-reporting.php
The values for ini_set should actually be strings, such as ini_set(‘display_errors’, ‘1’); as per documentation and this is enforced when using strict typing (eg, declare(strict_types=1); )
PHP errors can be displayed by any of below methods:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
Straight from the php.ini file:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Error handling and logging ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This directive informs PHP of which errors, warnings and notices you would like ; it to take action for. The recommended way of setting values for this ; directive is through the use of the error level constants and bitwise ; operators. The error level constants are below here for convenience as well as ; some common settings and their meanings. ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT ; those related to E_NOTICE and E_STRICT, which together cover best practices and ; recommended coding standards in PHP. For performance reasons, this is the ; recommend error reporting setting. Your production server shouldn't be wasting ; resources complaining about best practices and coding standards. That's what ; development servers and development settings are for. ; Note: The php.ini-development file has this setting as E_ALL. This ; means it pretty much reports everything which is exactly what you want during ; development and early testing. ; ; Error Level Constants: ; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) ; E_ERROR - fatal run-time errors ; E_RECOVERABLE_ERROR - almost fatal run-time errors ; E_WARNING - run-time warnings (non-fatal errors) ; E_PARSE - compile-time parse errors ; E_NOTICE - run-time notices (these are warnings which often result ; from a bug in your code, but it's possible that it was ; intentional (e.g., using an uninitialized variable and ; relying on the fact it is automatically initialized to an ; empty string) ; E_STRICT - run-time notices, enable to have PHP suggest changes ; to your code which will ensure the best interoperability ; and forward compatibility of your code ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's ; initial startup ; E_COMPILE_ERROR - fatal compile-time errors ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) ; E_USER_ERROR - user-generated error message ; E_USER_WARNING - user-generated warning message ; E_USER_NOTICE - user-generated notice message ; E_DEPRECATED - warn about code that will not work in future versions ; of PHP ; E_USER_DEPRECATED - user-generated deprecation warnings ; ; Common Values: ; E_ALL (Show all errors, warnings and notices including coding standards.) ; E_ALL & ~E_NOTICE (Show all errors, except for notices) ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ; Development Value: E_ALL ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT ; http://php.net/error-reporting error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
For pure development I go for:
error_reporting = E_ALL ^ E_NOTICE ^ E_WARNING
Also don’t forget to put display_errors to on
After that, restart your server for Apache on Ubuntu:
sudo /etc/init.d/apache2 restart
Как включить вывод ошибок PHP
Хостинг-провайдеры нередко отключают или блокируют вывод всех ошибок и предупреждений. Такие ограничения вводятся не просто так. Дело в том, что на рабочих серверах крайне не рекомендуется держать ошибки в открытом доступе. Информация о неисправностях может стать «наживкой» для злоумышленников.
При этом в процессе разработки сайтов и скриптов, очень важно отслеживать возникающие предупреждения. Знать о сбоях и неисправностях также важно и системным администраторам — это позволяет предотвратить проблемы на сайте или сервере.
Самый оптимальный вариант — не просто скрыть показ ошибок, но и настроить запись о них в логах. Это позволит отслеживать предупреждения и не подвергать сервер угрозе.
В статье мы расскажем, как включить и отключить через .htaccess вывод ошибок php, а также двумя другими способами — через скрипт PHP и через файл php.ini.
Обратите внимание: в некоторых случаях изменение настроек вывода возможно только через обращение в техническую поддержку хостинга.
Через .htaccess
Перейдите в каталог сайта и откройте файл .htaccess.
Вариант 1. Чтобы включить вывод, добавьте следующие строки:
php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on
Чтобы отключить ошибки PHP htaccess, введите команду:
php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off
Также выключить .htaccess display errors можно командой:
php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off php_value docref_root 0 php_value docref_ext 0
Через логи PHP
Если вам нужно проверить или выключить ошибки только в определенных файлах, это можно сделать с помощью вызова PHP-функций.
Вариант 1. Чтобы включить вывод, используйте команду error_reporting. В зависимости от типа ошибок, которые вы хотите увидеть, подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
А для всех типов, исключая тип Notice, так:
error_reporting(E_ALL & ~E_NOTICE)
Чтобы отключить вывод, введите команду:
Чтобы отключить логирование повторяющихся ошибок, введите:
# disable repeated error logging php_flag ignore_repeated_errors on php_flag ignore_repeated_source on
Вариант 2. Чтобы проверить конкретный кусок кода, подойдет команда ниже. В зависимости от типа ошибок, которые вы хотите увидеть, в скобках подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
ini_set('display_errors', 'On') error_reporting(E_ALL)
После этого в консоли введите:
ini_set('display_errors', 'Off')
Вариант 3. Ещё один из вариантов подключения через скрипт:
php_flag display_startup_errors on php_flag display_errors on
php_flag display_startup_errors off php_flag display_errors off
Вариант 4. Чтобы настроить вывод с логированием через конфигурацию веб-сервера, введите:
- для Apache — ErrorLog «/var/log/apache2/my-website-error.log» ,
- для Nginx — error_log /var/log/nginx/my-website-error.log .
Подробнее о других аргументах читайте в документации на официальном сайте php.net.
Через файл php.ini
Настроить отслеживание также можно через файл php.ini. Этот вариант подойдет, когда отображение или скрытие ошибок нужно настроить для всего сайта или кода. Обратите внимание: возможность настройки через файл php.ini есть не у всех, поскольку некоторые хостинг-провайдеры частично или полностью закрывают доступ к файлу.
Вариант 1. Если у вас есть доступ, включить вывод можно командой:
После этого нужно перезагрузить сервер:
sudo apachectl -k graceful
Вариант 2. Чтобы включить вывод, используйте команду error_reporting. В зависимости от типа ошибок, которые вы хотите увидеть, после знака = подставьте нужное значение. Например, команда для вывода всех ошибок будет выглядеть так:
error_reporting = E_ALL display_errors On
После ввода перезагрузите сервер:
sudo apachectl -k graceful
Чтобы скрыть отображение, во второй строке команды укажите Оff вместо On:
Теперь вы знаете, как настроить не только через PHP и php.ini, но и через htaccess отображение ошибок.