#php #mysql
#php #mysql
Вопрос:
Я хочу выполнить прозрачное ведение журнала mysql_error в моем php-приложении. Я уже сделал следующее:
function mysql_query_log_error($query) {
$debug_trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
$caller = $debug_trace[1];
$file = substr($caller[file], strrpos($caller[file], '/') 1);
$line = $caller[line];
$error = mysql_error();
$error_query = "INSERT INTO Common.ERRsql SET "
."errQuery = '".mysql_real_escape_string($query)."', "
."errText = '".mysql_real_escape_string($error)."', "
."errDate = NOW(), "
."errFile = '".mysql_real_escape_string($file)."', "
."errLine = '".mysql_real_escape_string($line)."' ";
mysql_query($error_query);
}
function mysql_query_log($query) {
$result = mysql_query($query) or mysql_query_log_error($query);
return $result;
}
Но когда я читаю mysql_error()
в mysql_query_log_error()
функции, исходный вызывающий не может получить доступ к mysql_error()
(потому что он возвращает пустую строку, поэтому она «считывается»).
Как я могу сделать это прозрачным способом, я имею в виду, mysql_error()
останется нетронутым?
Комментарии:
1. вам не кажется, что использовать то же хранилище, которое только что выдало ошибку, не слишком разумно?
2. ну да, но большинство ошибок возникло из-за неправильных инструкций SQL (изменено имя таблицы, изменены столбцы, неправильная обработка строк и т.д.).
Ответ №1:
Вы присваиваете исходную ошибку переменной, а затем передаете эту переменную в функцию. Нет необходимости пытаться дублировать ошибку, когда вы можете получить ее один раз и сохранить в переменной.
Комментарии:
1. Но таким образом, я должен изменить исходный код вызывающего абонента, чтобы получить сообщение об ошибке из переменной. Но, ну да, я мог бы изменить
mysql_error()
таким же образомmysql_error_my()
и обрабатывать глобальную переменную в этом.
Ответ №2:
Это должно выполнить то, что вы пытаетесь сделать :
function mysql_query_log_error($query, $error) {
$debug_trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
$caller = $debug_trace[1];
$file = substr($caller[file], strrpos($caller[file], '/') 1);
$line = $caller[line];
$error_query = "INSERT INTO Common.ERRsql SET "
."errQuery = '".mysql_real_escape_string($query)."', "
."errText = '".mysql_real_escape_string($error)."', "
."errDate = NOW(), "
."errFile = '".mysql_real_escape_string($file)."', "
."errLine = '".mysql_real_escape_string($line)."' ";
mysql_query($error_query);
}
function mysql_query_log($query) {
$result = mysql_query($query) or mysql_query_log_error($query, mysql_error());
return $result;
}
В вашей функции mysql_query_log вы будете напрямую сохранять ошибку в переменной.
Комментарии:
1. Нет, я хочу изменить
mysql_query()
вызовы в моем приложении наmysql_query_log()
без изменений в исходном коде. И некоторые случаи в исходном коде, который они используютmysql_query()or die(mysql_error())
, но если я изменю его наmysql_query_log()or die(mysql_error())
mysql_error(), вернет пустую строку, потому что я прочитал ее вmysql_query_log_error()