2014-06-19 17 views
0

我想做一個PHP函數檢查一個MySQL數據庫,如果一個已經被隨機創建的值先前存在,如果它確實然後重複,直到它使一個值這不存在。PHP函數循環來檢查數據庫的現有字符串

目前我的失敗悲慘,雖然在優先我相信我的方法會起作用,它只是沒有。

的PHP

我在自己的腳本嘗試這樣做,然後意識到PHP函數不運行,除非它們被。

conn(); //db connection 
    function genID() { 
     $newIDref = uuaig(10); 
     $queryCHECK = "SELECT * 
         FROM contentArticle_vids 
         WHERE videoArticle_id = '$newIDref' 
        "; 
      $resultCHECK = mysql_query($queryCHECK); 
      $numrows = mysql_num_rows($resultCHECK); 

     if ($numrows !== 0) { 
      genID(); 
      die(); 
     } 
    } 

所以..然後我試了這個,然後讓它真的不開心(打破了整個頁面)。

conn(); //db connection 
genID(); 

function genID() { 
    $newIDref = uuaig(10); 
    $queryCHECK = "SELECT * 
        FROM contentArticle_vids 
        WHERE videoArticle_id = '$newIDref' 
       "; 
     $resultCHECK = mysql_query($queryCHECK); 
     $numrows = mysql_num_rows($resultCHECK); 

    if ($numrows !== 0) { 
     genID(); 
     die(); 
    } 
     if ($numrows === 0) { 
     return $newIDref; 
     die(); 
    } 
} 

作爲參考,隨機字符串發生器是uuaig(10)

我最終需要隨機字符串生成,然後返回,如果字符串被確認爲不存在於數據庫中。

我該怎麼做?

+0

你究竟在哪裏連接到你的數據庫? –

+0

高於此功能已確認工作。 @ MichaelO'Brien – Derple

+1

爲什麼'die()'在那裏?進行調試還是實際的代碼?如果你想遞歸調用你的函數,你必須用'return genID();'結束它;'請注意你的代碼缺少'return',在那之後,'die()'都是不需要的 –

回答

2

爲什麼選擇?只需在videoArticle_id上​​添加一個唯一索引。然後,當您嘗試生成並插入新ID時,只需處理插入失敗並重新嘗試使用新ID。

如果你有一個用於生成id的代碼方案,並且期望有很少的id衝突,這樣會更有效率。

所以你的功能可能看起來像:

function genID() { 
    $idSuccess = false; 
    $max_retries = 3; 
    $i = 1; 
    while (false === $idSuccess && $i <= $max_retries) { 
     $newIDref = uuaig(10); 
     $queryCHECK = "INSERT INTO contentArticle_vids (`videoArticle_id`) 
      VALUES ('$newIDref')"; 
     $idSuccess = mysql_query($queryCHECK); 
     $i++; 
    } 
    if(false === $idSuccess) { 
     error_log('Could not generate ID in genID()'); 
     return false; 
    } 
    return $newIDref; 
} 

注意我添加了一個最大重試次數限制,所以你不必無限循環的可能性。另外,請注意,這將繼續並在數據庫表中保留此新唯一標識的位置。

最後,基本上強制性的是,我注意到您正在使用已棄用的mysql擴展名。你真的不應該使用這個擴展來編寫新的代碼。

+0

這就是我試圖實現的目標,但是我希望循環創建和檢查這個id。我知道它是相同的ID是苗條的機會,但我仍然希望使它變成字符串可以 – Derple

+1

@StuartWickenden我現在已經添加了代碼示例。 –

+0

@MikeBrant我可以建議一個'做{...while()'而不是?會更清潔一些,閱讀更好(imo)。另外,[yoda條件](https://en.wikipedia.org/wiki/Yoda_Conditions)我不是粉絲,但這完全取決於你 – kero

0

經過一番修補之後,我設法找出了實現我想要的結果的正確方法。

//genID(); 


function genID($newIDref) { 
    $status = false; 
    $i=0; 
    while ($status === false) { 
     $newIDref = uuaig(10); 
     $queryCHECK = "SELECT * 
         FROM contentArticle_vids 
         WHERE videoArticle_id = '$newIDref' 
        "; 
      $resultCHECK = mysql_query($queryCHECK); 
      $numrows = mysql_num_rows($resultCHECK); 

     if ($numrows === 0) { 
      $status = true; 
      return $newIDref; 
     } 

     $i++; 

     // testing 
     /* 
      if ($i > 5) { 
       echo 'fin'; 
       die(); 
      } 
     */ 
     // testing 
    } 
} 

$newIDref = genID($newIDref);