2017-09-24 101 views
1

我打算用下面的代碼爲100個汽車品牌展示一些銷售數字:MySQL的正則表達式字匹配

$brand = str_replace ('-', '[- ]', $_GET['brand']); 

$sql = "SELECT year, brand, number FROM `exampletable` WHERE brand REGEXP :brand ORDER BY `year` DESC"; 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(":brand", $brand); 
$stmt->execute(); 
if($stmt->rowCount()) 
{ while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
?> 
<?php echo $result['year'];?> 
<?php echo $result['number'];?> 

<?php }} else { echo '0'; } ?> 

下面這段代碼工作正常,在我的表98級的品牌,但有一個問題,下面的品牌,因爲它們包含了同一個詞:

  • 「雷諾」和「馬特拉雷諾」
  • 「大衆」和「大衆保時捷」

因此,「Matra Renault」的數字不僅出現在該品牌的特定網頁上,而且還出現在「雷諾」的網頁上。同樣的事情發生在「大衆汽車」,我也看到「大衆保時捷」的數字。

因此,我完全理解爲什麼我的代碼不起作用,但我沒有足夠的關於此主題的知識來尋找快速解決方案。我已經在這裏讀過較老的問題,但他們似乎沒有討論過同樣的問題。

注意:由於未來沒有其他數據會添加到我的表格中,所以專門針對上述品牌的解決方案就足夠了。

回答

2

問題是,你選擇REGEXP,而你顯然不需要它。正則表達式意味着Volkswagen將與品牌名稱中的任何內容匹配Volkswagen,因此您會得到其他不想要的結果,具體而言,因爲您的正則表達式只是整個品牌名稱。

請注意,順便說一句,搜索Volkswagen Porsche不會返回Volkswagen,因爲Porsche不在其中。見this simplified example vs this

你的問題的解決方案是簡單地選擇你所要尋找的=品牌的確切名稱:

$sql = "SELECT year, brand, number FROM `exampletable` WHERE brand = :brand ORDER BY `year` DESC"; 

而另一種解決方案,儘管總矯枉過正,將解決您的正則表達式完全匹配字詞:

$brand = "^".$brand."\$"; 

然後,它只會查找完全匹配。 See example

+0

當我使用'='時,例如,我將不會有像「Land Rover」這樣的兩個詞的品牌。 – Stan

+0

你爲什麼不呢? 「品牌」字段是否有任何修改?你試過了嗎?第二種解決方案如何? – ishegg

+0

第一行代碼:我得到的網址中的品牌名稱是land-rover。 表中存儲的品牌名稱是路虎。因此,當我使用'='時,我沒有得到任何結果。 – Stan