если mysql_query() завершается с ошибкой, что делать?

#php #mysql #security

#php #mysql #Безопасность

Вопрос:

Иногда случается так, что mysql_query() не удается ВСТАВИТЬ данные, и я не знаю об этом. Итак, вопрос в том, как мне узнать, когда это произойдет?

Комментарии:

1. Я не думаю, что этот вопрос заслуживает отрицательных голосов. Это базовый, но достаточно хорошо сформулированный вариант, и ответы на данный момент были искренними. Вам, придуркам из шестого модуля, нужно это вырезать.

Ответ №1:

Цитирую страницу документации mysql_query :

Для SELECT , SHOW , DESCRIBE , EXPLAIN mysql_query() и других операторов, возвращающих результирующий набор, resource возвращает a FALSE при успешном выполнении или, , при ошибке.

Для других типов SQL-инструкций, INSERT , UPDATE DELETE , DROP mysql_query() и т.д., TRUE возвращается FALSE при успешном выполнении или, , при ошибке.

Итак, чтобы определить, произошла ошибка или нет, вы должны проверить возвращаемое значение вашего вызова mysql_query :

 $result = mysql_query('...');
if ($result === false) {
    // And error has occured while executing
    // the SQL query
}
  

Тогда, что вы можете сделать?

  • Ну, во-первых, вы можете записать ошибку в файл, который сможете проанализировать позже
  • И вы можете отобразить приятное сообщение об ошибке пользователя
    • т. е. что-то вроде «упс, на странице произошла ошибка«.

Однако помните: пользователю не нужно знать (и он не поймет) сообщение о технической ошибке, поэтому не отображайте его.

Комментарии:

1. Вам обязательно следует использовать mysql_error(), если вы получаете сбой запроса. Это не всегда ужасно полезно, особенно если у вас большой запрос. Но это может помочь вам определить, в чем может заключаться проблема.

Ответ №2:

Вы можете использовать mysql_error php.net/mysql_error чтобы получить лучшее объяснение, вы затем либо отображаете, либо регистрируете его в файле.

Ответ №3:

Одна проверка, которую я обычно выполняю, похожа на приведенную в примере

 $result = mysql_query( $query );
if ( !empty( $error = mysql_error() ) )
{
    echo 'Mysql error '. $error ."<br />n";
}
else
{
    // the query ran successfully
}
  

Это хорошая проверка для любого вида запросов

Комментарии:

1. приятный штрих, но в рабочей среде вам это не нужно, потому что толпа SQL-инъекторов будет знать, как использовать ваши слабые места намного проще.

Ответ №4:

предлагаю создать оболочку для mysql_query, которая обнаруживает сбой и где-нибудь регистрирует запрос плюс mysql_error

Ответ №5:

Если вы используете разумную клиентскую библиотеку, она выдаст исключение при сбое команды SQL, и вы можете изучить код ошибки программно, чтобы знать, что делать.

Если у вас нет кода, обрабатывающего этот конкретный путь к ошибке, вам, вероятно, следует запустить стандартный обработчик ошибок, который заносит ошибку, трассировку стека и некоторую другую отладочную информацию в журнал.

Ответ №6:

вы должны проанализировать свой sql. вы экранировали свои параметры? похоже, что это может быть проблемой. вы можете вставить свой sql, чтобы мы могли вам помочь.

для отображения ошибки вы можете, например.

 $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());
  

.

Комментарии:

1. Хотя это хороший ответ на определение того, что вызвало сбой, я не думаю, что это отвечает на то, что запрашивает OP. Я думаю, что OP хочет знать, как определить, когда произойдет сбой, а не что может вызвать его сбой.

Ответ №7:

Если причиной ошибки является взаимоблокировка, возможно, вы захотите повторить попытку.

Ответ №8:

Вы можете проверить, сколько строк MySQL вставил / обновил / удалил, выполнив этот запрос сразу после вашего запроса insert / update / delete.

 SELECT ROW_COUNT() as rows_affected
  

Если это возвращает 0 ошибку вставки. Если он возвращает 1 или больше, вы добились успеха.

Смотрите: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

Ответ №9:

Вероятно, вы можете проверить LAST_INSERT_ID() (mysql_insert_id() в PHP). При условии, что в вашей таблице есть столбец auto_increment.

Комментарии:

1. если mysql_insert_id() возвращает 0, а в вашей таблице есть столбец auto_increment, то последняя ВСТАВКА была выполнена с ошибкой. хотя я бы предпочел mysql_error.

2. -1, last_insert_id() покажет вам номер вставки из предыдущей вставки в (возможно, другой) таблице, если эта вставка завершилась с ошибкой. Не имеет никакого смысла вообще.