Как отслеживать SQL (который использует подготовленные данные)? - PullRequest
0 голосов
/ 18 октября 2011

При первой разработке приложения PHP (MySQl, но с использованием интерфейсов ODBC для дальнейшего расширения) я просто назначал свой SQL переменной и вызывал odbc_exec().

Это сделало отладку простой, поскольку мне просто нужно было проверить мою переменную $sql.

Конечно, я скоро понял, что должен использовать подготовленные операторы для очистки ввода пользователя.

Мой вопрос заключается в том, как найти точный SQL, который выполняется в базе данных, для отладки моих подготовленных операторов.

Я повторяю, что я не могу сделать это из PHP, но есть ли у них какие-либо внешние инструменты мониторинга, которые могут перехватывать SQL? Или даже команду MySql для эха, если я оставлю окно консоли открытым?

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Вы можете запустить сервер MySQL с помощью --log[=file_name], чтобы получить файл журнала.

1 голос
/ 18 октября 2011

Использовать журнал запросов MySQL .

0 голосов
/ 19 октября 2011

Вот некоторый код, который я использую для отладки в коде PHP.

Однако, чтобы быть абсолютно уверенным в том, что выполняется MySql, остальные постеры верны.Посмотрите журнал запросов.

function OdbcPrepareAndExecute($sql, $parameter_array)
{
   if (substr_count($sql, '?') != count($parameter_array))
   {
      ob_start();
      var_dump($parameter_array);
      $parameter_array_dump .= ob_get_clean();

      ReportErrorAndDie('Invalid parameters', 
                        'Request to prepare ODBC statement "' . $sql .'" with ' .
                        substr_count($sql, '?') . ' place-holders, but ' . 
                        count($parameter_array) . ' parameters in array : ' .
                        $parameter_array_dump
                       );
   }


   LogDatabaseActivity('Prepare SQL "' . $sql . '"');

   $prepared_statement = @odbc_prepare($_SESSION['connection'], $sql);
   if($prepared_statement === False) 
   {
      ReportErrorAndDie('Database problem', 
                        'Could not prepare ODBC statement "' . $sql .'"');
   }

   LogDatabaseActivity('Execute prepared SQL statement with the following parameters:');
   ob_start();
   var_dump($parameter_array);
   $parameter_array_dump = ob_get_clean();
   LogDatabaseActivity($parameter_array_dump);

   $expanded_sql = $sql;
   for ($i = 0; $i < count($parameter_array); $i++)
   $expanded_sql = substr_replace($expanded_sql, 
                                  $parameter_array[$i], 
                                  strpos($expanded_sql, '?'), 
                                  1);

   LogDatabaseActivity('(preapred statement expands to "' . $expanded_sql . '")');

   $result = @odbc_execute($prepared_statement, $parameter_array);
...