2012-05-13 28 views
0

我正在PHP中創建一個電子郵件訂閱表單,並且希望檢查一個有效的地址以及電子郵件是否已經存在於我的數據庫中。PHP電子郵件訂閱驗證和檢查現有的

我的代碼連接到我的數據庫並插入,但驗證以及檢查現有電子郵件都不起作用。

無論我在表單中輸入什麼內容,都會將其插入到我的數據庫中,即使我沒有輸入任何內容。

這裏是我的所有代碼:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

<fieldset> 

<legend>Subscribe to Our Newsletter &nbsp;</legend> 

<?php if ($feedback!='') 
echo('<p>'.$feedback.'</p>'); ?> 

<label>Name: <input name="name" type="text" value="<?php echo $name; ?>" /></label> 

<label>Email: <input name="email" type="text" value="<?php echo $email; ?>" /></label> 

<label><input type="submit" value="Sign Up!" /></label> 

</fieldset> 
</form> 

<?php 



$feedback=''; 
if (!$email) { 

$feedback .= '<strong>Please enter your email address</strong><br />'; 

} 

if (!$name) { 

$feedback .= '<strong>Please enter your name</strong><br />'; 
} 



list($username, $mailDomain) = explode("@", $email); 

if ([email protected]($mailDomain, "MX")) { 


$feedback .= '<strong>Invalid email domain</strong><br />'; 
} 


if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $email)) { 


$feedback .= '<strong>Your email address doesn\'t appear to be valid - please check and try again'; 

} 



function cleaninput($value, $DB) { 
    if (get_magic_quotes_gpc()) { 
     $value = stripslashes($value); 
} 
return mysql_real_escape_string($value, $DB); 

} 


$name=$_POST['name']; 
$email=$_POST['email']; 

include_once "connect.php"; 


$sql = mysql_query("SELECT * FROM subscribers WHERE email='$email'"); 
$numRows = mysql_num_rows($sql); 
    if ($numRows>0) { 


$feedback = '<strong>That email address is already subscribed.</strong>'; 

} 

$insertresult = mysql_query("INSERT INTO subscribers (name, email) VALUES('$name', '$email')") or die (mysql_error()); 


    if ($insertresult) { 
     $completed = true; 
    } 



if($competed=false) { 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?> method="post"> 
     <fieldset> 
    <legend>Subscribe to OUr Newsletter &nbsp;</legend> 
<?php 

if ($feedback!='') 
    echo('<p>'.$feedback.'</p>'); ?> 
<label>Name: <input name="name" type="text" value="<?php echo $name; ?>" /></label> 

<label>Email: <input name="email" type="text" value="<?php echo $email; ?>" /></label> 

<label><input type="submit" value="Sign Up!" /></label> 

     </fieldset> 
</form> 

<?php 

} 
else { 



echo('Thanks - you have subscribed to our newsletter successfully. You can unsubscribe at any time by clicking the link at the bottom of each email we send.'); 

} 



?> 

而且在我的腳本的最後迴音是永遠存在的。它始終顯示在我的表單下。不知道爲什麼。也許我在我的代碼中有錯誤的地方。

else { 



echo('Thanks - you have subscribed to our newsletter successfully. You can unsubscribe at any time by clicking the link at the bottom of each email we send.'); 

} 

謝謝!

+0

請停止使用古老的'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)。 –

+0

謝謝!不知道這件事。 – myladeybugg

回答

0

此代碼是一個有點亂,說實話:)這是稍微難讀,但我可以看到至少有兩個問題:你寫$competed,而不是$completedif語句之一,而你不知道t實際上在if塊中具有INSERT查詢:它將始終執行。嘗試把它在elseif塊檢查地址是否已經在你的數據庫中,這樣以後:

$sql = mysql_query("SELECT * FROM subscribers WHERE email='$email'"); 
$numRows = mysql_num_rows($sql); 

if ($numRows>0) { 
    $feedback = '<strong>That email address is already subscribed.</strong>'; 
} 
else { 
    $insertresult = mysql_query("INSERT INTO subscribers (name, email) VALUES('$name', '$email')") or die (mysql_error()); 
} 

你也不需要同時使用addslashesmysql_real_escape_string;只是後者會做。我不確定爲什麼你的代碼有兩次相同的表單。當然應該做? :)

+0

感謝您的幫助。我實際上從昨天剛剛購買的一本書中複製了這些代碼。看起來我會回來! – myladeybugg

+0

如果這段代碼來自一本聲稱是PHP/MySQL教科書的書,那麼是的,這聽起來像個好主意...... :)這段代碼有很多錯誤,所以我不會依賴包含任何教科書這作爲示例代碼來學習。 – Daan