2011-10-18 20 views
0

當首次開發PHP應用程序(MySQl,但使用ODBC接口以允許將來擴展時)時,我只是將我的SQL分配給一個變量並調用odbc_exec()如何監控SQL(使用準備好的狀態)?

這使得調試變得簡單,因爲我只需要檢查我的變量$sql

當然,我很快意識到我必須使用預處理語句來清理用戶輸入。

我的問題是如何發現在數據庫中執行的確切SQL,以便調試我準備好的語句。

我重申,我不能從PHP做到這一點,但他們的任何外部顯示器工具,可以interecpt SQL?或者甚至是一個MySql命令來回顯,如果我離開一個控制檯窗口打開?

回答

1

您可以通過--log[=file_name]啓動mysql服務器來創建日誌文件。

0

這裏有一些代碼可以幫助我們在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);