0

書籍データベースの検索エンジンを作成しています。完全一致検索と類似検索のラジオ ボタンがあります。私のクエリは、完全一致検索の SQL クエリをどのように生成すればよいかということです。たとえば、フィールドとして ISBN とタイトルがあります。同様に多くのフィールドがあり、それらを空のままにしておくこともできます。このクエリの SQL クエリをどのように生成すればよいですか?

たとえば、タイトルが入力され、isbn が入力されている場合は、

select * from book_info where isbn="$_POST['isbn']" and title="$_POST['title']"

10 個のフィールドが入力されている場合、どのように生成すればよいですか? フィールドが空かどうかを確認することが解決策です。しかし、これよりも良い解決策はありますか?

4

3 に答える 3

4

次のコードのように、すべてのオプションをリストに入れることができます。

$search = array("isbn" => $_POST['isbn'],
                "title" => $_POST['title'],
                "table_field" => $input_value);

次に、for each ループを使用して条件部分を作成します。

$sql = "SELECT * FROM book_info";
$condition = "";
foreach($search as $key => $value) {
    if (isset($value) && ($value != "")) {
        if ($condition != "") {
            $condition .= " AND ";
        }
        $condition .= "{$key}=:{$key}";
    }
}

準備ステートメントを使用して SQL インジェクションを防ぎます。

$sh = $db->prepare($sql . " WHERE " . $condition);
foreach($search as $key => $value) {
    if (isset($value) && ($value != "")) {
        if ($condition != "") {
            $condition .= " AND ";
        }
        $sh->bindValue(":{$key}", $value);
    }
}
于 2013-07-28T04:59:09.897 に答える
2

xkcd

それはさておき、本題に入る...

次のようなことを試してください:

$allowed_keys = ["isbn","title",...]; // or array("isbn"...) if you're not up-to-date
$postvars = array_intersect_key($_POST,array_flip($allowed_keys));
$conditions = []; // or array(); for old PHP
foreach($postvars as $k=>$v) {
    $conditions[] = "`".$k."`='".mysql_real_escape_string($v)."'";
    // use whatever function is suitable for the library you're using
    // I'm assuming the basic mysql library, based on your injection vulnerability
}
if( $conditions) {
    $query = "select * from `book_info` where ".implode(" and ",$conditions);
    // run query
}
于 2013-07-28T04:59:39.197 に答える