hulp,Wachtwoord vergeten script

Status
Niet open voor verdere reacties.

rominick

Gebruiker
Lid geworden
15 jun 2015
Berichten
28
Beste mensen,

Ik heb geprobeerd een wachtwoord vergeten script te maken, maar dat is neit gelukt :(.
Wat ik wilde was: als er op de knop geklikt wordt, stuurt hij je een email, in die mail staat je nieuwe wachtwoord die ook in de database is toegepast, alleen in de database is hij gehashed.
Maar op een of andere reden doet hij het niet.

Hier de code:

Code:
<?php
require_once 'db_config1.php';

//This code runs if the form has been submitted
if (isset($_POST['submit']))
{

// check for valid email address
$email = $_POST['remail'];
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
     $error[] = 'Please enter a valid email address';
}

// checks if the username is in use
$check = mysql_query("SELECT Email FROM Beheerder WHERE Email = '$email'")or die(mysql_error());
$check2 = mysql_num_rows($check);

//if the name exists it gives an error
if ($check2 == 0) {
$error[] = 'Sorry, we cannot find your account details please try another email address.';
}

// if no errors then carry on
if (!$error) {

$query = mysql_query("SELECT Gebruikersnaam FROM Beheerder WHERE Email = '$email' ")or die (mysql_error());
$r = mysql_fetch_object($query);

//create a new random password

$password = substr(md5(uniqid(rand(),1)),3,10);
$pass = md5($password); //encrypted version for database entry

//send email
$to = "$email";
$subject = "Account Details Recovery";
$body = "Hi $r->username, nn you or someone else have requested your account details. nn Here is your account information please keep this as you may need this at a later stage. nnYour username is $r->username nn your password is $password nn Your password has been reset please login and change your password to something more rememberable.nn Regards Site Admin";
$additionalheaders = "From: <user@domain.com>rn";
$additionalheaders .= "Reply-To: noprely@domain.com";
mail($to, $subject, $body, $additionalheaders);

//update database
$sql = mysql_query("UPDATE Beheerder SET Wachtwoord='$pass' WHERE Email = '$email'")or die (mysql_error());
$rsent = true;


}// close errors
}// close if form sent

//show any errors
if (!empty($error))
{
        $i = 0;
        while ($i < count($error)){
        echo "<div class='msg-error'>".$error[$i]."</div>";
        $i ++;}
}// close if empty errors


if ($rsent == true){
    echo "<p>You have been sent an email with your account details to $email</p>n";
    } else {
    echo "<p>Please enter your e-mail address. You will receive a new password via e-mail.</p>n";
    }

?>

<form action="" method="post">
<p>Email Address: <input type="text" name="remail" size="30" maxlength="100">
<input type="submit" name="submit" value="Get New Password"></p>
</form>

Ik kom er echt niet meer uit.
 
Wat gebeurt er precies?

Verder zijn de mysql-functies die je gebruikt verouderd. Sta over op de functiebibliotheken van MySQLi of PDO.
md5() is ook zeer onveilig.
 
Dank voor de reacties,

Hij zegt als er niks is ingevult dat:

//update database
$sql = mysql_query("UPDATE Beheerder SET Wachtwoord='$pass' WHERE Email = '$email'")or die (mysql_error());
$rsent = true;

Dat $rsent = true; niet bestaat bij de if statement.
Maar is wel aangegeven dat als het true is, hij de email verzend?
 
Is je query gewoon niet stuk?

Zie ook mijn vorige reacties. In PHP7 zal je script 'breken'.
 
Is je query gewoon niet stuk?

Zie ook mijn vorige reacties. In PHP7 zal je script 'breken'.

heb even gekeken, dit zijn de foutmeldingen:
Als er nog niks is gedaan, de standaard pagina eigenlijk
Notice: Undefined variable: rsent in /Applications/XAMPP/xamppfiles/htdocs/gravilux/forgot.php on line 60

als er random letters ingevult worden

Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Applications/XAMPP/xamppfiles/htdocs/gravilux/forgot.php:15 Stack trace: #0 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/gravilux/forgot.php on line 15


Maar ik ga proberen het om te zetten naar mysqli.

EDIT: Ben ermee bezig, maar is nog best lastig.
 
Laatst bewerkt:
Je moet dus inderdaad mysqli gebruiken.
Last even weten of het wel/niet lukt.
 
Laatst bewerkt:
Je moet dus inderdaad mysqli gebruiken.
Last even weten of het wel/niet lukt.

Hij doet het nu een stuk beter dan eerst.

MEt name, als er nu iets was geen email is wordt ingevult. krijg ik een melding dat het geen geldig emailadres is(is goed).

Als ik een emailadres invul die ook in de database staat, geeft hij deze melding:
Catchable fatal error: Object of class stdClass could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/gravilux/forgot.php on line 39

