fout in me script snap het niet. php7?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Nilix bies

nilix bies

05/08/2018 17:44:38
Quote Anchor link
Beste iedereen.

Ik hoop dat hier een paar php freaks zijn die mij kunnen helpen

Ik beheer een kleine website voor onze fotoclub. Nu is de webhosting in eens over gegaan naar php7.
Hier door werken enkele scripts niet meer ik heb de meeste weer goed gekregen door aan passingen. Maar net de inlog script voor leden werkt niet meer.
Mijn mysql data base is goed daar worden wel gegeven uit opgehaald op een andere test pagina en voor de portfolio's


Na het inloggen komt er gelijk een fout.
Hier door komt er ook een stuk van het scrip in beeld wat normaal niet zou kunnen
Dit zie ik in beeld staan:

Fout: ingevoerd gebruikersnaam klopt niet!</p>";
}else{ //mailadres staat in de database, we gaan verder!
while($record = mysqli_fetch_object($ophalen)){
$password_db = $record->wachtwoord;

}


---------------------------------------
Ik weet niet of het nu wel mag maar hier onder mijn script wat is er fout?

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
<?
    session_start();




if ($_POST['submit']=="login")
{

include "log.php";
  
  $gebrnaam ==(strtolower ( $_POST['gebruikersnaam']));
 
   $sql = "SELECT * FROM `leden` WHERE `gebruikersnaam` = '".$_POST['gebruikersnaam']."'";
 
   $ophalen = mysqli_query($con, $sql);
  $aantal = mysqli_num_rows($ophalen); // aantal records met verstuurd emailadres tellen
  
  if($aantal == 0){
            
      echo"<p>Fout: ingevoerd gebruikersnaam  klopt niet!</p>";

    }
else{
  
     //mailadres staat in de database, we gaan verder!
  
      while($record = mysqli_fetch_object($ophalen)){
       $password_db = $record->wachtwoord;
  
     }

  
     //password nu vergelijken met ingevoerd password
 
       if($password_db != $_POST['wachtwoord']){
  
        echo"<p>Verkeerd wachtwoord!</p>";
  
      }
else{
  
     //email staat in database en password klopt, sessie starten!
 
           while($record = mysqli_fetch_object($ophalen)){  
            $id = $record->id;}
  
          //sessie opstarten
 
              $idlog=(strtolower ($_POST['gebruikersnaam']));

  
         $_SESSION["idlog"]= $idlog;
    
        if ($idlog == "admin"){
 
          echo "<meta http-equiv=REFRESH content=0;url=adm.php?idlog=". $_POST['gebruikersnaam'] . " target=main> ";

                 }

                 else{
             echo "gelukt ";

            $datenu=date("d-m-y");
      
       mysqli_query ($con, "UPDATE leden SET datenu='$datenu' WHERE gebruikersnaam='$idlog'");
  
         echo "<meta http-equiv=REFRESH content=0;url=loginstart.php?idlog=". $_POST['gebruikersnaam'] . " target=main> ";
}
        
      }
    }

}


?>


<head>
<link a href="instel.css"rel="stylesheet"type="text/css" />
</head>
<body class=body>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php include("top.php");
 ?>



<table align=center width=1100><tr><font color=white size=4 face=calibri>
<td align=center >



<font color=white size=4 face=calibri>



<form method="post" action="login.php">
<table width=300 border=1 cellpadding=3 cellspacing=1 align=center >
<tr>

<td colspan=2>
<font color=white size=4 face=calibri> Login leden fotoclub</td>
</tr><tr>
<td align=right>
<font color=white size=4 face=calibri> Loginnaam:
</td>

<td> <input type=text name=gebruikersnaam> </td></tr><tr>
<td align=right>
<font color=white size=4 face=calibri>&nbsp Wachtwoord:</td
>
<td> <input type=password name=wachtwoord></td></tr><tr>

<td colspan=2 align=center><br> <input type="submit" name="submit" value="login">
</td></tr></table>
</form>

<br><BR>
Ik weet mijn login gegevens niet meer? <a href=vergeten.php target=home>Klik hier</a>
</td>
Gewijzigd op 05/08/2018 17:54:12 door Nilix bies
 
PHP hulp

PHP hulp

20/04/2024 15:51:31
 
Thomas van den Heuvel

Thomas van den Heuvel

05/08/2018 19:33:49
Quote Anchor link
$con, het eerste argument van de mysqli_query() functie, is nu een verplicht argument. Deze variabele $con zou het object moeten bevatten wat het (geslaagde) resultaat is van het maken van een verbinding met je database.

Tenzij $con zit verstopt in log.php of er nog meer code wordt geladen dan dat hierboven staat beschreven is deze variabele ongedefinieerd, wat tot gevolg heeft dat je ook niet kunt communiceren met je database omdat je mysqli_query() functie je database niet kent.

Om dit te laten werken zul je dus moeten zorgen dat $con verwijst naar het object wat je database-connectie representeert.

Los daarvan stemt het bovenstaande fragment mij niet erg gerust op een waterdicht loginsysteem, oftewel, deze is waarschijnlijk zo lek als een mand. Maar dit interesseert niemand waarschijnlijk een biet, we zijn hier per slot van rekening alleen maar om vragen te beantwoorden, niet om adviezen te geven en mensen de goede kant op te sturen nietwaar.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/08/2018 19:35:39
Quote Anchor link
- Verander $_POST['submit'] == "login" liever in if($_SERVER['REQUEST_METHOD'] == 'POST')

- Initialiseer variabelen buiten de if statements als je ze verderop in je code wilt gebruiken

- Filter variabelen uit een formulier. De deur voor inbrekers staat nu wagenwijd open!
- bedoelde je een = in plaats van een == bij $gebrnaam == (strtolower($_POST['gebruikersnaam']));

- Het gebruik van backticks wordt afgeraden in je database queries
- Gebruik logische variabelnamen. $ophalen is onjuist omdat je van mysqli_query een resultaat verwacht. Het daadwerkelijk ophalen van de data doe je als je gaat fetchen

- Je echo't direct de foutmeldingen. Dit leidt tot ongeldige HTML omdat ze niet netjes in de <body> van je pagina zullen komen. Je zult deze eerst in een variabele moeten zetten om ze verderop in je code (de view) alsnog tussen je html te plaatsen

- Je slaat wachtwoorden niet op in de database. In plaats daarvan moet je de wachtwoorden versleutelen en de sleutel in de database opslaan. Vandaag de dag doe je dat het beste met BCrypt (http://php.net/manual/en/function.password-hash.php)

- Waarom een while($record = mysqli_fetch_object($result)) als je hooguit 1 record verwacht?
- Waarom een tweede keer fetchen?
- Onnodig kopieren van variabelen en telkens rechtstreeks $_POST variabelen benaderen zonder te filteren
- Redirecten doe je met header('Location: adm.php?idlog=' . $gebrnaam)
- Waarom query parameter idlog gebruiken. Dit kan elke idioot wijzigen. Waarom haal je dat niet uit de sessie?
- De datenu kolom zou je van het type DATETIME moeten maken, vervolgens sla je de datum op met $datenu = date('Y-m-d');
- Lijkt mij tevens ook veiliger en logischer om om aan de tabel 'leden' een kolom 'isAdmin' toe te voegen waarbij je bij een admin een 1 in de kolom plaatst en bij normale leden een 0. En dan bepaal je vervolgens aan de hand van de waarde van die kolom of het een admin betreft of niet.
- Je zou ipv de gebruikersnaam het 'id' (of 'user_id') of iets dergelijks in de sessie moeten opslaan. Deze kolom is als het goed is aangemaakt als 'primary key'. Dit zoekt sneller en je krijgt gegarandeerd het juiste record.
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
<?php

// initialiseer variabelen
$gebrnaam = '';
$errors = []; // lege array

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    include "log.php";
    
    // laten we kijken of de benodigde POST variabelen ook bestaan...
    if(!array_key_exists('gebruikersnaam', $_POST) || !array_key_exists('wachtwoord', $_POST)) {
        $errors[] = 'Fout bij het verwerken van het formulier';
    }
else {

        $gebrnaam = strtolower(mysqli_real_escape_string(trim($_POST['gebruikersnaam'])));

        $sql = "SELECT * FROM leden WHERE gebruikersnaam = '" . $gebrnaam . "'";

        $result = mysqli_query($con, $sql);
        $aantal = mysqli_num_rows($result); // aantal records met verstuurd emailadres tellen

        if ($aantal == 0)
        {

            $errors[] = 'Fout: ingevoerd gebruikersnaam  klopt niet!';
        }

        else
        {
            //mailadres staat in de database, we gaan verder!

            $record = mysqli_fetch_object($result);
            $password_db = $record->wachtwoord;

            //passwordsleutel nu vergelijken met de sleutel van het ingevoerde password
            if ($password_db != password_hash($_POST['wachtwoord'], PASSWORD_DEFAULT))
            {

                $errors[] = 'Verkeerd wachtwoord!';
            }

            else
            {
                //email staat in database en password klopt, sessie starten!
                session_start();

                $_SESSION['idlog'] = $gebrnaam;

                if ($gebrnaam == "admin")
                {

                    header('Location: adm.php');
                    exit;
                }

                else
                {
                    $datenu = date('Y-m-d');

                    mysqli_query($con, "UPDATE leden SET datenu='" . $datenu . "' WHERE gebruikersnaam='" . $gebrnaam . "'");

                    header('Location: loginstart.php');
                    exit;
                }
            }
        }
    }
}

?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
        <?php if(count($errors)): ?>
        <ul class="errors">
            <?php foreach($errors as $error): ?>
                <li><?php echo $error; ?></li>
            <?php endforeach; ?>
        </ul>
        <?php endif; ?>
        
        <form method="post">
            <input type="text" name="gebruikersnaam" value="<?php echo htmlspecialchars($gebrnaam); ?>"> <!-- escape ook altijd je output -->
            <input type="password" name="wachtwoord">
            <button>Login</button>
        </form>
    </body>
</html>


Toevoeging op 05/08/2018 20:08:20:

Voordat je met mijn voorbeeld gaat werken zul je de volgende zaken moeten begrijpen:

- wachtwoorden
Alle gebruikers wachtwoorden in de database zul je eenmalig moeten omzetten naar sleutels.
Dit zou je kunnen doen door een script te schrijven die dat voor je doet, of je maakt een script die je de sleutel van een wachtwoord laat zien en plakt de sleutel handmatig bij de juiste gebruiker in de tabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo password_hash('geheimpje', PASSWORD_DEFAULT);
?>


- de header() functie
Je kunt de header functie alleen gebruiken als je script nog geen enkele output gegenereerd heeft.
Er mag dus nog geen echo gedaan zijn of een blok HTML verzonden zijn

- de view
Een goede gewoonte is om bovenaan je php script te schrijven waarin je geen enkele output genereert maar in plaats daarvan alles nog even in variabelen op te slaan. Je kunt dan nog alle kanten op. Onderaan doe je de HTML met daartussen kleine php blokken die enkel bedoeld zijn om variabelen te echo-en. Je komt zo nooit in de problemen en je code is veel beter leesbaar

- gebruik een goede php editor

- escape ook altijd onveilige variabelen voordat je deze echo't
Gewijzigd op 05/08/2018 20:26:56 door Frank Nietbelangrijk
 
Nilix bies

nilix bies

06/08/2018 10:44:41
Quote Anchor link
Frank dank je wel voor deze duidelijke uitleg. Ik ga er mee aan de slag.
Ben al jaren niet meer zo thuis in het programmeren. En stiekem verandert er veel in.. Te veel om bij te houden..

Gelukkig zijn er altijd mensen die wel al deze veranderingen gelijk snappen en weten hoe het werkt.

Ik ga er mee aan de slag en kijken of het lukt..
Tot zo ver heel vriendelijk bedankt.


Edit:
Onnodige quote verwijderd. Het is niet nodig integraal quotes te plaatsen van het vorige bericht.
Gewijzigd op 06/08/2018 11:06:28 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 11:09:24
Quote Anchor link
Eigenlijk zou ik ook aanraden om niet twee foutmeldingen te maken voor een fout wachtwoord en een foute username. Ik zou dan liever zeggen dat de gebruikersnaam of wachtwoord fout is.
 
Nilix bies

nilix bies

06/08/2018 11:29:48
Quote Anchor link
Ik ben er al mee bezig en toch wel makkelijk dat je de foutmeldingen apart kan zien..
Loop nu in het begin al vast.
Krijg nu de melding Fout: ingevoerd gebruikersnaam klopt niet!

Zeker weten dat de gebruikersnaam in de mysql staat.
En deze ook goed word aan geroepen. Op andere delen van de site staan portfolios van leden en deze roepen via de zelfde. log.php de mysql aan om informatie op de site te plaatsen en hier werkt het wel..

Lijkt me dat de mysql aanroep goed is .. Maar in het script nog iets niet goed doe.

Iemand een idee?
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 11:31:51
Quote Anchor link
Kwestie van debuggen....
Wat gebeurt er als je $sql echo'd?
 
Nilix bies

nilix bies

06/08/2018 11:51:46
Quote Anchor link
Dit is de melding die ik dan krijg:


SELECT * FROM leden WHERE gebruikersnaam = ''

Lijkt me dat er tussen de'' nu de gebruikersnaam zou moeten staan als ik deze regel echo later?
Gewijzigd op 06/08/2018 11:54:37 door nilix bies
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:02:27
Quote Anchor link
Dan lijkt $_POST['gebruikersnaam'] leeg te zijn.

Debug anders eens verder naar wat je de array in je $_POST-global is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<pre>".print_r($_POST,true)."</pre>";
?>
 
Nilix bies

nilix bies

06/08/2018 12:05:44
Quote Anchor link
Ook hier krijg ik een melding bij:
Array
(
[gebruikersnaam] => gilbert
[wachtwoord] => rox
)

Fout: ingevoerd gebruikersnaam klopt niet!
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:10:22
Quote Anchor link
Dan is er iets mis in je code, want je voert gewoon gilbert (met of zonder hoofdletters) in.
Gewijzigd op 06/08/2018 12:10:43 door - Ariën -
 
Nilix bies

nilix bies

06/08/2018 12:20:24
Quote Anchor link
Ja dat klopt voer gewoon die naam in.. en toch is het niet goed.. toch komt de naam niet verder door in de vergelijking..

Snap er niks van..
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:24:43
Quote Anchor link
Laat je code eens zien, want dit lijkt mij niet de volledige code van Frank te zijn.

Dit toont hier in de 'sandbox' gewoon gilbert.
Zie ook: https://3v4l.org/3J5VW

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$naam
= 'Gilbert';
$gebrnaam = strtolower(trim($naam)); // mysqli_real_escape_string even verwijderd omdat deze niet in de sandbox werkt.
$sql = "SELECT * FROM leden WHERE gebruikersnaam = '" . $gebrnaam . "'";
echo $sql;
?>
Gewijzigd op 06/08/2018 12:25:18 door - Ariën -
 
Nilix bies

nilix bies

06/08/2018 12:34:07
Quote Anchor link
Ik heb de volledige code van frank over genomen.. er niks aan gedaan.

Maar hier is die nog eens dan :)

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
<?php

