2015-12-12 26 views
4

我必須承認,我懵了PHP的,而我現在的劇本是繼承了......剝離外國口音的MySQL的查詢

它查詢與city名稱的MySQL數據庫,並返回找到的所有實例city

我遇到了兩個問題:第一個用連字符(例如Stratford-upon-Avon);這已經解決了

$searchq = str_replace('-', ' ', $searchq); 

它允許我輸入數據庫中的數據,不用連字符。我的遺留問題與外國口音有關(特別是:急性,嚴重,旋轉,塞迪耶,代字)。我嘗試了一百萬個功能,我在這個網站上找到的許多功能並沒有設法讓它起作用。

我的當前頁面的主PHP代碼是這樣的

$searchq = filter_var("%{$_POST['keyword']}%", FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); // Sanitize the string 

$ SEARCHQ = str_replace函數( ' - ', '',$ SEARCHQ);

$sql = "SELECT Image, Chain, Country, City, Top as '', Medium as '', Low as '' FROM Chains WHERE Country LIKE ? OR City LIKE ?"; // Your query string 

$prepare = $mysqli->prepare($sql); // Prepare your query string 
$prepare->bind_param('ss', $searchq, $searchq); // Bind the placeholders to your search variables 
// s = string | i = integer | d = double | b = blob 
$prepare->execute(); // Execute the prepared statement 
$prepare->store_result(); // Store the results for later checking 

我避免來到這個論壇,因爲我明白,這是供高級開發人員,我不是其中之一......

所有上面的代碼確實是刪除重音信,而不是相同的字母替換它沒有口音

編輯

,怎樣才能再次得到奧利·瓊斯的注意?

我卡住了,不知道如何處理腳本部分

另一個編輯 當我在表的SQL進入這個

ALTER TABLE鏈轉換爲字符集utf8mb4 COLLATE utf8_general_ci;

我得到這樣的警告,什麼都做不了......

#1253 - 整理「utf8_general_ci」是無效的字符集「utf8mb4」

+1

你剛好在這裏。歡迎來到Stackoverflow。爲什麼你想擺脫所有這些特殊字符?你的數據庫不能包含它們嗎? – ZeissS

+0

以法國小鎮塞弗爾(Sèvres)爲例。像數據庫中的許多其他人一樣(1000年代),我不想同時使用和不使用重音符號。所以數據庫有'Sevres',如果有人寫出正確的單詞,那麼此時答覆是「Nothing found」... –

+0

讓我添加最後一條有關輸入數據庫的註釋,其中帶有和不帶重音符號。以簡單的字'Sèvres'(墳墓)。像我這樣的人可能會寫'Sévres'(急性)。其他人過去用Google寫'Sevres'(沒有口音)。這是一個簡單的例子。在更復雜的情況下,你可能會有兩個不同的跡象(嚴重和旋律;急性和cedilla);那麼你將會有一些由兩三個單詞組成的單詞,併爲所有的組合和可能出現的錯誤創造空間,最終導致大量的工作和困惑......「簡單」的出路是讓腳本去掉所有的口音。 –

回答

2

MySQL的字符集和校對功能設計來處理這個正確排序,無需額外的搜索欄。

例如,觀察這個小查詢:

select _utf8'résumé' COLLATE utf8_general_ci = _utf8'resume' 

,或者使用更現代化的utf8mb4字符集,

select _utf8mb4'résumé' COLLATE utf8mb4_general_ci = _utf8mb4'resume' 

這兩個查詢發現,résuméresume是相等的。它適用於幾乎所有歐洲語言重音字符。

這些查詢包含顯式創建爲unicode字符串的兩個字符串常量。然後使用case_insensitive整理比較它們。在整理中,e-acute和e-grave的大小寫形式都被認爲是相同的。

你如何得到這個與你的數據庫一起工作?

  1. 確保字符集的地名列(CityCountry)都設置爲utf8,或者更好,更強大和現代化utf8mb4

  2. 確保這些表的默認排序規則對您選擇的字符集不區分大小寫排序規則。

  3. 只是做你的問題。你不需要任何特別的東西。例如,WHERE City = 'Sèvres'WHERE City = 'sevres'將產生相同的結果。對於習慣於Google類型搜索的用戶來說,這非常適合。

在更改表格之前,先製作一份備份副本,以防止出現問題。

CREATE TABLE chains_backup SELECT * FROM chains 

然後使用這種命令來更改表中的列。

alter table chains 
     modify City varchar(255) 
        character set utf8mb4 
        collate utf8mb4_general_ci 

取代varchar(255)您需要使用列的實際數據類型。你沒有告訴我們這是什麼,所以我猜測。

您選擇的默認排序規則爲每科拉姆到指標進行烘烤。因此,不僅您的不符號搜索準確無誤,而且會很快。

注意,西班牙語ñ是一個奇怪的情況。一般對照ñn是相等的。但在西班牙語詞典中,ñ是不同的字母。所以如果你想要西班牙地名的字母順序,你需要utf8_spanish_ciutf8mb4_spanish_ci排序規則。

問題中顯示的代碼的好消息是這樣的:當您使用不區分大小寫的排序規則時,您根本不需要使用just_clean函數。

您可能希望使用WHERE City LIKE 'stratford%'而不是WHERE City = 'stratford'進行搜索 - 這樣可以使您的查詢與搜索詞的前幾個字符匹配。 LIKE構建將匹配Stratford-upon-Avon以及Stratfordshire

+0

嗨Ollie在我這個年齡段,我需要深呼吸......表格問題看起來很簡單,但是我對腳本做了什麼,因爲上面代碼中的功能只是我插入的一個嘗試。我可以發佈實際的代碼和表結構,但我該怎麼做? 「回答你的問題」按鈕在下面? –

+0

不要使用「答案」將信息添加到您的問題,您的問題上有一個編輯按鈕:D – Nanne

+0

我可以上傳.png和.zip文件嗎? –