Странен проблем със смяна на парола

TaLenTo

Registered
Здравейте!

Значи имам странен проблем със смяната на парола в сайта ми. Проблем е следният, когато поискам да си сменя паролата всичко е точно

Първо поле - СТАРА ПАРОЛА

ВТОРО ПОЛЕ - НОВА ПАРОЛА

Така, попълвам първото поле със старата парола, а ако оставя долното поле въпреки, че съм му задал да прави проверка дали полето е празно, уви то записва въпреки всичко. Когато тръгна да влизам в акаунта оставям просто свободно полето за парола и влизам. Странен проблем! Ако някой може да помогне, ще съм му страшно благодарен.. +1 ..

Ето и кода

Код:
<?
if($_POST['change']) { 

$oldpass = md5($_POST['oldpass']);
$newpass = md5($_POST['newpass']);

if($oldpass !== $urow['password']) { 
echo '<font face=Tahoma size=2>Старата парола не се съвпада с текущата!</font><br/><br/>';
} elseif(empty($newpass)) { 
echo '<font face=Tahoma size=2>Въведете новата парола!</font><br/><br/>';
} else {
$changing = mysql_query("UPDATE users SET password='$newpass' WHERE id='$urow[id]'");
echo '<font face=Tahoma size=2>Паролата е сменена успешно!</font><br/><br/>';
}

} 
?>
 
Това - if($oldpass !== $urow['password']) {
трябва да е така if($oldpass != $urow['password']) {
и никъде не виждам от къде вземаш $urow
 
PHP:
if($oldpass !== $urow['password']) { 
$error[]=true;
echo '<font face=Tahoma size=2>Старата парола не се съвпада с текущата!</font><br/><br/>';
} elseif(empty($newpass) or strlen($newpass)<4) { 
$error[]=true;
echo '<font face=Tahoma size=2>Въведете новата парола!</font><br/><br/>';
} 
if(count($error)==0) {
$changing = mysql_query("UPDATE users SET password='$newpass' WHERE id='$urow[id]'");
echo '<font face=Tahoma size=2>Паролата е сменена успешно!</font><br/><br/>';
}
:?:
 
Първия код, разлика никаква..

Втория код на Иво, ами така изобщо нищо не сменя! Дава ми да въведа новата парола дори и да съм написал нещо .. :(
 
PHP:
if($oldpass !== $urow['password']) { 
$error[]=true;
echo '<font face=Tahoma size=2>Старата парола не се съвпада с текущата!</font><br/><br/>';
} elseif(empty($newpass) or strlen($newpass)<4) { 
$error[]=true;
echo '<font face=Tahoma size=2>Въведете новата парола!</font><br/><br/>';
} 
if(count($error)==0) {
$changing = mysql_query("UPDATE users SET password='$newpass' WHERE id='$urow[id]'");
echo '<font face=Tahoma size=2>Паролата е сменена успешно!</font><br/><br/>';
}
Бях пропуснал една буква :D
 
Моят вариант:

PHP:
if(isset($_POST['change'])){
	$old_password = md5($_POST['oldpassword']);
	$new_password = md5($_POST['newpassword']);
	
	//взимане от базата данни текущата парола
	if(isset($old_password, $new_password) && $old_password != $new_password && $old_password == $row['password']){
		$update = mysql_query("UPDATE `users` SET `password` = '{$new_password}' WHERE `password` = '{$old_password}'");
		if($update){
			echo "Успешно променихте вашата парола!";
			unset($old_password);
			unset($new_password);
		}
		else{
			echo "Възникна грешка при промяната!";
		}
	}
	else{
		echo "Възможни причини за тази грешка: <br />\n";
		echo "1. Не сте попълнили полето за старата или новата парола!<br />\n";
		echo "2. Старата и новата парола трябва да са различни!<br />\n";
		echo "3. Въведена е стара парола, която не съвпада с текущата на потребителя!<br />\n";
	}
}
 
relax4o каза:
Моят вариант:

PHP:
if(isset($_POST['change'])){
	$old_password = md5($_POST['oldpassword']);
	$new_password = md5($_POST['newpassword']);
	
	//взимане от базата данни текущата парола
	if(isset($old_password, $new_password) && $old_password != $new_password && $old_password == $row['password']){
		$update = mysql_query("UPDATE `users` SET `password` = '{$new_password}' WHERE `password` = '{$old_password}'");
		if($update){
			echo "Успешно променихте вашата парола!";
			unset($old_password);
			unset($new_password);
		}
		else{
			echo "Възникна грешка при промяната!";
		}
	}
	else{
		echo "Възможни причини за тази грешка: <br />\n";
		echo "1. Не сте попълнили полето за старата или новата парола!<br />\n";
		echo "2. Старата и новата парола трябва да са различни!<br />\n";
		echo "3. Въведена е стара парола, която не съвпада с текущата на потребителя!<br />\n";
	}
}
Ако ще се правят чак такива проверки, по-добре да се сложи javascript валидация на формата.
 
ivo_pi4a - Този код записва празното поле като нова парола.

relax4o - Честно казано така нищо не става! :(
 
Дай си формата. Проблема е в теб :) Предполагам, че проблема идва от това, че аз съм кръстил полетата на формата с oldpassword и newpassword, а твоите са oldpass и newpass. :)
 
Видях точно от къде идва проблема в моят код!!!

Проблема идва от там, че записвам новата парола в md5 смисъл, кодирам я и това, че оставам празно явно също му се пише като парола и я кодира. Когато махна md5 на новата парола записва само числата, но не разрешава да оставям празно полето. :)
 
PHP:
 <?
if($_POST['change']) { 

$oldpass = md5($_POST['oldpass']);
$newpass = ($_POST['newpass']);

if($oldpass !== $urow['password']) { 

$error[]=true;

echo '<font face=Tahoma size=2>Старата парола не се съвпада с текущата!</font><br/><br/>';

} elseif(empty($newpass) or strlen($newpass)<4) { 

$error[]=true;

echo '<font face=Tahoma size=2>Въведете новата парола!</font><br/><br/>';

} 

if(count($error)==0) {
$nnewpass=md5($newpass);
$changing = mysql_query("UPDATE users SET password='$nnewpass' WHERE id='$urow[id]'");

echo '<font face=Tahoma size=2>Паролата е сменена успешно!</font><br/><br/>';

}


} 
?>
Така трябва да стане ;]
 
