2012-04-27 65 views
1

我想生成一個字符串發佈一個URL。然後使這個帖子的網址如下:http://www.mydomain.com/post/afCeYk,並將此網址存儲在mysql中。爲了避免重複url,我認爲首先應該檢查mysql是否url已經存在。在我的代碼中,我只檢查一次,我無法確保第二個生成字符串尚未存在。那麼我該如何做一個循環?PHP生成一個字符串,並從MySQL檢查不存在

$shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$rdstr = substr(str_shuffle($shufstr),0,6); 
$query = mysql_query("select * from table where post_url = '".$rdstr."'"); 
if(mysql_num_rows($query)>0){ 
    //insert the url rules into db 
}else{ 
    //generate a new string and check the db again 
} 
+0

如何製作一個循環?真的嗎?你有沒有搜索?無論如何,這是一個糟糕的應用程序 - 隨着URL的消耗,它會變得越來越慢。除非您需要難以猜測的網址,否則請使用自動增量ID。 – 2012-04-27 22:30:05

+1

我的建議是在列中添加一個唯一的鍵,以防止重複。 – 2012-04-27 22:30:26

+1

請停止使用古老的'mysql_ *'函數編寫新代碼。他們不再被維護,社區已經開始[棄用流程](http://news.php.net/php.internals/53799)。相反,您應該瞭解準備好的語句並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)。如果你關心學習,[這裏是一個很好的PDO相關教程](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)。 – 2012-04-27 22:42:44

回答

1

您應該查詢數據庫一次以收集表中的所有數據,然後生成一個字符串並根據您獲得的數組進行檢查。

與反覆查詢數據庫相反,這具有性能優勢。

(而不是實際的代碼)

$url_list = query("SELECT `post_url` FROM `table`"); 
do { 
    $random_string = generate_random_string(); 
} 
while(!in_array($random_string, $url_list)); 

此外,請確保沒有重複的是通過使列UNIQUE輸入。

+0

這會工作,但可能會導致一個巨大的數組取決於數據庫中的記錄數。 – 2012-04-27 22:53:45

+0

由於您仍然需要將您的價值與其他所有人進行比較,因此實際上沒有辦法解決這個問題。此外,它反覆循環遍歷相同的查詢。 – 2012-04-27 22:56:39

1

您可以使用while循環,但你必須保存幾千年的網址後,它會變得非常慢:

$shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$validString=false; 
while(!$validString){ 
    $rdstr = substr(str_shuffle($shufstr),0,6); 
    $query = mysql_query("select * from table where post_url = '".$rdstr."'"); 
    if(mysql_num_rows($query)==0){ //This is also different from your code as you don't want to do the insert if there is 1+ row with that url. 
     $validString=true; 
     //insert the url rules into db 
    } 
} 
+0

您應該避免循環查詢,尤其是當您每次迭代都有查詢重新加載時,成本很高。您至少應該在循環之前放置查詢,然後循環查詢結果。 – 2012-04-27 22:33:05

+0

效率低下。一旦他達到成百上千,會導致大規模的放緩。 – 2012-04-27 22:46:44

1

如果它是我的項目,我會在加UNIQUE約束post_url列本身,這將確保從任何入口點(應用程序,命令行等)都不會輸入重複項。有關MySQL unique的更多信息。

+0

但是如果有人試圖輸入一個副本,而不是試圖產生一個副本,它會炸燬。 – 2012-04-27 22:45:49

+0

@Truth:同意。但是,在數據庫層處理唯一的約束,無論訪問點如何,都能確保一致性。對於這個請求,他必須發出select或處理由於唯一約束失敗而引發的錯誤。 – 2012-04-27 22:50:42

相關問題