2014-01-21 60 views
0

我有問題。在MySQL中有一個相反的通配符,需要匹配字符串中的幾個字母嗎?

我有一個數據庫,包含英國郵政編碼的各種起點。舉例來說,布裏斯托爾的「bs」,洗浴等......

我想匹配時,有人鍵入那裏完整的郵政編碼英寸所以它會給城市取決於郵政編碼中的前幾個字母。

例如,有人類型'bs3 5qu'。我想要結果顯示布裏斯托爾,其中郵政編碼'bs'

在我的腦海中,這是一個通配符相反。但我無法找到一種辦法呢?

這是我得到的。

$location_query = mysql_query("SELECT * FROM search_locations WHERE location_postcode LIKE 'bs%'",$db_connect); 

有什麼建議嗎?

+0

你能分享你的表格描述嗎? search_locations中的列是什麼? –

+0

「某人類型'bs3 5qu'。我想要結果顯示布裏斯托爾,其中有郵編'bs'「 - 你的代碼應該已經這樣做。你是說它不這樣做? – user1477388

+0

是的,我目前的代碼不起作用。 –

回答

0

如果我瞭解您的問題,我不太確定,但我認爲這個查詢可能會對您有所幫助。

SELECT * FROM search_locations 
WHERE 'bs3 5qu' LIKE CONCAT(location_postcode,'%') 

它作爲一個「通配符相反」,串聯通配符到location_postcode代替用戶的輸入。

另一種選擇,如果我們假設郵政編碼是2個字符,是使用MySQL的左函數來獲得一個子如下:

SELECT * FROM search_locations 
WHERE location_postcode LIKE LEFT('bs3 5qu', 2) 

希望它能幫助!

-1

這個問題更多的是你的網絡服務器代碼比數據庫。如果您使用PHP來獲取用戶的輸入,這裏是一個例子,說明你會做到這一點:

<?php 

// Retrieve the user's input. 
$postCode = $_POST["postCode"]; 

// Sanitize, making sure it may only contain alpha-numerical characters for security and make lower-case. 
$postCode = strtolower(preg_replace("/[^a-z]/i", "", $postCode)); 

// Retrieve the first two characters from the user's input. 
$postCode = substr($postCode, 0, 2); 

// Now query the database like you did before. 
$location_query = mysql_query("SELECT * FROM search_locations WHERE location_postcode LIKE '" . $postCode . "%'",$db_connect); 
+0

這麼多不必要的代碼。只需使用準備好的語句和一個非棄用的API('mysqli_'或'PDO' ) – Kermit

+0

是的,準備好的語句比較好,但是開始談論用於數據庫的方法似乎是OT。 –

0

我想這可能幫助:

mysql_query(" 

SELECT 
    location_postcode, 
    CASE SUBSTRING('".$_POST['user_postal_search']."', 1, 2) 
     WHEN 'bs' THEN 'Bristol' 
     WHEN 'ba' THEN 'Bath' 
     ELSE 'Unknown City' 
    END CASE as City 
FROM 
    search_locations 
WHERE 
    location_postcode LIKE '".$_POST['user_postal_search']."%' 

"); 

另外,如果你不想你的SQL服務器處理子串,然後只是PHP做到這一點:

mysql_query(" 

SELECT 
    location_postcode, 
    CASE '".substr($_POST['user_postal_search'], 0, 2)."' 
     WHEN 'bs' THEN 'Bristol' 
     WHEN 'ba' THEN 'Bath' 
     ELSE 'Unknown City' 
    END CASE as City 
FROM 
    search_locations 
WHERE 
    location_postcode LIKE '".$_POST['user_postal_search']."%' 

"); 
+0

請不要將$ _POST變量直接插入到SQL查詢中。請參閱[如何防止PHP中的SQL注入?(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-i njection-in-php) –

+0

@BillKarwin你是對的。 OP不按照他們顯示的方式使用'$ _POST',它只是爲SQL的概念驗證。學習如何使用預處理語句並綁定變量,以便DBMS可以正確地轉義所有內容。 – MonkeyZeus

0

好吧大家。目標是建立一個用戶可以搜索郵編或位置的搜索框。

數據庫被設置了,像這樣:

location_id location_name location_postcode 
1    bristol   bs 
2    glasgow   g 

有些郵政編碼開始,只有一個英文字母和一些開始有兩個,如上面的數據庫的例子。現在,下面的代碼將$ location_search變量更改爲第一個字母,如果是隻有一個字母的郵編,或者是兩個字母的郵政編碼,則爲兩個字母。現在如果它的位置如布裏斯托爾。它會忽略郵編並將整個單詞分配給變量$ location_search。

現在我剛剛完成了這段代碼。它可能會更好,但它的工作。一旦它被分配給變量,你可以使用它來運行mysql查詢。

<?php //Assign location ID 
    $location_word = mysql_real_escape_string($_POST["location_input"]) 

    if(!empty($location_word)){ 

     //Remove spaces 
     $location_word = str_replace(" ", "", $location_word); 

     //Work out if it's a postcode or a location. 
     $location_3rd_character = substr($location_word, 2, 1);  //Get third character 
     if(!ctype_alpha($location_3rd_character)){  //Check if it's a number or not 
      $location_type = "postcode"; 
     } 
     else { 
      $location_type = "city"; 
     } 

     if($location_type == "postcode"){  //Definding the postcode search, strip down to first or second letter. 
      $location_2nd_character = substr($location_word, 1, 1); 

      if(!ctype_alpha($location_2nd_character)){ //Trim postcode down to one letter, if only one letter in postcode. 
       $location_search = substr($location_word, 0, 1); 
      } 
      else {  //Trim postcode down to two letters, if only two letter in postcode. 
       $location_search = substr($location_word, 0, 2); 
      } 
     } 
     else { 
      $location_search = $location_word; 
     } 
?> 
相關問題