update set in mysql db werkt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Jansen

Robert Jansen

25/05/2016 14:36:54
Quote Anchor link
hallo,

ik ben bezig met een wachtwoord vergeten script. je ziet eerst een formulier waar je je username en e-mail adres invoert, dan krijg je op het aangegeven e-mail adres een e-mail met daarin een link. open je de link dan kun je je ww wijzigen, dit werkt.
Maar als je op de knop update password klikt dan zal het ww in de database moeten veranderen, dit werkt nog niet.
Als ik een var_dump uitvoer van de query dan krijg ik: string(48) "UPDATE users SET password='w' WHERE username='' " .
Hij laat de username leeg, hoe kan ik veranderen?
Ik voeg de code erbij want misschien staat er ergens anders een fout?

alvast bedankt.

Dit is het eerste bestand:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<!DOCTYPE HTML>
<html lang="en">
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
</head>

<body>
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


include ("connect.php");

if(isset($_GET['code']) ? $_GET['code'] : null)
    {

        //$get_username = $_GET['username'];
        $get_username = isset($_GET['username']) && trim($_GET['username'])!='' ? $_GET['username'] : '';
        //$get_username = (!empty($_GET['username']) ? $_GET['username'] : null);
        //$get_code = $_GET['code'];
        //$db_username = $_GET['username'];

        $sq = "SELECT * FROM users WHERE username='$get_username' ";
        //var_dump($get_username);
        $result = mysqli_query($link, $sq)    or    die(mysqli_error());
        
        
        while($row = mysqli_fetch_assoc($result))
        {

            $db_code = $row['passreset'];
            $db_username = $row['username'];
            //$get_username = $row ['username'];
        }
        $db_username = null;
        $db_code = null;
        $get_code = null;
        
        if($get_username == $db_username && $get_code == $db_code)
        {

            echo "
                    <form action='pass_reset_complete.php?code=$get_code' method='POST'>
                        Enter a new password <br />
                        <input type='password' name='newpass'><br />
                        Re-enter your password <br />
                        <input type='password' name='newpass1'><br />
                        <input type='hidden' name='username' value='$db_username'>
                        <input type='submit' value='update password'>
                    </form>
            "
;
        }
    }

    //if(isset(!$_GET['code']) ? !$_GET['code'] : null)
    //if(!empty(!$_GET['code']) ? !$_GET['code'] : null);

    if(!$_GET['code'])
    {


echo "<form action='forgot_pass.php' method='POST'>Enter your username <br /> <input type='text' name='username'> <br />
    Enter your email <br /> <input type='text' name='email'><br />
    <input type='submit' value='submit' name='submit'>
</form> "
;

if(isset($_POST['submit']))
{

    $username = $_POST['username'];
    $email = $_POST ['email'];
    
    $query = "SELECT * FROM users WHERE username='$username'  ";
    
    $result = mysqli_query($link, $query)    or    die(mysqli_error());
    
    $numrow = mysqli_num_rows($result);
    
    if($numrow !=0)
    {

        while ($row = mysqli_fetch_assoc($result))
        {

            
            $db_email = $row['email'];
        }

        
        if($email == $db_email)
        {

            $code = rand(10000, 1000000);
            $to = $db_email;
            $subject = "password reset";
            $body = "Dit is een automatische E-mail, doe geen reply.
            Klik op de link of plak dit in de browser
            http://localhost/php/wachtwoord_vergeten/forgot_pass.php?code=$code$username=$username
            "
;
            
            $sql = "UPDATE users SET passreset='$code' WHERE username='$username' ";
            $result = mysqli_query($link, $sql)    or    die(mysqli_error());
            
            //mail($to, $subject, $body);
            
            include 'mail.php';

            
            echo "check your E-mail.";
        }

        else
        {
            echo "email is incorrect";
        }
        
        
    }

    else
    {
        echo "That username doesn't exist";
    }
}}

?>

</body>

</html>


Dit is het tweede bestand: waarbij je gaat updaten naar de db:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
include ("connect.php");
if(!empty($_POST['username'])){
    $post_username = $_POST['username'];
}


$newpass = $_POST['newpass'];
$newpass1 = $_POST['newpass1'];
$post_username = $_POST ['username'];
$code = $_GET['code'];

if($newpass == $newpass1)
{

    //$enc_pass = md5($newpass);
    $enc_pass = $newpass;
    
    $query = "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
    //$query = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
    $sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
    $result = mysqli_query($link, $query)    or    die(mysqli_error());
    $result = mysqli_query($link, $sql)    or    die(mysqli_error());
    //if (mysqli_query($link, $query)) {
    //echo "Record updated successfully";
//} else {
  //  echo "Error updating record: " . mysqli_error($link);
//}

    echo "Your password has been updated <p><a href='#'>Click here to login</a></p>";
    var_dump($query);
    //var_dump($sql);
    var_dump($post_username);
}

else
{
    echo "password must match <a href='forgot_pass.php?code=$code&username=$post_username'></a>click here to go back";
}


?>
 
PHP hulp

PHP hulp

25/12/2024 21:08:27
 
Ivo P

Ivo P

25/05/2016 15:24:30
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$query
= "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
$sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
?>


