Здравствуйте! Вот столкнулся с такой проблемой. На сайте есть страница, ну типа мой профиль, где зарегестрированный пользователь может изменить свои данные. Так вот при смене пароля, сравнение введенного нового пароля и подтверждения пароля работает, а внизу формы строка, т.е. для сохранения данных нужно ввести текущий пароль, никак не получается. Выходит что действие if неверно и все. И еще вопрос, если закомментировать эту строку, то обновление данных юзера в базе не производится. Помогите пожалуйста. Я еще новичок, строго не судите, вот код скрипта profile.php PHP: <?php if ($_SESSION['autorizied']==true) { if (!isset($_POST['change'])) //если не нажата кнопка то выводим форму { $user_login=$_SESSION['login']; $zap_userdata=mysql_query("SELECT * FROM users WHERE login='".$user_login."'"); $user_dannye=mysql_fetch_array($zap_userdata); $user_email=$user_dannye['email']; $user_status=$user_dannye['status']; $user_password=$user_dannye['password'];//текущий пароль $user_name=$_SESSION['name']; $user_gruppa=$_SESSION['gruppa']; ?> <title>Профиль пользователя</title> <center><h2>Редактирование профиля</h2></center><br> <form method='post' action=''> Логин:<input type='text' name='newlogin' value='<?php echo $user_login; ?>'><br> Пароль:<input type='password' name='newpass' value= ''><br> Повтор пароля:<input type='password' name='renewpass' value= ''><br> E-mail:<input type='text' name='newemail' value='<?php echo $user_email; ?>'><br> Имя:<input type='text' name= 'newname' value='<?php echo $user_name; ?>'><br><br> Введите текущий пароль:<input type='password' name='pass' value=''><br> <input name='change' type='submit' value='Сохранить изменения'><br> </form> <?php } else { $new_login=mysql_escape_string($_POST['newlogin']); $new_mail_pass=mysql_escape_string($_POST['newpass']); $new_pass=md5($new_mail_pass); $new_repass=md5(mysql_escape_string($_POST['renewpass'])); $new_email=mysql_escape_string($_POST['newemail']); $new_name=mysql_escape_string($_POST['newname']); $old_password=md5(mysql_escape_string($_POST['pass'])); if ($new_login==''){unset($new_login);} if ($new_email==''){unset($new_email);} if ($new_name=='') {unset($new_name);} if ($new_pass=='') {unset($new_pass);} if ($new_repass=='') {unset($new_repass);} if ($new_pass == $new_repass) { if ($old_password !== $user_password) { //если все правильно, то обновляем данные юзера include_once ("conf/connect.php"); $upd_data_login=mysql_query("UPDATE users SET login = '".$new_login."' WHERE login ='".$user_login."'"); $upd_data_email=mysql_query("UPDATE users SET email = '".$new_email."' WHERE login ='".$user_login."'"); $upd_data_name=mysql_query("UPDATE users SET name = '".$new_name."' WHERE login ='".$user_login."'"); $upd_data_pass=mysql_query("UPDATE users SET password = '".$new_pass."' WHERE login ='".$user_login."'"); //формируем письмо include_once ("includes/functions.inc.php"); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n"; // Откуда пришло $headers .= 'From:Сайт %sitename%' . "\r\n"; //Здесь укажите электронный адрес, куда будут уходить сообщения $mailto = $new_email OR $user_email; $subject = "Изменение ваших данных"; $message = 'Здравствуйте '.$new_name OR $user_name."<br>"; $message .= 'Ваши данные были успешно изменены на новые:br>'; $message .= 'Ваш логин: '.$new_login OR $user_login."<br>"; $message .= 'Ваш пароль: '.$new_mail_pass OR $user_password."<br>"; sendmail($mailto,$subject,$message,$headers); echo '<center><h3>Ваши данные успешно изменены. На указанный Вами e-mail была отправлена информация о новых данных.</h3><br> <a href=/index.php>На главную!</a></center>'; } else { echo 'Вы не ввели текущий пароль, либо ввели его неправильно!<br>Попробуйте <a href=/index.php?page=profile>заново</a><br>'; } } else { echo 'Введенные пароли не совпадают!<br>Попробуйте <a href=/index.php?page=profile>заново</a>'; } } } else { echo '<title>Ошибка!</title>'; echo '<center><h3>Вы не авторизованы! Пожалуйста войдите в систему под своим логином и паролем, или <a href=/index.php?page=register>зарегистрируйтесь!</h3></center></a>'; } ?>
И еще добавлю, в строке 44 не должно быть знака ! это я тестировал на предмет обновления данных в базе. Строка 42 отрабатывает нормально, но что не так в 44? Пароль текущий ввожу правильный, но условие не отрабатывает, выкидывает на ELSE. В чем ошибка?
$upd_data_login=mysql_query("UPDATE users SET login = '".$new_login."' WHERE login ='".$user_login."'"); $upd_data_email=mysql_query("UPDATE users SET email = '".$new_email."' WHERE login ='".$user_login."'"); $upd_data_name=mysql_query("UPDATE users SET name = '".$new_name."' WHERE login ='".$user_login."'"); $upd_data_pass=mysql_query("UPDATE users SET password = '".$new_pass."' WHERE login ='".$user_login."'"); это все в один запрос пиши, через запятую UPDATE users SET login = '".$new_login."', name = '".$new_name."' WHERE login ='".$user_login."' if ($old_password == $user_password) { } else { ... }
Апельсин Ну на счет этого я понял, перепишу. Код (Text): $upd_data_login=mysql_query("UPDATE users SET login = '".$new_login."' WHERE login ='".$user_login."'"); $upd_data_email=mysql_query("UPDATE users SET email = '".$new_email."' WHERE login ='".$user_login."'"); $upd_data_name=mysql_query("UPDATE users SET name = '".$new_name."' WHERE login ='".$user_login."'"); $upd_data_pass=mysql_query("UPDATE users SET password = '".$new_pass."' WHERE login ='".$user_login."'"); А разве у меня не так идет код как ты написал?
В упор не могу различить, вроде и есть все так: PHP: if ($old_password == $user_password) { } else { ... }
и учись вручную следить, до куда доходит выполнение кода. Ставь echo 222 кудато, чтоб определить, отрабатывается тот участок или нет. Если вывело 222, ставь ниже echo 222 и так пока не найдешь проблемный участок. Если не срабатывает какоето условие if|else - смотри что в него приходит, выводи на экран содержимое переменных. А то так долго гадать можно.
if ($new_pass == $new_repass) { echo 111; if ($old_password !== $user_password) { echo 222; } else { echo 333; } } else { echo 444; } вот так и смотри что не работает
Спасибо за совет. Ща попробую заново все разложить код на куски. Есть подозрение что может быть изначально при извлечении пароля из базы в строке 11 чего не так?
сначала замени вот на этот код. если в участке 111 ничего нет - значит проблема в условии if ($new_pass == $new_repass). Тогда нужно смотреть что в этих двух переменных
Вот такой есть код в изначальном виде. PHP: if ($_SESSION['autorizied']==true) { if (!isset($_POST['change'])) //если не нажата кнопка то выводим форму { $user_login=$_SESSION['login']; $zap_userdata=mysql_query("SELECT * FROM users WHERE login='".$user_login."'"); $user_dannye=mysql_fetch_array($zap_userdata); $user_email=$user_dannye['email']; $user_status=$user_dannye['status']; $user_password=$user_dannye['password'];//текущий пароль $user_name=$_SESSION['name']; $user_gruppa=$_SESSION['gruppa']; ?> <title>Профиль пользователя</title> <center><h2>Редактирование профиля</h2></center><br> <form method='post' action=''> Логин:<input type='text' name='newlogin' value='<?php echo $user_login; ?>'><br> Пароль:<input type='password' name='newpass' value= ''><br> Повтор пароля:<input type='password' name='renewpass' value= ''><br> E-mail:<input type='text' name='newemail' value='<?php echo $user_email; ?>'><br> Имя:<input type='text' name= 'newname' value='<?php echo $user_name; ?>'><br><br> Введите текущий пароль:<input type='password' name='pass' value=''><br> <input name='change' type='submit' value='Сохранить изменения'><br> </form> <?php } else { $new_login=mysql_escape_string($_POST['newlogin']); $new_mail_pass=mysql_escape_string($_POST['newpass']); $new_pass=md5($new_mail_pass); $new_repass=md5(mysql_escape_string($_POST['renewpass'])); $new_email=mysql_escape_string($_POST['newemail']); $new_name=mysql_escape_string($_POST['newname']); $old_password=md5(mysql_escape_string($_POST['pass'])); if ($new_login==''){unset($new_login);} if ($new_email==''){unset($new_email);} if ($new_name=='') {unset($new_name);} if ($new_pass=='') {unset($new_pass);} if ($new_repass=='') {unset($new_repass);} if ($new_pass == $new_repass) { if ($old_password == $user_password) { //если все правильно, то обновляем данные юзера include_once ("conf/connect.php"); $upd_data_login=mysql_query("UPDATE users SET login = '".$new_login."' WHERE login ='".$user_login."'"); $upd_data_email=mysql_query("UPDATE users SET email = '".$new_email."' WHERE login ='".$user_login."'"); $upd_data_name=mysql_query("UPDATE users SET name = '".$new_name."' WHERE login ='".$user_login."'"); $upd_data_pass=mysql_query("UPDATE users SET password = '".$new_pass."' WHERE login ='".$user_login."'"); //формируем письмо include_once ("includes/functions.inc.php"); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n"; // Откуда пришло $headers .= 'From:Сайт %sitename%' . "\r\n"; //Здесь укажите электронный адрес, куда будут уходить сообщения $mailto = $new_email OR $user_email; $subject = "Изменение ваших данных"; $message = 'Здравствуйте '.$new_name OR $user_name."<br>"; $message .= 'Ваши данные были успешно изменены на новые:br>'; $message .= 'Ваш логин: '.$new_login OR $user_login."<br>"; $message .= 'Ваш пароль: '.$new_mail_pass OR $user_password."<br>"; sendmail($mailto,$subject,$message,$headers); echo '<center><h3>Ваши данные успешно изменены. На указанный Вами e-mail была отправлена информация о новых данных.</h3><br> <a href=/index.php>На главную!</a></center>'; } else { echo 'Вы не ввели текущий пароль, либо ввели его неправильно!<br>Попробуйте <a href=/index.php?page=profile>заново</a><br>'; } } else { echo 'Введенные пароли не совпадают!<br>Попробуйте <a href=/index.php?page=profile>заново</a>'; } } } else { echo '<title>Ошибка!</title>'; echo '<center><h3>Вы не авторизованы! Пожалуйста войдите в систему под своим логином и паролем, или <a href=/index.php?page=register>зарегистрируйтесь!</h3></center></a>'; }
Спасибо Апельсин, пойду дальше разбираться. Я как то об этом методе проверки не подумал. Хотя Условие if ($new_pass == $new_repass). работает, т.к. когда вводишь заведомо разные новые пароли, выкидывает на строку 77 как и должно быть.
Я обычно Код (Text): die('here'); пишу)) LeXXXX35 Осмелюсь посоветовать дебаггерскую функцию Код (Text): function dg($var = null) { if(!isset($var)) die('$var not isset'); echo "<pre>"; print_r($var); die(); } Очень удобно отслеживать значение переменных. У меня размещена так, чтобы в любом месте приложения была доступна. Еще можно print_r на var_dump заменить, но обычно print_r достаточно.
Всем спасибо, разобрался, на самом деле переменная $user_password была пуста, т.к. ее значение было до условия IF|ELSE. Пришлось вынести кусок кода в отдельный файл и инклудить в нужном месте. Теперь все работает.
Всё это хорошо, конечно, но всё хорошее когда-нибудь заканчивается. Обычно в тот момент, когда количество классов, интерфейсов и пересечение имен локальных и глобальных переменных настолько значительны в объеме, что держать это в голове просто становится невозможным. Да и бессмысленным. И тогда приходится отлавливать значение переменной в определенный момент, следить за её динамикой по step-by-step.