Heb opgezocht en het kan komen door
Code:
$body = "Hi $r->$Gebruikersnaam, nn you or someone else have requested your account details. nn Here is your account information please keep this as you may need this at a later stage. nnYour username is $r->$Gebruikersnaam	 nn your password is $password nn Your password has been reset please login and change your password to something more rememberable.nn Regards Site Admin";

Code:
<?
try{
	//This code runs if the form has been submitted
	if (isset($_POST['submit']))
	{
	$conn = mysqli_connect(/*knip*/);
		$error = "";
		$rsent = false;

		// check for valid email address
		$email = $_POST['remail'];
			if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
			     $error[] = 'Please enter a valid email address';
			}
		
		// checks if the username is in use
		
		$check = mysqli_query($conn, "SELECT Email FROM Beheerder WHERE Email = '$email'");
		$check2 = mysqli_num_rows($check);

		//if the name exists it gives an error
		if ($check2 == 0) {
			$error[] = 'Sorry, we cannot find your account details please try another email address.';
		}
		
		// if no errors then carry on
		if (!$error) {
			$query = mysqli_query($conn, "SELECT Gebruikersnaam FROM Beheerder WHERE Email = '$email'");
			$r = mysqli_fetch_object($query);
			echo "check";
			//create a new random password
			
			$password = substr(md5(uniqid(rand(),1)),3,10);
			$pass = md5($password); //encrypted version for database entry
			
			//send email
			$to = "$email";
			$subject = "Account Details Recovery";
			$body = "Hi $r->$Gebruikersnaam, nn you or someone else have requested your account details. nn Here is your account information please keep this as you may need this at a later stage. nnYour username is $r->$Gebruikersnaam	 nn your password is $password nn Your password has been reset please login and change your password to something more rememberable.nn Regards Site Admin";
			$additionalheaders = "From: <user@domain.com>rn";
			$additionalheaders .= "Reply-To: noprely@domain.com";
			mail($to, $subject, $body, $additionalheaders);
			
			//update database
			$sql = mysqli_query($conn, "UPDATE Beheerder SET Wachtwoord='$pass' WHERE Email = '$email'");
			$rsent = true;
		}// close errors
	}// close if form sent

//show any errors
if (!empty($error))
{
        $i = 0;
        while ($i < count($error)){
        echo "<div class='msg-error'>".$error[$i]."</div>";
        $i ++;}
}// close if empty errors


if ($rsent == true){
    echo "<p>You have been sent an email with your account details to $email</p>n";
    } else {
    echo "<p>Please enter your e-mail address. You will receive a new password via e-mail.</p>";
    }
}
catch(PDOException $e)
	{
		$sMsg = '<p>
				Regelnummer: '.$e->getLine().'<br />
				Bestand: '.$e->getFile().'<br />
				Foutmelding: '.$e->getMessage().'
			</p>';
		trigger_error($sMsg);
	}
?>

<form action="" method="post">
<p>Email Address: <input type="text" name="remail" size="30" maxlength="100">
<input type="submit" name="submit" value="Get New Password"></p>
</form>
 
Laatst bewerkt door een moderator:
Huh? PDO (Exception) en MySQLi?
Dat is zo een beetje hetzelfde als een BMW-ontsteking in de motor van een Volkswagen te frotten. Dat werkt niet ;)

Je haalt echt twee dingen door elkaar. Ikzelf raad MySQLi aan, en dan heb je die try-catch en PDO blokken niet eens nodig.
 
Laatst bewerkt:
Huh? PDO (Exception) en MySQLi?
Dat is zo een beetje hetzelfde als een BMW-ontsteking in de motor van een Volkswagen te frotten. Dat werkt niet ;)

Je haalt echt twee dingen door elkaar. Ikzelf raad MySQLi aan, en dan heb je die try-catch en PDO blokken niet eens nodig.

Heb het aangepast, is nu alleen mysqli.

Het gaat hier fout volgen de foutcode die ik krijg:

Code:
if (!$error) {
			$query = mysqli_query($conn, "SELECT Gebruikersnaam FROM Beheerder WHERE Email = '$email'");
			$r = mysqli_result::fetch_object($query);
			echo "check";
			//create a new random password
			
			$password = substr(md5(uniqid(rand(),1)),3,10);
			$pass = md5($password); //encrypted version for database entry
			
			//send email
			$to = "$email";
			$subject = "Account Details Recovery";
			$body = "Hi $r->$Gebruikersnaam, nn you or someone else have requested your account details. nn Here is your account information please keep this as you may need this at a later stage. nnYour username is $r->$Gebruikersnaam	 nn your password is $password nn Your password has been reset please login and change your password to something more rememberable.nn Regards Site Admin";
			$additionalheaders = "From: <user@domain.com>rn";
			$additionalheaders .= "Reply-To: noprely@domain.com";
			mail($to, $subject, $body, $additionalheaders);
			
			//update database
			$sql = mysqli_query($conn, "UPDATE Beheerder SET Wachtwoord='$pass' WHERE Email = '$email'");
			$rsent = true;
		}// close errors

