こんにちは仲間のOverflowians、
PHP PDO ステートメントと MySQL を使用しています。管理者がMySQLクエリの後半に入力してデータベースに保存できるようにする、安全な管理フォームがあります。たとえば、クエリの最初の部分は次のとおりです。
SELECT COUNT(1) AS count, SUM(`url_count`) AS total
FROM `table_name` WHERE `tablekey_id` = 1
sql_count
また、ユーザーは次のものをデータベースの列に保存できます。
AND `row_is_live` = 1 AND `title` > '';
したがって、プログラムでクエリを実行したいのですが、ユーザーが入力したクエリは失敗する可能性があります。したがって、クエリが失敗するかどうかをテストして、失敗する場合は、プログラムを停止しないように何か他のことをしたいと思います。
ここに私が取り組んでいるコードがあります。現在、try catch ブロックを試していますが、コードの実行が停止します。
$table = new PatternsGenerator($baseDomain, true);
$sectionRowsQuery = $db->getTopLevelPatternRows($sectionId);
$returnArray = array();
$index = 1;
while ($row = $sectionRowsQuery->fetch()) {
if(isset($row['sql_count']) && strlen($row['sql_count']) > 0) {
try {
$counts = $db->getCountsWithStoredQuery($row['sql_count']);
throw new Exception("This is an exception");
} catch (Exception $e) {
$counts = array('total' => 1, 'count' => 0);
}
} else {
$counts = array('total' => 0, 'count' => 0);
}
$table->getTopLevelRow_1($returnArray, $row['title'], $counts, $row['id'], $index);
$index++;
}
... more code ....
私の質問は、MySQL クエリをテストして、残りのコードの実行を停止せずに失敗するかどうかを確認するにはどうすればよいですか? よろしくお願いします。
編集:
問題が見つかりました。関数 getCountsWithStoredQuery($storedQuery) が fetchAll() を試みていました。そのため、クエリが失敗した場合、fetchAll() が実行され、プログラムは失敗しました。クエリが正常に完了した後に実行されるように、fetchAll() を try ブロックに移動するだけで済みました。
この質問を真剣に受け止めてくれた皆さんに感謝します。