0

Webサイトの検索モジュールに問題があります。私はこのコードを使用しています:

    if(!isset($_POST['search'])) {
$query = "SELECT id, title FROM cars ORDER BY id LIMIT ? OFFSET ?";
}
if(isset($_POST['search']) && $_POST['categories'] != "all") {
$query = "SELECT id, title FROM cars WHERE title LIKE CONCAT(?, '%') ESCAPE '+'  AND category = ? ORDER BY id LIMIT ? OFFSET ?";
}
if(isset($_POST['search']) && $_POST['categories'] == "all") {
$query = "SELECT id, title FROM cars WHERE title LIKE CONCAT(?, '%') ESCAPE '+' ORDER BY id LIMIT ? OFFSET ?";
}
try { 
    $stmt = $db->prepare($query); 
    if(!isset($_POST['search'])) {
        $stmt->bindValue(1, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(2, (int) $offset, PDO::PARAM_INT);
    }
    if(isset($_POST['search']) && $_POST['categories'] != "all") {
        $search= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $_POST['search']);
        $stmt->bindValue(1, $search, PDO::PARAM_STR);
        $stmt->bindValue(2, (int) $_POST['categories'], PDO::PARAM_INT);
        $stmt->bindValue(3, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(4, (int) $offset, PDO::PARAM_INT);
    }
    if(isset($_POST['search']) && $_POST['categories'] == "all") {
        $search= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $_POST['search']);
        $stmt->bindValue(1, $search, PDO::PARAM_STR);
        $stmt->bindValue(2, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(3, (int) $offset, PDO::PARAM_INT);
    }
    $stmt->execute(); 
} 
catch(PDOException $ex) { 
    die("Failed to run query: " . $ex->getMessage()); 
} 
$cars = $stmt->fetchAll(); 

私の検索フォームは次のようになります。

<input name="search" type="text" size="20" maxlength="20" />
<select name="categories">
    <option value="all">All Categories</option>
    <option value="1">Free</option>
    <option value="2">In use</option>
    <option value="3">Damaged</option>
</select>

車の表では、各タイトルは次のようになります。2009ポルシェ911(年式モデル)検索するとき、検索ボックスに入力しなくても、2009を検索しても問題なく機能しますが、ポルシェ、結果が出ません。何故ですか?私のコードの何が問題になっていますか?

4

1 に答える 1

1

CONCAT(?, '%')search-wordで始まる単語を検索することを意味します。

したがって、2009年が最初の単語であるために返されます。2番目の単語を取得したい場合は、これを使用してみてください

    CONCAT('%',?, '%')

またはちょうどそのように

    CONCAT("'",?, "'")
于 2013-03-09T18:05:09.773 に答える