When you are sure your script is perfectly working, you can get rid of warning and notices like this: Put this line at the beginning of your PHP script:
error_reporting(E_ERROR);
Before that, when working on your script, I would advise you to properly debug your script so that all notice or warning disappear one by one.
So you should first set it as verbose as possible with:
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
UPDATE: how to log errors instead of displaying them
As suggested in the comments, the better solution is to log errors into a file so only the PHP developer sees the error messages, not the users.
A possible implementation is via the .htaccess file, useful if you don’t have access to the php.ini file (source).
# Suppress PHP 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
# Enable PHP error logging
php_flag log_errors on
php_value error_log /home/path/public_html/domain/PHP_errors.log
# Prevent access to PHP error log
<Files PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
I use error_reporting(0) code for hiding PHP errors,which always works ,but there are some errors from mysql which are useless, is there any code for mysql to hide the mysql errors like invalid sql ,1064 errors
asked Jul 25, 2012 at 23:23
5
Here’s an idea: Don’t.
Turn PHP error reporting back on right now, and FIX those errors instead of sweeping them under the rug.
Personally, I like to use error_reporting(E_ALL ^ E_NOTICE)
. While it’s not perfect, I ignore notices because the default behaviour is what I want to happen anyway.
Ignoring MySQL errors is a GREAT BIG HELL NO! … Well, unless you want a dead server and a million customers pissed at you.
answered Jul 25, 2012 at 23:26
$result = @mysql_operation();
$errno = mysql_errno();
if ($errno > 0)
{
handle_error();
}
answered Jul 26, 2012 at 0:19
dar7yldar7yl
3,72726 silver badges20 bronze badges
The @
in front of the function calls should suppress any errors generated.
It is the error control operator. I would use this very lightly and try to fix your code that is producing the errors/warning first.
The only time I would use the @
is when I use third party libraries that have deprecated code. Using it too much will mask any real issues (like the one you are having perhaps) when they do pop up and can make debugging very difficult.
answered Jul 25, 2012 at 23:29
XesuedXesued
4,1472 gold badges25 silver badges18 bronze badges
Warning
from php.net
- Currently the «@» error-control operator prefix will even disable
error reporting for critical errors that will terminate script
execution. - Among other things, this means that if you use «@» to suppress errors
from a certain function and either it isn’t available or has been
mistyped, the script will die right there with no indication as to
why.
from php.net
a better way to do :
Customize your own ideas. Only errors between Error-Lines or Error-Numbers
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline )
{
if (error_reporting() === 0)
{
return;
}
//example turn error OFF, between line 100 and 200
if ($errline<100 || $errline>200) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
} else return;
}
set_error_handler("exception_error_handler");
function catchException($e)
{
// Do some stuff
}
set_exception_handler('catchException');
?>
answered Jul 25, 2012 at 23:58
moskito-xmoskito-x
11.8k5 gold badges47 silver badges60 bronze badges
Im surprised I havent seen Exceptions thrown around yet.
Try/catch is a very effective method of customising runtime errors and exceptions and allowing your code to continue executing rather than halting.
class MySQLConnectException extends Exception{
public function __construct( $message ){
parent::__construct( $message );
}
}
try{
$mysql = new mysqli();
If( !$mysql )
Throw new MySQLConnectException('Failed to connect');
}
catch( MySQLConnectException $e ){
echo $e-> getMessage();
}
answered Jul 26, 2012 at 0:17
Mike MackintoshMike Mackintosh
13.9k6 gold badges60 silver badges87 bronze badges
mysqli_report
(PHP 5, PHP 7, PHP
mysqli_driver::$report_mode — mysqli_report — Sets mysqli error reporting mode
Description
Object-oriented style
Procedural style
As of PHP 8.1.0, the default setting is MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT
.
Previously, it was MYSQLI_REPORT_OFF
.
Parameters
-
flags
-
Supported flags
Name Description MYSQLI_REPORT_OFF
Turns reporting off MYSQLI_REPORT_ERROR
Report errors from mysqli function calls MYSQLI_REPORT_STRICT
Throw mysqli_sql_exception for errors
instead of warningsMYSQLI_REPORT_INDEX
Report if no index or bad index was used in a query MYSQLI_REPORT_ALL
Set all options (report all)
Return Values
Returns true
.
Changelog
Version | Description |
---|---|
8.1.0 |
The default value is now MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT .Previously, it was MYSQLI_REPORT_OFF .
|
Examples
Example #1 Object-oriented style
<?php/* activate reporting */
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;
try {
/* if the connection fails, a mysqli_sql_exception will be thrown */
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");/* this query should report an error */
$result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");/* this query should report a bad index if the column population doesn't have an index */
$result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}
Example #2 Procedural style
<?php/* activate reporting */
mysqli_report(MYSQLI_REPORT_ALL);
try {
/* if the connection fails, a mysqli_sql_exception will be thrown */
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");/* this query should report an error */
$result = mysqli_query($link, "SELECT Name FROM Nonexistingtable WHERE population > 50000");/* this query should report a bad index if the column population doesn't have an index */
$result = mysqli_query($link, "SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}
Example #3 Error reporting except bad index errors
<?php/* activate reporting */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
/* if the connection fails, a mysqli_sql_exception will be thrown */
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");/* this query should report an error */
$result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");/* this WILL NOT report any errors even if index is not available */
$result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}
See Also
- mysqli_sql_exception
- set_exception_handler() — Sets a user-defined exception handler function
- error_reporting() — Sets which PHP errors are reported
nineoclick (atsymbol) gmail (dot) com ¶
6 years ago
Seems not clear but flags *could be combined*, as per other flags.
For example:
<?php# wannabe noticed about all errors except those about indexes
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX;?>
welfordmartin at gmail dot com ¶
3 years ago
As a recommendaton on memory management please don't use the objective way your creating an object to specify one property and thats all your doing with it, much more effective both for the parser and for memory to use the proccedual style for setting the report flag.
Всем привет! Сегодня мы поговорим про отображение ошибок в PHP и чем это может быть опасно.
Обычно, когда вы разрабатываете проект, то у вас включено отображение всех ошибок. Это существенно помогает в разработке. Однако, если вы выкладываете свой сайт в production, это может привести к большой угрозе взлома. Давайте рассмотрим очень простой, но наглядный пример.
<?php
$db = new PDO('mysql:host=127.0.0.1;dbname=base', 'root', '12345');
?>
Здесь мы просто подключаемся к базе данных base, используя наш логин и пароль. Если сервер указан верно, то все будет нормально, в ином же случае вы увидите ошибку. Данная ошибка может очень сильно помочь злоумышленникам взломать вас, ведь она содержит очень важную информацию: структуру вашего проекта, ваш логин и пароль, название базы и сервера.
Чтобы избежать таких проблем, всегда нужно отключать отображение каких-либо ошибок на сайте, если вы выкладываете его в открытый доступ. Сделать это можно двумя способами.
Первый способ — отключить отображение ошибок в файле php.ini
display_errors=off
Но такая возможность есть не всегда. Тогда можно воспользоваться вторым способом.
Второй способ — отключить отображение ошибок с помощью PHP. Просто напишите в начале вашего главного файла проекта(обычно index.php) следующее:
ini_set('display_errors', 'off');
error_reporting(0);
Итак, на этом все. Это очень небольшая, но чрезвычайно важная тема, ведь многие, особенно начинающие веб-разработчики, допускают эту ошибку, что впоследствии приводит к неблагоприятным последствиям.
Спасибо за внимание!
-
Создано 19.10.2015 07:00:00
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
|
| |
Часто слышал о такой проблеме от других пользователей. Одним из-за хостера нужно скрыть появляющиеся ошибки, другим наоборот — понять, что происходит с их кодом, потому что ни одна ошибка не показывается. В этой статье постараюсь показать все основные способы отобразить / скрыть ошибки.
В скрипте PHP
1) В PHP есть всего лишь один оператор, который поддерживает систему управления ошибками — это знак @. Он позволяет проигнорировать сообщение любое сообщение об ошибке. Его нужно ставить ПЕРЕД выражением, которое может её содержать.
В примере специально допущена ошибка, но она НЕ будет отображена
$value = @$var[$key];
2) Также можно перед проверяемым скриптом PHP можно вставить настройку параметра отображения ошибок (display_errors). Он может приобретать значение либо On (показывать), либо Off (скрыть).
ini_set('display_errors','On'); error_reporting('E_ALL');
И соответственно после кода, который проверялся на ошибки, выставить параметр обратно.
ini_set('display_errors','Off');
Например, Вы хотите увидеть ошибки в скрипте
ini_set('display_errors', 'On'); // сообщения с ошибками будут показываться error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки $value = $var[$key]; // пример ошибки ini_set('display_errors', 'Off'); // теперь сообщений НЕ будет
Можно выставить наоборот (в верхнем off, а в нижнем on), чтобы в конкретном отрезке кода ошибки НЕ отображались.
В файле .htaccess
Чаще всего проблему решают именно указанием настроек в файле .htaccess, который располагается в корневой директории сайта. В строке php_flag display_errors нужно также выставить On или Off
php_flag display_errors On #показать все ошибки кроме предупреждений (Notice) php_value error_reporting "E_ALL & ~E_NOTICE"
Если Вам нужно работать с конкретным типом ошибок, то привожу основные их виды:
E_ALL — все ошибки |
В файле php.ini
Как видите, параметр можно указать в нескольких местах. Однако, если у Вы хотите, чтобы целиком на сайте этот параметр имел определённое значение, то проще выставить его в файле php.ini.(к нему на хостинге не всегда может быть доступ), но в этом случае можно будет даже обойти настройки всего хостинга
В php.ini:
error_reporting = E_ALL display_errors On
В верхней строке выбираем все виды ошибок, в нижней даём добро на их отображение.
После правок необходимо перезапустить Apache, чтобы настройки были изменены и вступили в силу (graceful или restart):
sudo apachectl -k graceful
В каком порядке обрабатывается параметр ошибок
В самом начале учитывается параметр php.ini , затем .htaccess , а после то, что указано непосредственно в скрипте PHP. Так что если что-то не сработало, то смотрим по цепочку выше, возможно, там настройка другая.
Как обычно спасибо за внимание и удачи! Надеюсь статья была полезна!
Предыдущая статья
Пример настройки файла htaccess php Следующая статья
Как подсчитать количество строк в файле PHP?