Dat kan natuurlijk ook in 1x:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query
= "UPDATE users SET password='$enc_pass', passreset='0' WHERE username='$post_username' ";
?>


Lost daarvan: kennelijk is $post_username dus leeg

volg terug op welke (2) plaats(en) deze een waarde krijgt en wat er in het betreffende POST element zat

een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo '<pre>'.print_r($_POST,1). '</pre>'; ?>

zou daar helderheid kunnen brengen
 
Robert Jansen

Robert Jansen

25/05/2016 15:35:02
Quote Anchor link
als ik de print_r invoer in het tweede bestand dan krijg ik:
Array
(
[newpass] => w
[newpass1] => w
[username] =>
)

hoe kan ik die username vullen?
 
Thomas van den Heuvel

Thomas van den Heuvel

25/05/2016 15:37:37
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sq
= "SELECT * FROM users WHERE username='$get_username' ";
?>

Deze query is zo lek als een mandje en is vatbaar voor SQL injectie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
http://localhost/php/wachtwoord_vergeten/forgot_pass.php?code=$code$username=$username

$username=$username? Zonder & of &amp; tussen de query-parameters?

Verder is password een gereserveerd woord in MySQL.

Waarom lopen alle acties (het tonen van een formulier, het verwerken van een formulier, het tonen van foutmeldingen) door elkaar in bovenstaande scripts? Ik raad je dringend aan al deze acties te scheiden in verschillende code-eenheden. Een bijkomend voordeel daarvan is dat die ook stukken makkelijker *in afzondering* te debuggen zijn dan deze, excusez-le-mot, brei.

EDIT: een username doorgeven via de URL is uit oogpunt van veiligheid ook geen goed idee volgens mij want proxies kunnen dit soort dingen cachen. In dat opzicht is POST data "veiliger" geloof ik.
Gewijzigd op 25/05/2016 15:47:16 door Thomas van den Heuvel
 
Robert Jansen

Robert Jansen

25/05/2016 15:51:07
Quote Anchor link
ik heb op internet gezocht naar een tutorial over wachtwoord vergeten scripts. Dan krijg je er heel veel van.
weet iemand een duidelijke en goede tutorial hierover, hoe ik een wachtwoord vergeten script kan maken?
 
- Ariën  -
Beheerder

- Ariën -

25/05/2016 15:58:36
Quote Anchor link
Een tutorial is ook weer zo basaal voor een 'wachtwoord vergeten' script.
Je moet gewoon de juiste stappen weten, en deze vertalen naar PHP.

De eerste stap is dat iemand zijn mailadres en of username invult.
Aan de hand van deze ingevoerde gegevens wordt er een willekeurige code gemaakt, die bedoeld is voor een mail met een link naar de pagina om een nieuw wachtwoord in te voeren.
Op die pagina vraag je twee keer het wachtwoord (invoercontrole) en voila... overschrijf het wachtwoordveld met het nieuwe wachtwoord, en verwijder je de tijdelijke code.

Uiteraard gebruik je hierbij password_hash() voor een betrouwbare en veilig opslag. Ook is het voordeel van deze stappen dat je geen wachtwoord via mail hoeft te versturen, en de gebruiker mag zelf zijn wachtwoord bepalen. Het beste is om hier wat restricties aan te hangen om de makkelijke wachtwoorden zoals: 'kat', 'geheim', 'asdf' tegen te gaan. Minimaal 8 tekens en een speciaal teken vind ik voldoende.
Gewijzigd op 25/05/2016 16:01:48 door - Ariën -
 
Ivo P

Ivo P

25/05/2016 16:01:14
Quote Anchor link
je moet niet een complete tutorial volgen, maar gewoon het stappenplan duidelijk hebben:

a) user geeft aan dat hij zijn password kwijt is.
vraag hem daarom iets dat bekend is: emailadres of username

b) markeer dat deze user zijn pass opvraagt en stuur hem per mail een code die je ook in je db bewaarde.

c) gebruiker klikt op link:
jij markeert de code als gebruikt en geeft deze gebruiker de mogelijkheid om zijn pw. aan te passen.
Liefst doe je dat zonder expliciet de username door te geven. Misschien de code nog even meegeven (aannemende dat de code uniek is) of de combinatie van username + code
 
Thomas van den Heuvel

Thomas van den Heuvel

25/05/2016 16:14:03
Quote Anchor link
Wat @Ariën en @Ivo hierboven zeggen. Het is veel handiger/belangrijker dat je eerst een soort van "recept" hebt van wat je gaat bouwen. Dit werkt doorgaans ook beter (eerst ontwerpen, dan bouwen). Uiteraard moet je ook wat kennis bezitten over wat safe/best practises zijn.

Wanneer je zo'n recept hebt, wordt de implementatie ook bijna triviaal, dit is (bijna) simpelweg aan de molen draaien.

En als je je weg nog moet vinden in dit alles: splits dit dan op in deelproblemen. Probeer dit soort dingen niet in één brok uit te werken maar verdeel dit in behapbare brokken. Dat bedoelde ik mede met het in stukken opdelen van de te bouwen functionaliteit: deze bestaan uit afzonderlijke stappen die ook in afzondering behandeld kunnen (en zouden moeten) worden. Zowel bij het bouwen als het debuggen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.