2011-08-01 102 views
0

我試圖建立的是從數據庫查詢在MySQL數組中的數組。通過該數組循環查找帶strpos的特定字符串。MySQL的PHP​​陣列問題

當註冊頁面加載,我有一個文件,這個文件的源代碼如下:

mysql_select_db($database_connBlog, $connBlog); 
$query_rsBannedDomains = "SELECT * FROM banned_emailproviders"; 
$rsBannedDomains = mysql_query($query_rsBannedDomains, $connBlog) or die(mysql_error()); 
$row_rsBannedDomains = mysql_fetch_assoc($rsBannedDomains); 
$totalRows_rsBannedDomains = mysql_num_rows($rsBannedDomains); 


$bannedArray = array(); 
    do { 
    array_push($bannedArray, $row_rsBannedDomains['domain_emailprovider']); 
    } 
    while ($row_rsBannedDomains = mysql_fetch_assoc($rsBannedDomains)); 

//print_r($bannedArray); 

$emailaddress = $_POST['email_usr']; 

foreach($bannedArray as $key => $domain){ 
    if(strpos($emailaddress, $domain) == false){ 
     echo (strpos($emailaddress, $domain)); 
    } else { 
     header ("Location: http://www.disney.com"); 

    } 
} 

當寄存器提交頁面,提交自己。包含上面的源代碼,是註冊php文件中的第二行。第一行是數據庫連接的包含。

奇怪的是,當我點擊並重新提交表單時,有時會出現這種情況。

+1

do ...雖然不是循環訪問數據庫結果的好方法,因爲它總是會在循環中至少運行一次,並且有可能查詢將返回0行。改爲使用。 – GordonM

+1

若要添加到GordonM的評論,您應該刪除'$ row_rsBannedDomains = mysql_fetch_assoc($ rsBannedDomains);頂部的第一行。另外''array_push()'在這裏並不是必須的。看起來你可以在'while'循環中執行'$ bannedArray [] = $ row_rsBannedDomains ['domain_emailprovider'];''。 –

回答

1

你不需要通過它與PHP加載整個表,然後循環。事實上,這是一種非常低效的方式。只需查詢數據庫,查看電子郵件地址的域部分是否是表中的條目之一。

$emailaddress = substr ($_POST['email_usr'], strpos ($emailaddress = $_POST['email_usr']; 
, '@')); 

$query = "SELECT COUNT(*) AS banned FROM banned_emailproviders WHERE domain_emailprovider = '" . mysql_real_escape_string ($emailaddress) . "'" 
if (($res = mysql_query ($query)) && ($row = mysql_fetch_assoc ($res)) && ($row ['banned'] > 0)) 
{ 
    // The domain was in the banned list 
} 
else 
if (!$res) 
{ 
    // Something went wrong querying the database 
    die (mysql_error()); 
} 
else 
{ 
    // The domain wasn't in the banned list 
} 

請注意上面的代碼還沒有經過測試,所以它可能需要一些調整才能正常工作。

+0

謝謝你的想法。我用這個,並能夠完成我以後的事情。好的邏輯在這裏。 –

+0

如果您提交表單,請單擊瀏覽器並重新提交表單,但我仍然有一個非常愚蠢的發生。出於某種原因,即使表單正在提交給自己,它仍然按順序運行代碼,直到第二次提交,這對我沒有意義。 –

1

一兩件事,我看到的是

if(strpos($emailaddress, $domain) == false){ 

應該

if(strpos($emailaddress, $domain) === false){ 

http://php.net/manual/en/function.strpos.php

+0

我確實改變了相同的結果。點擊返回並重新提交後,某些瀏覽器會捕獲已知禁止電子郵件中的標題if header。 –