2011-04-02 225 views
2

爲什麼不能使用此代碼?PHP MySQL while循環

它創建一個隨機數,如果它存在於數據庫中,那麼它會生成一個新數字,直到它可以插入到唯一鍵中,否則它將直接插入到數據庫中。

$id; 
    do { 
    $id = mt_rand(1, 10); 
    "SELECT count(*) FROM accounts WHERE id = '$id'"; 
    } while (count != 0); 

    $sql = "INSERT INTO accounts (id, username, email, password, sex) 
    VALUES ('$id', '$username', '$email', '$password', '$sex')"; 

mt_rand爲測試目的而低的原因。

+0

不,沒有,我的腳本的目的是purposefull足以需要它的工作。 – phpabuse 2011-04-02 03:44:54

+0

然後檢查我的解決方案: - ?並告訴我它是否按預期工作。 – Khez 2011-04-02 03:50:08

回答

2

那是因爲,你是不是真的燒MySQL查詢。你只需要查詢字符串就可以了。你必須傳遞字符串mysql_query(..)。檢索資源,然後檢出最後的行數。

方法#1:(修改代碼)

$id;$count; 
do { 
    $id = mt_rand(1, 10); 
    $res = mysql_query("SELECT count(*) as c FROM accounts WHERE id = '$id'"); 
    $row = mysql_fetch_array($res); 
    $count = $row['c']; 
} while ($count != 0); 

$sql = "INSERT INTO accounts ..."; 
//.. 

方法#2:

  • 修改您的MySQL表,使用一個auto_increment。創建一個表這樣
  • create table myTABLE (
        id integer aut_increment, 
        username varchar(128), 
        email varchar(128), 
        .. 
        primary key(id) 
    );
1

你爲什麼要用這種方法生成一個ID?爲什麼你不使用自動遞增的ID?

CREATE TABLE accounts (
    id INT NOT NULL AUTO_INCREMENT, 
) 

使用生成使用mt_rand不作一大堆的道理,並會與你得到更多的賬目令人難以置信的昂貴的ID。

+3

個人而言,我喜歡偶爾使用O(n^Infinity)方法... – cwallenpoole 2011-04-02 03:46:31

0

呃......似乎是在代碼中的一些輕微問題:

$id; 
do { 
    $id = mt_rand(1, 10); 
    $c=mysql_query('SELECT id FROM accounts WHERE id = '.$id.' LIMIT 1;'); 
}while(mysql_num_rows($c)!=0); 

附:你應該考慮尋找到:uniqid PHP手冊,這是不使用的mysql_query auto-incrementing an sql field

+0

此查詢總是返回1行,限制和mysql_num_rows是毫無意義的 – 2011-04-02 03:54:32

+0

除非...它失敗o.o – Khez 2011-04-02 03:56:52

0

幾件事情

  1. 它不提取查詢結果(不存在)
  2. count是一個內置的PHP方法,而不是一個數字。
  3. 你不應該具有多次往返到數據庫(它是一個非常壞主意來生成一個隨機標識符的方式)
+0

那麼你會怎麼做? – phpabuse 2011-04-02 03:47:39