// initialiseer variabelen
$gebrnaam = '';
$errors = []; // lege array

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    include "log.php";
    
    // laten we kijken of de benodigde POST variabelen ook bestaan...
    if(!array_key_exists('gebruikersnaam', $_POST) || !array_key_exists('wachtwoord', $_POST)) {
        $errors[] = 'Fout bij het verwerken van het formulier';
    }
else {

        $gebrnaam = strtolower(mysqli_real_escape_string(trim($_POST['gebruikersnaam'])));

        $sql = "SELECT * FROM leden WHERE gebruikersnaam = '" . $gebrnaam . "'";

        $result = mysqli_query($con, $sql);
        $aantal = mysqli_num_rows($result); // aantal records met verstuurd emailadres tellen

        if ($aantal == 0)
        {

            $errors[] = 'Fout: ingevoerd gebruikersnaam  klopt niet!';
          echo "<pre>".print_r($_POST,true)."</pre>";
        }

        else
        {
            //mailadres staat in de database, we gaan verder!

            $record = mysqli_fetch_object($result);
            $password_db = $record->wachtwoord;

            //passwordsleutel nu vergelijken met de sleutel van het ingevoerde password
            if ($password_db != password_hash($_POST['wachtwoord'], PASSWORD_DEFAULT))
            {

                $errors[] = 'Verkeerd wachtwoord!';
            }

            else
            {
                //email staat in database en password klopt, sessie starten!
                session_start();

                $_SESSION['idlog'] = $gebrnaam;

                if ($gebrnaam == "admin")
                {

                    header('Location: adm.php');
                    exit;
                }

                else
                {
                    $datenu = date('Y-m-d');

                    mysqli_query($con, "UPDATE leden SET datenu='" . $datenu . "' WHERE gebruikersnaam='" . $gebrnaam . "'");

                    header('Location: loginstart.php');
                    exit;
                }
            }
        }
    }
}

