[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт восстановления пароля не работает
Вася Да
Здравствуйте! Помогите разобраться в чем дело. Есть скрипт восстановления пароля, все в нем вроде работает только когда вводишь email он должен вывести секретный вопрос который лежит в базе и который создавался при регистрации, но почему-то не выводит и даже ошибки никакой не пишет. Скрипт продолжает выполняться но вопрос не выводится. У скрипта есть 6 вариантов вопросов он их сравнивает с одним который лежит в базе. Чтобы не было путаницы скажу сразу что email у меня в базе записывается в login, а логин вообще не создаю при регистрации.
database.php:
session_start();
ob_start();
$hasDB = false;
$server = 'localhost';
$user = 'root';
$pass = '';
$db = '';
$mySQL = new mysqli($server,$user,$pass,$db);
if ($mySQL->connect_error)
{
die('Connect Error (' . $mySQL->connect_errno . ') '. $mySQL->connect_error);
}


forgotPass.php(это сама страница восстановления):
<?php
session_start();
include_once("database.php");
include("functions.php");
$show = 'emailForm'; // какую стадию отображать по молчанию
if ($_SESSION['lockout'] == true && (mktime() > $_SESSION['lastTime'] + 900))
{
$_SESSION['lockout'] = false;
$_SESSION['badCount'] = 0;
}
if (isset($_POST['subStep']) && !isset($_GET['a']) && $_SESSION['lockout'] != true)
{
switch($_POST['subStep'])
{
case 1:
// отправляем электронный адрес или имя пользователя
$result = checkUNEmail($_POST['login']);
if ($result['status'] == false )
{
$error = true;
$show = 'userNotFound';
} else {
$error = false;
$show = 'securityForm';
$securityUser = $result['userID'];
}
break;
case 2:
// отправляем секретный вопрос
if ($_POST['userID'] != "" && $_POST['answer'] != "")
{
$result = checkSecAnswer($_POST['userID'],$_POST['answer']);
if ($result == true)
{
// ответ верен
$error = false;
$show = 'successPage';
$passwordMessage = sendPasswordEmail($_POST['userID']);
$_SESSION['badCount'] = 0;
} else {
// ответ неверен
$error = true;
$show = 'securityForm';
$securityUser = $_POST['userID'];
$_SESSION['badCount']++;
}
}
else {
$error = true;
$show = 'securityForm';
}
break;
case 3:
// отправляем новый пароль (для случая с шифруемыми паролями)
if ($_POST['userID'] == '' || $_POST['key'] == '') header("location: login.php");
if (strcmp($_POST['pw0'],$_POST['pw1']) != 0 || trim($_POST['pw0']) == '')
{
$error = true;
$show = 'recoverForm';
} else {
$error = false;
$show = 'recoverSuccess';
updateUserPassword($_POST['userID'],$_POST['pw0'],$_POST['key']);
}
break;
}
}

elseif (isset($_GET['a']) && $_GET['a'] == 'recover' && $_GET['login'] != "") {
$show = 'invalidKey';
$result = checkEmailKey($_GET['login'],urldecode(base64_decode($_GET['u'])));
if ($result == false)
{
$error = true;
$show = 'invalidKey';
} elseif ($result['status'] == true) {
$error = false;
$show = 'recoverForm';
$securityUser = $result['userID'];
}
}

if ($_SESSION['badCount'] >= 3)
{
$show = 'speedLimit';
$_SESSION['lockout'] = true;
$_SESSION['lastTime'] = '' ? mktime() : $_SESSION['lastTime'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>&#65533;������� ��� ��������</title>
<link href="styles.css" rel="stylesheet" type="text/css">
</
head>

<
body>
<
div id="header"></div>
<
div id="page">
<?php switch($show) {
case 'emailForm': ?>
<h2>Восстановление пароля</h2>
<
p>Это форма для восстановления пароля. Введите ваш логин или email для того, чтобы начать.</p>
<?php if ($error == true) { ?><span class="error">Введите логин или пароль чтобы продолжить.</span><?php } ?>
<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
<
div class="fieldGroup"><label for="login">Email</label><div class="field"><input type="text" name="login" id="uname" value="" maxlength="20"></div></div>
<
input type="hidden" name="subStep" value="1" />
<
div class="fieldGroup"><input type="submit" value="Принять" style="margin-left: 150px;" /></div>
<
div class="clear"></div>
</
form>
<?php break; case 'securityForm': ?>
<h2>Восстановление пароля</h2>
<
p>Ответьте на секретный вопрос:</p>
<?php if ($error == true) { ?><span class="error">Для восстановления пароля вы должны правильно ответить на секретный вопрос.</span><?php } ?>
<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
<
div class="fieldGroup"><label>Вопрос</label><div class="field"><?= getSecurityQuestion($securityUser); ?></div></div>
<
div class="fieldGroup"><label for="answer">Ответ</label><div class="field"><input type="text" name="answer" id="answer" value="" maxlength="255"></div></div>
<
input type="hidden" name="subStep" value="2" />
<
input type="hidden" name="userID" value="<?= $securityUser; ?>" />
<
div class="fieldGroup"><input type="submit" value="Принять" style="margin-left: 150px;" /></div>
<
div class="clear"></div>
</
form>

<?php break; case 'userNotFound': ?> <h2>Восстановление пароля</h2> <p>Email не был найден в базе.<br /><br /><a href="?">Нажмите тут</a> чтобы попробывать снова.</p> <?php break; case 'successPage': ?>
<h2>Восстановление пароля</h2> <p>На ваш email было отправлено письмо с инструкциями. <strong>(Mail не заработает пока вы локально не активируете работу smtp сервера.)</strong><br /><br /><a href="login.php">Вернуться</a> на главную страницу. </p> <p>Это сообщение, которое отправится на email:</p> <div class="message"><?= $passwordMessage;?></div> <?php break;
case 'recoverForm': ?>
<h2>Восстановление пароля</h2>
<
p>И снова здрасти, <?= getUserName($securityUser=='' ? $_POST['userID'] : $securityUser); ?>.</p>
<
p>Введите ваш новый пароль.</p>
<?php if ($error == true) { ?><span class="error">Новый пароль не может быть пустым.</span><?php } ?>
<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
<
div class="fieldGroup"><label for="pw0">Новый пароль</label><div class="field"><input type="password" class="input" name="pw0" id="pw0" value="" maxlength="20"></div></div>
<
div class="fieldGroup"><label for="pw1">Подтверждение пароля</label><div class="field"><input type="password" class="input" name="pw1" id="pw1" value="" maxlength="20"></div></div>
<
input type="hidden" name="subStep" value="3" />
<
input type="hidden" name="userID" value="<?= $securityUser=='' ? $_POST['userID'] : $securityUser; ?>" />
<
input type="hidden" name="key" value="<?= $_GET['login']=='' ? $_POST['key'] : $_GET['login']; ?>" />
<
div class="fieldGroup"><input type="submit" value="Принять" style="margin-left: 150px;" /></div>
<
div class="clear"></div>
</
form>
<?php break; case 'invalidKey': ?>
<h2>Неверный ключ</h2>
<
p>Вы ввели неверный ключ. Или срок восстановления (3 дня) уже истёк, или вы уже пользовались этим ключём.<br /><br /><a href="login.php">Вернуться</a> на главную страницу. </p>
<?php break; case 'recoverSuccess': ?>
<h2>Пароль изменён</h2>
<
p>Поздравляю! Вы успешно изменили свой пароль.</p><br /><br /><a href="login.php">Вернуться</a> на главную страницу. </p>
<?php break; case 'speedLimit': ?>
<h2>Предупреждение</h2>
<
p>Вы много раз ответили неверно на секретный вопрос. Вы заблокированы на 15 минут.</p><br /><br /><a href="login.php">Вернуться</a> на главную страницу. </p>
<?php break; }
ob_flush();
$mySQL->close();
?>
<!--PAGE CONTENT-->
</
div>
</
body>
</
html>


functions.php:
session_start();
include_once("database.php");
define(PW_SALT,'(+3%_');

function checkUNEmail($uname)
{
global $mySQL;
$error = array('status'=>false,'userID'=>0);
if (isset($email) && trim($email) != '') {
// адрес электронной почты был введен
if ($SQL = $mySQL->prepare("SELECT `id` FROM `users` WHERE `login` = ? LIMIT 1"))
{
$SQL->bind_param('s',trim($email));
$SQL->execute();
$SQL->store_result();
$numRows = $SQL->num_rows();
$SQL->bind_result($userID);
$SQL->fetch();
$SQL->close();
if ($numRows >= 1) return array('status'=>true,'userID'=>$userID);
} else { return $error; }
}
elseif (isset($uname) && trim($uname) != '') {
// имя пользователя было введено
if ($SQL = $mySQL->prepare("SELECT `id` FROM `users` WHERE `login` = ? LIMIT 1"))
{
$SQL->bind_param('s',trim($uname));
$SQL->execute();
$SQL->store_result();
$numRows = $SQL->num_rows();
$SQL->bind_result($userID);
$SQL->fetch();
$SQL->close();
if ($numRows >= 1) return array('status'=>true,'userID'=>$userID);
} else { return $error; }
}
else {
// ничего не было введено
return $error;
}
}

function getSecurityQuestion($userID)
{
global $mySQL;
$questions = array();
$questions[0] = "Имя питомца";
$questions[1] = "Марка машины";
$questions[2] = "Дата свадьбы";
$questions[3] = "Любимая книга";
$questions[4] = "Любимый фильм";
$questions[5] = "Родной город";
if ($SQL = $mySQL->prepare("SELECT `secQ` FROM `users` WHERE `id` = ? LIMIT 1"))
{
$SQL->bind_param('i',$userID);
$SQL->execute();
$SQL->store_result();
$SQL->bind_result($secQ);
$SQL->fetch();
$SQL->close();
return $questions[$secQ];
} else {
return false;
}
}


function checkSecAnswer($userID,$answer)
{
global $mySQL;
if ($SQL = $mySQL->prepare("SELECT `login` FROM `users` WHERE `id` = ? AND LOWER(`secA`) = ? LIMIT 1"))
{
$answer = strtolower($answer);
$SQL->bind_param('is',$userID,$answer);
$SQL->execute();
$SQL->store_result();
$numRows = $SQL->num_rows();
$SQL->close();
if ($numRows >= 1) { return true; }
}
else {
return false;
}
}

function sendPasswordEmail($userID)
{
global $mySQL;
if ($SQL = $mySQL->prepare("SELECT `login`,`password` FROM `users` WHERE `id` = ? LIMIT 1"))
{
$SQL->bind_param('i',$userID);
$SQL->execute();
$SQL->store_result();
$SQL->bind_result($uname,$email,$pword);
$SQL->fetch();
$SQL->close();
$expFormat = mktime(date("H"), date("i"), date("s"), date("m") , date("d")+3, date("Y"));
$expDate = date("Y-m-d H:i:s",$expFormat);
$key = md5($uname . '_' . $email . rand(0,10000) .$expDate . PW_SALT);
if ($SQL = $mySQL->prepare("INSERT INTO `recoveryemails_enc` (`UserID`,`Key`,`expDate`) VALUES (?,?,?)"))
{
$SQL->bind_param('iss',$userID,$key,$expDate);
$SQL->execute();
$SQL->close();
$passwordLink = "<a href=\"?a=recover&email=" . $key . "&u=" . urlencode(base64_encode($userID)) . "\">http://www.yourbeat.com/forgotPass.php?a=recover&email=" . $key . "&u=" . urlencode(base64_encode($userID)) . "</a>";
$message = "Уважаемый(ая)$uname,\r\n";
$message .= "Пройдите по ссылке, чтобы изменить пароль:\r\n";
$message .= "-----------------------\r\n";
$message .= "$passwordLink\r\n";
$message .= "-----------------------\r\n";
$message .= "Ссылка будет действительно в течении 3х дней.\r\n\r\n";
$message .= "Ничего не делайте, если вы не запрашивали восстановение пароля.\r\n\r\n";
$message .= "Спасибо,\r\n";
$message .= "-- Команда сайта ...";
$headers .= "From: Our Site <webmaster@oursite.com> \n";
$headers .= "To-Sender: \n";
$headers .= "X-Mailer: PHP\n"; // отправитель
$headers .= "Reply-To: webmaster@oursite.com\n"; // адрес отправителя
$headers .= "Return-Path: webmaster@oursite.com\n"; // для ошибок
$headers .= "Content-Type: text/html; charset=iso-8859-1"; // тип данных
$subject = "Восстановление пароля";
@mail($email,$subject,$message,$headers);
return str_replace("\r\n","<br/ >",$message);
}
}
}

function checkEmailKey($key,$userID)
{
global $mySQL;
$curDate = date("Y-m-d H:i:s");
if ($SQL = $mySQL->prepare("SELECT `UserID` FROM `recoveryemails_enc` WHERE `Key` = ? AND `UserID` = ? AND `expDate` >= ?"))
{
$SQL->bind_param('sis',$key,$userID,$curDate);
$SQL->execute();
$SQL->execute();
$SQL->store_result();
$numRows = $SQL->num_rows();
$SQL->bind_result($userID);
$SQL->fetch();
$SQL->close();
if ($numRows > 0 && $userID != '')
{
return array('status'=>true,'userID'=>$userID);
}
}

return false;
}

function updateUserPassword($userID,$password,$key)
{
global $mySQL;
if (checkEmailKey($key,$userID) === false) return false;
if ($SQL = $mySQL->prepare("UPDATE `users` SET `password` = ? WHERE `id` = ?"))
{
$password = md5(trim($password) . PW_SALT);
$SQL->bind_param('si',$password,$userID);
$SQL->execute();
$SQL->close();
$SQL = $mySQL->prepare("DELETE FROM `recoveryemails_enc` WHERE `Key` = ?");
$SQL->bind_param('s',$key);
$SQL->execute();
}
}


function getUserName($userID)
{
global $mySQL;
if ($SQL = $mySQL->prepare("SELECT `login` FROM `users` WHERE `id` = ?"))
{
$SQL->bind_param('i',$userID);
$SQL->execute();
$SQL->store_result();
$SQL->bind_result($uname);
$SQL->fetch();
$SQL->close();
}
return $uname;
}


У меня в базе все сделано как надо для этого скрипта, не пойму почему он не выводит вопрос. Помогите. Вот ссылка на источник http://ruseller.com/lessons.php?rub=37&id=913
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.