2013-03-09 39 views
0

我的網站上的搜索模塊出現問題。我使用此代碼:我的網站上的搜索模塊出現問題

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年,它也可以正常工作,但如果搜索保時捷,我不會得到任何結果。這是爲什麼?我的代碼有什麼問題?

+0

注意,簡寫'限制?偏移?'會是'極限?,?'。我更喜歡它,但個人喜好:) – webnoob 2013-03-09 18:02:50

+0

我會看str_replace代碼。也許你可以var_dump它的結果並得到一個線索。從<選擇name = 「類別」> – Ateszki 2013-03-09 18:10:38

回答

1

CONCAT(?, '%')意味着你尋找誰由搜索詞開頭的單詞。

所以2009年是第一個這樣說,爲什麼它返回。如果你想獲得的第二個字嘗試使用此

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

或就這樣

CONCAT("'",?, "'") 
+0

值是整數,如果我搜索保時捷和離開<選項值= 「所有」>所有分類選擇,$ stmt-> bindValue(2,(int)的$ _POST ['類'],PDO :: PARAM_INT);不適用 – 2013-03-09 18:10:15

+0

編輯我的回答 – 2013-03-09 18:15:41

+0

使用CONCAT('%',?,'%')的作品,謝謝。另一個問題是我的代碼現在有多安全? – 2013-03-09 18:19:45