?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
        <?php if(count($errors)): ?>
        <ul class="errors">
            <?php foreach($errors as $error): ?>
                <li><?php echo $error; ?></li>
            <?php endforeach; ?>
        </ul>
        <?php endif; ?>
        
        <form method="post">
            <input type="text" name="gebruikersnaam" value="<?php echo htmlspecialchars($gebrnaam); ?>"> <!-- escape ook altijd je output -->
            <input type="password" name="wachtwoord">
            <button>Login</button>
        </form>
    </body>
</html>
Gewijzigd op 06/08/2018 12:34:42 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:35:13
Quote Anchor link
Haal lijn 4 eens weg?
Echo anders de variabelen $gebrnaam en $sql beiden eens, nadat je die zijn aangemaakt?
Gewijzigd op 06/08/2018 12:38:01 door - Ariën -
 
Nilix bies

nilix bies

06/08/2018 12:39:28
Quote Anchor link
gedaan helaas de zelfde fout nog steeds
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:45:25
Quote Anchor link
Echo eens $gebrnaam en $sql NA dat je die aangemaakt hebt. Wat zie je dan?
Laat die code eens zien hoe je dat debugt? je gaf eerder al aan dat $_POST['gebruikersnaam'] gewoon bestaat.

Ik kan me echt niet indenken dat een variabele opeens spontaan verloren gaat. Of er moet iets heel vreemd zijn...
Gewijzigd op 06/08/2018 12:46:14 door - Ariën -
 