En ik denk dat ik dit stuk niet goed heb begrepen van de documentatie:
Code:
$query = mysqli_query($conn, "SELECT Gebruikersnaam FROM Beheerder WHERE Email = '$email'");
			$r = mysqli_result::fetch_object($query);
			echo "check";
			//create a new random password
 
Waarom mysqli_result::fetch_object

Niet vervelend bedoeld, maar probeer je nu gewoon lukraak wat dingen zonder te lezen?

Hint:
Code:
$r = mysqli_fetch_assoc($query);
 
Laatst bewerkt:
Waarom mysqli_result::fetch_object

Niet vervelend bedoeld, maar probeer je nu gewoon lukraak wat dingen zonder te lezen?

Hint:
Code:
$r = mysqli_fetch_assoc($query);

Ik had even iets geprobeerd, maar uw hint komt bijna overeen met wat ik nu namelijk:
Code:
$r = mysqli_fetch_object($query);

Kreeg net een mail binnen van het systeem, dus ik ga nu opzoeken hoe ik van array naar gegeven ga.
Met uw stukje code ben ik al een heel stuk verder.

Hartelijk Bedankt!!
 
Laatst bewerkt:
Ik zou bij voorkeur assoc gebruiken. Dit heeft te maken met de indexes van de array, en is sneller.
Verder kan je dan $r['veldnaam'] gebruiken om je data op te roepen. Dit geldt dan voor één record. Anders moet je dit combineren met while() { } .
 
Het is opgelost!
Heel erg bedankt PHP4U!!

Voor de mensen hier de code:

Code:
<?
$rsent = false;

	//This code runs if the form has been submitted
	if (isset($_POST['submit']))
	{
	$conn = mysqli_connect(/*knip*/);
		$error = "";

		// check for valid email address
		$email = $_POST['remail'];
			if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
			     $error[] = 'Please enter a valid email address';
			}
		
		// checks if the username is in use
		
		$check = mysqli_query($conn, "SELECT Email FROM Beheerder WHERE Email = '$email'");
		$check2 = mysqli_num_rows($check);
		
		//if the name exists it gives an error
		if ($check2 == 0) {
			$error[] = 'Sorry, we cannot find your account details please try another email address.';
		}
		
		// if no errors then carry on
		if (!$error) {
			$query = mysqli_query($conn, "SELECT Gebruikersnaam FROM Beheerder WHERE Email = '$email'");
			$r = mysqli_fetch_assoc($query);

			//create a new random password
			$password = substr(md5(uniqid(rand(),1)),3,10);
			$pass = password_hash($password, PASSWORD_DEFAULT); //encrypted version for database entry

			//send email
			$to = "$email";
			$subject = "Account Details Recovery";
			$body = "Hi $r[Gebruikersnaam], \n\n you or someone else have requested your account details. \n\n Here is your account information please keep this as you may need this at a later stage. \n\nYour username is $r[Gebruikersnaam]	 \n\n your password is $password \n\n Your password has been reset please login and change your password to something more rememberable.\n\n Regards Site Admin";
			$additionalheaders = "From: <user@domain.com>\n";
			$additionalheaders .= "Reply-To: noprely@domain.com";
			mail($to, $subject, $body, $additionalheaders);
			
			//update database
			$sql = mysqli_query($conn, "UPDATE Beheerder SET Wachtwoord='$pass' WHERE Email = '$email'");
			$rsent = true;

		}// close errors
	}// close if form sent

//show any errors
if (!empty($error))
{
        $i = 0;
        while ($i < count($error)){
        echo "<div class='msg-error'>".$error[$i]."</div>";
        $i ++;}
}// close if empty errors


if ($rsent == true){
    echo "<p>You have been sent an email with your account details to $email</p>n";
    } else {
    echo "<p>Please enter your e-mail address. You will receive a new password via e-mail.</p>";
    }
?>

<form action="" method="post">
<p>Email Address: <input type="text" name="remail" size="30" maxlength="100">
<input type="submit" name="submit" value="Get New Password"></p>
</form>
 
Laatst bewerkt door een moderator:
Fijn dat het gelukt is!
 
Beste mensen,

Dank voor het mooie script. Ik heb één probleem.
Bij een error (verkeerd of geen e-mailadres invullen) krijg ik de volgende melding: Fatal error: Uncaught Error: [] operator not supported for strings
Wanneer ik op regel 8 $error="" wijzig in $error[]="", dan geeft hij bij een error alle foutmeldingen weer.
Wat te doen?

Al vast dank voor jullie hulp.
 
$error = "";

moet zijn

$error = array();

Het is een array, oftewel een container met informatie (errors) en geen string.
 
Kwestie van datatypes kennen en errors lezen :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan