2013-12-09 2 views
-2

У меня есть этот код для моей забытой формы пароля, но он не работает, может кто-нибудь увидеть ошибки? Он просто придумывает пустой экран и ничего не делает. Я пробовал все, но не могу заставить его работать. СпасибоФорма забытого пароля - PHP

<?php 
$host="localhost"; // Host name 
$username="admin"; // Mysql username 
$password=""; // Mysql password 
$db_name="members"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myemail=$_POST['myemail']; 

$sql="SELECT * FROM $tbl_name WHERE email='$myemail'"; 
$result=mysql_query($sql); 
// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
$email = $_P0ST['email']; 

function createRandomPassword() { 



    $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 

    srand((double)microtime()*1000000); 

    $i = 0; 

    $pass = '' ; 



    while ($i <= 7) { 

     $num = rand() % 33; 

     $tmp = substr($chars, $num, 1); 

     $pass = $pass . $tmp; 

     $i++; 

    } 
    return $pass; 

} 

if($count==1){ 
$newpassword=createRandomPassword(); 
$encrypted_mypassword=md5($newpassword); 
$sql="UPDATE members SET password= ('$encrypted_mypassword') WHERE email = ('$myemail')"; 
$run=mysqli_query($sql); 


$to = "$myemail"; 
$subject = "Your Password"; 
$messages="Your password for accessing to our website \r\n"; 
$messages="Your password is $encrypted_mypassword \r\n"; 
$messages="Please change this password for security reasons. Thank you. \r\n"; 
$from = "[email protected]"; 
$headers = "From:" . $from; 
mail($to,$subject,$messages,$headers); 
echo "Mail Sent."; 
+0

** предупреждение ** код уязвим для SQL-инъекций. –

+0

[** Уязвимое является преуменьшением **] (http://stackoverflow.com/q/60174/1415724) - Кроме того, измените '$ email = $ _P0ST ['email'];' на '$ email = $ _POST ['email']; 'это' O', как в "** OMG! **", а не 'zero'. (*Назвать несколько*). –

+0

Добавьте это в начало страницы: 'ini_set ('display_errors', 1); error_reporting (-1); '. –

ответ

0

Кроме того, что вы должны использовать подготовленные инструкции, и вы должны использовать безопасный способ хранения паролей [т.е. не md5], $_P0ST должно быть $_POST.

1

Вы можете попробовать это, $sql="UPDATE members SET password='$encrypted_mypassword' WHERE email = '$myemail' "; $run=mysql_query($sql);. вы использовали mysqli_query.

 $host="localhost"; // Host name 
     $username="admin"; // Mysql username 
     $password=""; // Mysql password 
     $db_name="members"; // Database name 
     $tbl_name="members"; // Table name 

     // Connect to server and select databse. 
     mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
     mysql_select_db("$db_name")or die("cannot select DB"); 

     // Define $myusername and $mypassword 
     $myemail=$_POST['myemail']; 

     $sql="SELECT * FROM $tbl_name WHERE email='$myemail'"; 
     $result=mysql_query($sql); 
     // Mysql_num_row is counting table row 
     $count=mysql_num_rows($result); 
     $email = $_POST['email']; 

     function createRandomPassword() {  

      $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 

      srand((double)microtime()*1000000);   
      $i = 0;   
      $pass = '' ;    
      while ($i <= 7) {   
       $num = rand() % 33;   
       $tmp = substr($chars, $num, 1);   
       $pass = $pass . $tmp;   
       $i++; 

      } 
      return $pass; 

     } 

     if($count>0){ 
     $newpassword=createRandomPassword(); 
     $encrypted_mypassword=md5($newpassword); 
     $sql="UPDATE members SET password='$encrypted_mypassword' WHERE email = '$myemail' "; 
     $run=mysql_query($sql); 


     $to = "$myemail"; 
     $subject = "Your Password"; 
     $messages="Your password for accessing to our website \r\n"; 
     $messages="Your password is $encrypted_mypassword \r\n"; 
     $messages="Please change this password for security reasons. Thank you. \r\n"; 
     $from = "[email protected]"; 
     $headers = "From:" . $from; 
     mail($to,$subject,$messages,$headers); 
     echo "Mail Sent."; 
    } 
0

Эта распорка

if($count==1){ 

никогда не закрывается.

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – MZimmerman6

+0

Ну, на самом деле он заявил, что «он появляется с пустым экраном и ничего не делает», и «может ли кто-нибудь увидеть ошибку (ошибки)?». Причина пустого экрана - синтаксическая ошибка, и я думаю, что это тот, который я указал здесь. Ответ Джеймса здесь явно лучше моего, но я не вижу смысла в вашей критике. – Aioros

1

Он просто приходит с пустым экраном и ничего не делает

Как у вас есть эхо в конце сценария, но получают пустой экран и сообщения, это более чем вероятно точки к ошибке PHP (которая остановит сценарий и почему вы получите пустую страницу).

Вам необходимо получить доступ к файлу журнала ошибок, обычно в /var/log/apache2/error.log.
Вы должны регулярно посещать этот файл, создавая PHP, чтобы проверить ошибки, ошибки и проблемы с помощью предупреждений и уведомлений PHP.

Я подозреваю, что ошибка просто не хватает закрытия этого:
if($count==1){

Вы открываете его с {, но не закрывайте его с }.
Положите } после вашего echo "Mail Sent.";, и эта проблема исчезнет. Оставляя только оставшиеся вопросы:

Echoing "echo "Mail Sent.";" в конце вашего скрипта не означает, что письмо было отправлено. Что-то, возможно, пошло не так, где-то, так что проверьте, отправлено ли электронное письмо, и повторите соответствующее утверждение к результату.

Такие, как:

if (mail($to,$subject,$messages,$headers)) 
    { 
    echo "Mail Sent."; 
    } 
else 
    { 
    echo "Something went wrong"; 
    } 

Вы можете сделать немного лучше, чем это, но это дает вам идею, как только что вторя «отправленное» вводит в заблуждение, и вы будете доверять скрипт работает, даже если что-то не смогли.

Вы также действительно необходимо прочитать о валидации ввода пользователя и дезинфекции Mysql. Как доверять переменным перед тем, как вы вставляете или выбираете или удаляете (что-либо) в базе данных, возникает проблема с очень реальной проблемой безопасности.
Стартер для чтения можно найти здесь:
How can I prevent SQL injection in PHP?

md5() больше не является безопасным методом для шифрования паролей.Смотрите здесь для главной причине, а также идеи текущей наилучшей практики, такие как «crypt()»:
http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

Смежные вопросы