1

こんにちは仲間の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 ブロックに移動するだけで済みました。

この質問を真剣に受け止めてくれた皆さんに感謝します。

4

1 に答える 1

0

実際のところ、複数基準の検索と条件付きで作成されたクエリは、Web 開発では非常に簡単な作業です。

したがって、危険なコーナーを歩くのではなく、この一般的な方法に従って、ユーザーが SQL インジェクションを自由に実行できるようにすることをお勧めします。

ユーザーの選択に基づいてクエリ部分を追加して、一連の条件を作成することはそれほど問題ではありません。

しかし、まずそれを理解する必要があります

  • クエリが失敗することを意図する必要はありません
  • クエリに SQL を挿入することをユーザーに許可する必要はありません
于 2013-04-19T19:48:14.143 に答える