Показва, че записва всичко, ОК! Но когато пробвам да вляза ми дава, че потребителското или паролата са грешни.. влизам във phpmyadmin и гледам, че не записва нищо, а когато напиша примерно да смени паролата на 000000 пише, че е сменена.. но записва празен запис във mysql :)
 
Код:
<form action="" method="POST">
<table border="0" cellspacing="2" cellpadding="2">
 <tr>
	<td><font face="Tahoma" size="2">Старата парола:</font>  <font color="red" font="Tahoma" size="2">*</font></td>
	<td><input type="password" name="oldpass" size="45"></td>
 </tr>
 <tr>
	<td><font face="Tahoma" size="2">Новата парола:</font>  <font color="red" font="Tahoma" size="2">*</font></td>
	<td><input type="password" name="newpass" size="45"></td>
 </tr>
 <tr>
	<td colspan="2" height="40px"><small>Полетата със звездички <font color="red" font="Tahoma" size="2">*</font> са задължителни!</small></td>
 </tr>
 <tr>
	<td colspan="2"><input type="submit" name="change" value="Смени"></td>
 </tr>
</table>
</form>
 
PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");

if(isset($_POST['change'])){
	$old_password = md5($_POST['oldpass']);
	$new_password = trim($_POST['newpass']);
	
	if(isset($old_password) && !empty($new_password) && $old_password != $new_password && $old_password == $row['password']){
		$update = mysql_query("UPDATE `accounts` SET `password` = '" . md5($new_password) . "' WHERE `password` = '{$old_password}'");
		if($update){
			echo "Успешно променихте вашата парола!";
		}
		else{
			echo "Грешка с промяната на паролата!";
		}
	}
	else{
		echo "Възможни причини за тази грешка: <br />\n";
		echo "1. Не сте попълнили полето за старата или новата парола!<br />\n";
		echo "2. Старата и новата парола трябва да са различни!<br />\n";
		echo "3. Въведена е стара парола, която не съвпада с текущата на потребителя!<br />\n";
	}
}
?>

Айде... :)
 
@relax4o ти даде отговора, ама не ти каза защо прави така :D
Проблема е там, че md5 прави всеки текст в 16 симвулен(май-толкова беше) и дори и празно да го оставиш се превръща в 16 симвула. Демек няма как да е празно. Затова първо проверяваш полето дали е празно и ако не е го минаваш с md5.
 
Давам точката на @relax4o, въпреки положените усилия и от 2мата, но от на relax4o скрипта видях как да оправя моя без да вземам целият негов. :) Благодаря и на 2мата!!
 

Back
Горе