Прозрачное ведение журнала mysql_error: как я могу прочитать mysql_error() дважды?

#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()