2014-01-21 44 views
0

好的,所以我有以下代碼。它在某種程度上應該起作用。 它首先檢查電子郵件是否在數據庫中,如果找到,它會將密碼重置爲從1000到9999的隨機值,並通過電子郵件發送。 sendMail是一個自定義函數,並以其他形式工作,所以它不是這裏錯誤的代碼塊。我不確定有一對夫婦的事情,這我相信可能導致下面的PHP錯誤:MySQL查詢錯誤我相信

<?php 
define('INCLUDE_CHECK',true); 

require 'connect.php'; 
require 'functions.php'; 
// Allowing MySQL Connection - Include_Check has to be TRUE 

$email=$_POST['email']; 
$email=mysql_real_escape_string($email); 
$status = "OK"; 
$msg=""; 
if (!stristr($email,"@") OR !stristr($email,".")) { 
$msg="Invalid E-Mail:<br>This address format is invalid!"; 
$status= "NOTOK";} 

if($status=="OK") { // If e-mail is valid, status stays the same: query time! 
$query="SELECT email,usr FROM tz_members WHERE email = '$email'"; 
$st=mysql_query($query); 
$recs=mysql_num_rows($st); 
$row=mysql_fetch_object($st); 
$em=$row->email;// Switching $email to $em for the query. 
if ($recs == 0) { // $recs is 0, that means that address doesn't exist. Tell the guy to register ? Yes plz. 
// Display the message 
echo "We're sorry: We could not find your address in the database.<br>Click here to create an account!<br> <a href='register.html'>Register </a></center>"; 
exit; } 

$pass = rand(1000,9999); 
// Using the functions.php public: sendMail 
send_mail( 'administrator[email protected]', 
         $_POST['email'], 
         'Username: '.$row->usr, 
         'Password: '.$pass); 
mysql_query("UPDATE tz_members SET $row->pass = md5($pass)"); 
} 
?> 

差點忘了,這是HTML表單。

<form action="forgot.html" method="post"> 
<p><b>Email Address:</b> <input type="text" name="email" size="20" maxlength="40" value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>" /></p> 
<input type="submit" name="submit" value="Reset" /></div> 
</form> 

讓我描述我的問題:電子郵件發送,用$傳球,但在電子郵件的用戶名(見代碼知道我指的)是這樣的: 用戶名(5),這使我認爲它不會選擇好用戶名(MySQL中的列名稱是'usr')。

最後,更新查詢也必須錯誤,因爲密碼在MySQL中不會更新!

mysql_query("UPDATE tz_members SET $row->pass = md5($pass)"); 

這是更新查詢,我不確定它爲什麼不起作用。

$query="SELECT email,usr FROM tz_members WHERE email = '$email'"; 

這是在數據庫中發現的應該選擇usr和email的查詢。

回答

1

$row->pass是您從數據庫中檢索的上一個通行證,它將是一個簡單的md5散列值。換句話說,你產生

... SET acbd18db4cc2f85cedef654fccc4a4d8 = md5(1234); 

不知道你,但如果我有這樣的字段名稱類似的數據庫表,我不得不追捕架構設計師和折磨他們致死。

你想

... SET pass=md5($pass) 
     ^^^^---your table's password field 

代替。

+0

'$ row-> pass'不是什麼,因爲他沒有在他的查詢的'SELECT'列表中包含'pass'。 – Barmar

+0

但他的觀點仍然存在...... –

1

它應該是:

mysql_query("UPDATE tz_members SET pass = md5('$pass') WHERE email = '$email'"); 

要更新的字段的名字只是pass,不$row->pass(這將是密碼的舊值,如果你列入SELECT列表列) 。你需要一個WHERE條款,否則它會設置大家的密碼。

+0

我試過了你的查詢,並最終設置了大約50個密碼到相同的東西:/ –

+0

你是否遺漏了'WHERE'子句? – Barmar

+0

是:(如何撤消它? –

0

要更新相關的電子郵件地址的密碼,你必須將它指定

mysql_query("UPDATE tz_members SET pass = md5($pass) WHERE email = $email"); 
0
$newhash = md5($pass); 
mysql_query("UPDATE `tz_members` SET `pass` = '".$newhash."' WHERE `email` = '".$email."'); 

請更新到庫MySQLi中,MySQL在未來不再in't功能。