2017-08-25 9 views
1

try/catchエラーの完全なSQLステートメントを識別しようとしています。ループされたSQLステートメントのtry/catch

try { 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $conn->beginTransaction(); 

    for($counter=0;$counter<sizeof($sql);$counter++) { 
     $query = $conn->prepare($sql[$counter]); 
     $conn->exec($sql[$counter]); 
    } 
    $conn->commit(); 
} catch (Exception $e) { 
    $err_message = "Failed while saving process...."; 
    log_event('submit_scores.php', $err_message); 
    $err_message = "The following SQL statements were in the queue:"; 
    log_event('submit_scores.php', $err_message); 
    for($counter=0;$counter<sizeof($sql);$counter++) { 
     /* \t should be a tab character to indent the sql statements */ 
     $err_message = "\t" . $sql[$counter]; 
     log_event('submit_scores.php', $err_message); 
    } 

    $conn->rollBack(); 
    $message = "Failed: " . $e->getMessage(); 
    echo $message; 
    $err_message = "\t" . $message; 
    log_event('submit_scores.php', $err_message); 
    return; 
} 

これは現在、すべてのSQL文を(log_event関数を介して)ログファイルに記録します。これは、エラー(不適切なSQL文)を生成しますが、私の問題は、エラーメッセージがジェネリックであるということです。私は問題を見ることができます

2017-08-25 09:19:28 - submit_scores.php: Failed: SQLSTATE[42000]: Syntax 
error or access violation: 1064 You have an error in your SQL syntax; check 
the manual that corresponds to your MySQL server version for the right 
syntax to use near ',210,,  ,,, )' at line 4 

が、私は、ループ内のすべてのSQL文をログに記録しないことを好むだろう失敗したFULL SQL文を単に記録してください。

ご協力いただければ幸いです。

+2

内部で何を '$ sqlを[$カウンターを] '?そして、あなたは別のクエリを実行する*と*を実行していますか? – Qirel

答えて

0

例外が->exec()呼び出しによってスローされているので、あなたのtry /あなたのループにcatch、その後、ちょうどあなたが呼ばれる最後に実行を試みたクエリ参照移動することができます。

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->beginTransaction(); 

for($counter=0;$counter<sizeof($sql);$counter++) { 
    try { 
     $query = $conn->prepare($sql[$counter]); 
     $conn->exec($sql[$counter]); 
    } catch (Exception $e) { 
     echo "This is the query ($counter) that failed: " . $sql[$counter]; 
     $conn->rollBack(); 
     return; 
    } 
} 
$conn->commit(); 
+0

おかげでトム..それは素晴らしい仕事! – chasiv

0

すべてのsqlステートメントでcatchブロックまたはループに変数$counterを再利用しないでください。例外がスローされた時点で最後に失敗したステートメントは$sql[$counter]です。

したがって、すべてのステートメントをループする代わりに、$sql[$counter]だけを記録してください。

関連する問題