Nilix bies

nilix bies

06/08/2018 12:52:39
Quote Anchor link
onder de regel:
$aantal = mysqli_num_rows($result); // aantal records met verstuurd emailadres tellen

if ($aantal == 0)
{
$errors[] = 'Fout: ingevoerd gebruikersnaam klopt niet!';
echo"$gebrnaam, $sql";

Hier heb ik ze geplakt.. En daar krijg ik de melding

Als ik dit doe krijg ik:
, SELECT * FROM leden WHERE gebruikersnaam = ''

Fout: ingevoerd gebruikersnaam klopt niet!

wat me opvalt is de de $gebrnaam er niet meer is dan.. dan is hij die variabele al kwijt in eens.
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 12:54:41
Quote Anchor link
Echo het nou eens direct NADAT je die aangemaakt hebt?
Net zoals in mijn testcase. Elke variabele direct na dat je het hebt gemaakt echo'en.
 
Nilix bies

nilix bies

06/08/2018 12:59:45
Quote Anchor link
Dat heb ik nu gedaan..
En dan komen we verder .. nu staat er verkeerde wachtwoord maar dat kan aan de sleutel liggen die ik er eerst voor moet maken nog..
 
- Ariën  -
Beheerder

- Ariën -

06/08/2018 13:04:22
Quote Anchor link
Quote:
Alle gebruikers wachtwoorden in de database zul je eenmalig moeten omzetten naar sleutels.
Dit zou je kunnen doen door een script te schrijven die dat voor je doet, of je maakt een script die je de sleutel van een wachtwoord laat zien en plakt de sleutel handmatig bij de juiste gebruiker in de tabel


Ik raad aan om een scriptje te schrijven die al je plain text wachtwoorden om zet naar een hashed wachtwoord, met password_hash(). Nu zal je blijkbaar nog controleren op een lees baar wachtwoord, terwijl je script verwacht dat deze gehashed is.
 

Pagina: 1 2 3 volgende »



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.