2014-01-07 27 views
1

我使用一種方法來清理用戶提交的字符串(問題)到一個url。 它除了字母數字之外的所有內容都被刪除,並用破折號替換空格。在mysql或php中清除網址

現在我需要在我的mysql數據庫中找到正確的行,當該URL被調用時。

例如: - 網址:website.bla /什麼 - 是 - 這

應該找到自己與如表中的一行這個值

「什麼是這個??????」

我想在URL中使用ID有點像:

website.bla/32423 /什麼 - 是 - 這

website.bla /什麼,是this_32423

但它的客戶請求,應該沒有額外的數字,因爲SEO。

因此,扭轉清潔方法是不可能的。 我可以做的是循環訪問我的數據庫中的每個條目,並使用sanitize方法,看看是否與url匹配,但我認爲當db變大時會很愚蠢。

while ($row = mysql_fetch_array("SELECT * FROM questions")) 
{ 
    if ($url == sanitize($row["question_text"])) return $row; 
} 

我也可以「重建」是消毒方法在mysql中有很多鏈接的MySQL替代(), 但我認爲那將是很容易出錯。

"SELECT * FROM questions WHERE Replace(Replace(Replace(REPLACE(question_text,'%',''),'&','')... 

所以我目前的想法是隻使用sanitized字符串作爲我的分貝主鍵。

這是一個很好的方法,還是有一些其他的,更好或更標準化的方式呢?

+0

我會創建一個索引,不像MySQL索引,但像每個搜索引擎索引單詞及其外觀 – DanFromGermany

+1

我不認爲有任何客觀證據表明URL包含id會損害SEO。相反,我認爲這是一種誤解,因爲聲稱具有參數大的網址根本不會提供關於資源的語義價值,因此可能會被認爲對SEO工作有害。隨着時間的推移,人們開始混合起來;無意義的參數是壞的,id是一個參數,因此id的是壞的。 – Mathew

回答

1

這實際上是一個數據庫用於哪些鍵。如果您有能夠識別特定條目的數據,則無論如何都不是壞習慣。

但事實上,您的方法可能會出現多個同名問題,這是您的方法的不好的一部分。您可以通過使用唯一標識(例如主數據庫鍵作爲自動遞增整數)來防止此問題。這也是大多數網站中最先進的技術(例如,StackOverflow http:// stackoverflow.com/questions/20976228/un-sanitize-url-in-mysql-or-php工作,所以http:// stackoverflow.com/questions/20976228,因爲20976228是這個問題的唯一ID,並且stackoverflow使用唯一的ID來標識問題。該網址的其餘部分僅用於可讀性或搜索引擎優化的目的。

+0

http://stackoverflow.com/questions/20976228/this_is_a_giraffe_also_works。在這種情況下,單獨使用Id,你看到的是顯示網址 – AdrianBR

+1

這正是我所說的!? – th3falc0n

+1

是的:)只是指出,網址的最後一部分只具有可讀性相關性,併爲seo /人類,用戶可以把任何(在ID後面的url中檢查字符串) – AdrianBR

0

你已經說過了:將字符串的淨化版本存儲在數據庫中,並將其用作關鍵字(不一定是主鍵,而是可以搜索的關鍵字)。這也有助於確保每個slu is實際上都是獨一無二的。其他任何事情都是不起作用的。

0

存儲消毒密鑰。

如果你有任何需要轉換的遺留東西,也請看一下mysql函數。我個人使用自定義的字母數字轉換功能進行了大量匹配的(加LCASE和你設置)

CREATE DEFINER=`username`@`%` FUNCTION `alphanumeric`(`str` VARCHAR(255)) 

    RETURNS varchar(255) CHARSET utf8 
    LANGUAGE SQL 
    DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
    DECLARE i, len SMALLINT DEFAULT 1; 
    DECLARE ret VARCHAR(255) DEFAULT ''; 
    DECLARE c VARCHAR(1); 
    SET len = CHAR_LENGTH(str); 
    REPEAT 
    BEGIN 
     SET c = MID(str, i, 1); 
     IF c REGEXP '[[:alpha:]]' or c REGEXP '[[:digit:]]' THEN 
     SET ret=CONCAT(ret,c); 
     END IF; 
     SET i = i + 1; 
    END; 
    UNTIL i > len END REPEAT; 
    RETURN ret; 
END 
1

爲什麼這是一個糟糕的主意,以及爲什麼將數字用作唯一標識符是最好的選擇。

  • SEO的論點是純粹的迷信。堆棧溢出使用數字作爲URL中的唯一標識符(請參閱上面的URL),他們的搜索引擎優化表現是傳奇。堆棧溢出問題在全球數百萬個查詢的前十個結果中排名第一。

  • 通過使它們成爲唯一的鍵,可以大量限制可能名稱的範圍。例如,一旦關鍵Zurich取,我將無法與名稱創建記錄...

    • Zürich
    • (Zürich)
    • Zürich (蘇黎世)
    • Zürich!!!!!!!!!!!!!!!!!!!!
    • Zürich!!!!!!
    • Zürich????????????

    ...絕對沒有理由! (他們不是令人心生的好例子,但你明白我的意思。)

  • 通過使用名稱作爲唯一鍵,10任何重命名操作將創建一個無效的URL。更正名稱中的拼寫錯誤 - 責備!來自搜索引擎的訪客得到404。這太可怕了。

數字的方法真的是最熱門的方法。查看數字以確定記錄;爲了避免搜索引擎中出現重複的內容,當標題與您的文件不匹配時,請將標題重定向到正確的清理名稱。 (你會注意到你可以在這個頁面的URL名稱部分輸入任何nonsene,但它會重定向到正確的版本。)

+1

+1這些設計考慮因素是爲什麼我會推回來說ID需要留下。客戶說他們想要的和他們實際需要的東西有時是非常不同的東西,我們的工作的一部分是將兩者對齊... – Mathew

+0

我已經和他談過類似的名稱問題,甚至向他展示了stackoverflow的用法這種方法,但是......他仍然希望沒有數字。 ;) –