#php #mysql #security
#php #mysql #Безопасность
Вопрос:
Иногда случается так, что mysql_query() не удается ВСТАВИТЬ данные, и я не знаю об этом. Итак, вопрос в том, как мне узнать, когда это произойдет?
Комментарии:
1. Я не думаю, что этот вопрос заслуживает отрицательных голосов. Это базовый, но достаточно хорошо сформулированный вариант, и ответы на данный момент были искренними. Вам, придуркам из шестого модуля, нужно это вырезать.
Ответ №1:
Цитирую страницу документации mysql_query
:
Для
SELECT
,SHOW
,DESCRIBE
,EXPLAIN
mysql_query()
и других операторов, возвращающих результирующий набор,resource
возвращает aFALSE
при успешном выполнении или, , при ошибке.Для других типов 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
}
Тогда, что вы можете сделать?
- Ну, во-первых, вы можете записать ошибку в файл, который сможете проанализировать позже
- Для этого вы можете использовать
mysql_error
иmysql_errno
.
- Для этого вы можете использовать
- И вы можете отобразить приятное сообщение об ошибке пользователя
- т. е. что-то вроде «упс, на странице произошла ошибка«.
Однако помните: пользователю не нужно знать (и он не поймет) сообщение о технической ошибке, поэтому не отображайте его.
Комментарии:
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() покажет вам номер вставки из предыдущей вставки в (возможно, другой) таблице, если эта вставка завершилась с ошибкой. Не имеет никакого смысла вообще.