Hallo,

Ik ben net begonnen met php (al wel bekend met andere talen) en wil een inlogsysteem maken met mySQL en met een aanmeld form en een log uit knop. Ik heb al wat geprobeerd maar ik krijg telkens een fout te zien. Dit inlog systeem komt in een webapp dus gebruik ik ook jquery. Het volgende is wat ik al heb:

aanmelden.php:

<html>
    <head>
        <title> Aanmelden </title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta charset="UTF-8">
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.css">
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.js"></script>
		<style>
           .alaangemeld{
             text-align:center;
           } 
           a{
                 text-decoration: none;
           }
           .hier{
                 color: #fbc406;
           }
           
        </style>
	</head>
	<body>
        <h1 style="text-align:center;"> Aanmelden </h1>
        <form action="aanmelden.inc.php" method="post" data-ajax="false">
            <input type="text" name="mail" value="" placeholder="E-mail">
            <input type="password" name="ww" placeholder="Wachtwoord">
            <input type="password" name="wwhh" placeholder="Herhaal wachtwoord">
            <button type="submit" name="signup-verzend">Aanmelden</button>
        </form>
        <br>
        <div class="alaangemeld">
           <p> Al aangemeld? Klik dan <a href="login.php"><span class="hier">hier</span></a></p>
        </div>
	</body>
</html


aanmelden.inc.php:

<?php
session_start();

require "../includes/connect.php"; //hier wordt verbinding gemaakt met de database phpmyAdmin
$errors = 0;
$mail = "";

if(isset($_POST['signup-verzend'])){
    $mail = $_POST['mail'];
    $ww = $_POST['ww'];
    $wwhh = $_POST['wwhh'];


    // checken voor fouten in invoer    
    if(empty($mail)) {
        $errors = $errors + 1;  
    }
    if(empty($ww)) {
        $errors = $errors + 1;
    }
    if(empty($wwhh)) {
        $errors = $errors + 1;
    }
    if($ww !== $wwhh) {
        $errors = $errors + 1;
    }

    if(!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        $errors = $errors + 1;
    }
    
    //kijken of er al iemand is met dezelfde mail
    $mailQuery = "SELECT * FROM gb WHERE mail=? LIMIT 1";
    $stmt = $conn->prepare($mailQuery);
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $result = $stmt->get_result();
    $mailCount = $result->num_rows;
    $stmt->close();

    if($mailcount > 0){
        $errors = $errors + 1;
    }

    if(count($errors === 0)) {
        $wwSecure = password_hash($ww, PASSWORD_DEFAULT);
        $token = bin2hex(random_bytes(50));
        $verified = false;

        $sql ="INSERT INTO gb (mail, ww, verified, token, ww) VALUES (?, ?, ?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param('ssbs', $mail, $verified, $token, $wwSecure);
        
        if($stmt->execute()){
            //log automatisch in
            $gb_id = $connect->insert_id;
            $_SESSION['id'] = $gb_id;
            $_SESSION['mail'] = $mail;
            $_SESSION['verified'] = $verified;

            //een bericht instellen
            header("Location:geslaagd.html");
            exit();

        } else{
            $errors = $errors + 1;
        }
    }else(count($errors > 0)){
        header("Location:signup.php/?error=ErIsIetsFoutIngevuld");
        exit();
    }
 }else{
    header("Location:signup.php");
 }
?>


geslaagd.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p> U bent aangemeld!</p>
</body>
</html>


login.php:


<html>
    <head>
        <title> Inloggen </title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta charset="UTF-8">
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.css">
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.js"></script>
		<style>
           .alaangemeld{
             text-align:center;
           } 
           a{
                 text-decoration: none;
           }
           .hier{
                 color: #fbc406;
           }
           
        </style>
	</head>
	<body>
        <h1 style="text-align:center;"> Inloggen </h1>
        <form action="login.inc.php" method="post" data-ajax="false">
            <input type="text" name="mail" value="" placeholder="E-mail">
            <input type="password" name="ww" placeholder="Wachtwoord">
            <button type="submit" name="signup-verzend">Log in</button>
        </form>
        <br>
        <div class="alaangemeld">
           <p> Nog niet aangemeld? Klik dan <a href="aanmelden.php"><span class="hier">hier</span></a></p>
        </div>
	</body>
</html>


Voor login.inc.php heb ik nog niets en weet ook nog niet hoe dit moet. Ik wil eerst ervoor kunnen zorgen dat je kan aanmelden in de website. Ik heb een tutorial gevolgd op youtube dus het zou kunnen dat ik wat heb overgenomen heb en niet heb verklaard, zou u dit ook kunnen vertellen wat ik zou moeten toevoegen, aanpassen, etc.?

Ik hoop dat u mij snapt en mij kan helpen! Ik zie uw bericht graag!

PS: Ik gebruik PHP versie 7.3 op mijn server met de volgende extensies: bcmath, dom, fileinfo, gd, intl, ioncube_loader, json, mbstring,mcrypt, mysqlnd, nd_mysqli, pdo, pdo_mysql, pdo_sqlite, phar, posix, soap, sockets, xmlwriter, xmlreader, xsl, zip



,groetjes Sem
Kan je je code tussen code-tags plaatsen?
Dat leest wat makkelijker.
Hi, thx voor de snelle reactie. Ik heb het in de code-tags gezet!
Wat heb je al geprobeerd? En waar loop je op vast?

Heb je al gekeken naar [php]password_verify[/php] ?
Weet je zeker dat er op regel 68 een else moet staan?

Waarom maak je van $errors geen array?

<?php
$errors = [];

if(strlen($mail) == 0) {
$errors[] = 'U moet een email adres opgeven';
}

// controleren of er errors zijn..
if(count($errors)) {
// er zijn fouten
}
?>

Pas op met de empty() functie die geeft TRUE als $email = '0'; gebruik liever strlen()

[size=xsmall]Toevoeging op 30/03/2020 20:49:28:[/size]

Gebruik ook een php editor, bijvoorbeeld Netbeans.
regel 50
$sql ="INSERT INTO gb (mail, ww, verified, token, ww) VALUES (?, ?, ?, ?)";

5 kolommen en daar ga je 4 waarden in stoppen?

En sowieso lijkt het 2x gebruiken van dezelfde kolomnaam me fout.

[size=xsmall]Toevoeging op 30/03/2020 21:49:49:[/size]

" Ik heb al wat geprobeerd maar ik krijg telkens een fout te zien. "

Afgezien van die ene melding in het hebreews zijn de meeste foutmeldingen wel vrij duidelijk.
Maar dan moet je hem lezen.
en eventueel ook hier delen.

PHP zegt eigenlijk nooit "error, zoek het maar uit"
if(count($errors === 0))

($errors === 0) geeft true of false.
En dat ga je tellen met count()?
Frank Nietbelangrijk op 30/03/2020 20:47:54

Weet je zeker dat er op regel 68 een else moet staan?

Waarom maak je van $errors geen array?

<?php
$errors = [];

if(strlen($mail) == 0) {
$errors[] = 'U moet een ander email adres opgeven';
}

// controleren of er errors zijn..
if(count($errors)) {
// er zijn fouten
}
?>

Pas op met de empty() functie die geeft TRUE als $email = '0'; gebruik liever strlen()

[size=xsmall]Toevoeging op 30/03/2020 20:49:28:[/size]

Gebruik ook een php editor, bijvoorbeeld Netbeans.


Hi, bedankt. Moet ik dus regel 68 veranderen naar een array. Ik zal het doen! Danku!
Als programma gebruik ik nu Visual Studio Code. Wat doet NetBeans dan beter?
Dat optellen is nu nergens voor nodig. Je geeft nu per gefaalde validatie een error mee aan je array.

Daar hebben mensen ook wat meer aan.
Ik zou zelf behoorlijk gefrustreerd raken als ik iets fout heb ingevuld, terwijl ik geen flauw idee heb wát ik fout heb ingevuld. ;-)

Geef bij foute inlogpogingen wel enkel weer de melding: "Inloggen mislukt", en niet apart of je username fout is, en of het password fout is. Je wilt niemand wat wijzer maken. ;-)
** knip **

Nee inderdaad je hebt gelijk, lijkt me best frustrerend. Ik heb het volgende gemaakt en weet niet zeker of dit voldoet aan alle regels en wellicht kan het wel makkelijker.


<?php
session_start();

require "../includes/connect.php";
$errors = array(); //errors tellen
$mail = "";

if(isset($_POST['signup-verzend'])){
    $mail = $_POST['mail'];
    $ww = $_POST['ww'];
    $wwhh = $_POST['wwhh'];


    // checken voor fouten in invoer  
    // kijken of e-mail niet leeg is  
    if(empty($mail)) {
        header("Location:../signup.php?error=eMailIsLeeg");
        exit();
    }
    //kijken of wachtwoord niet ingevuld is
    if(empty($ww)) {
        header("Location:../signup.php?error=WachtwoordIsLeeg");
        exit();
    }
    //kijken of wachtwoordherhaal niet ingevuld is
    if(empty($wwhh)) {
        header("Location:../signup.php?error=WachtwoordHerhaalIsLeeg");
        exit();
    }
    //kijken of de twee ww hetzelfde zijn
    if($ww !== $wwhh) {
        header("Location:../signup.php?error=WachtwoordenNietHetzelfde");
        exit();
    }
    //kijken of het een geldig e-mail adres is
    if(!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        header("Location:../signup.php?error=eMailNietGeldig");
        exit();
    }
    
    //kijken of er al iemand is met dezelfde mail
    $mailQuery = "SELECT * FROM gb WHERE mail=? LIMIT 1";
    $stmt = $conn->prepare($mailQuery);
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $result = $stmt->get_result();
    $mailCount = $result->num_rows;
    $stmt->close();

    //als er meerdere accounts bestaan moet er een error komen
    if($mailcount > 0){
        $errors = $errors + 1;
        header("Location:../signup.php?error=EmailAlBekend");
        exit();
    }
    
    //als er geen fouten zijn bij invoer krijg je een token en ben je dus niet verified 
    if(strlen($errors) == 0)) {
        $wwSecure = password_hash($ww, PASSWORD_DEFAULT);
        $token = bin2hex(random_bytes(50));
        $verified = false;
    
        //persoon toevoegen aan database
        $sql ="INSERT INTO gb (mail, verified, token, ww) VALUES (?, ?, ?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param('ssbs', $mail, $verified, $token, $wwSecure);
        
        if($stmt->execute()){
            //log automatisch in
            $gb_id = $connect->insert_id;
            $_SESSION['id'] = $gb_id;
            $_SESSION['mail'] = $mail;
            $_SESSION['verified'] = $verified;

            //een bericht instellen
            $_SESSION['message'] = "U bent ingelogd!";
            header("Location:../");
            exit();

          //een of andere manier niet gelukt om de gebruiker toe te voegen aan database
        } else{
            header("Location:../signup.php?error=ToevoegenAanDbMislukt");
            exit();
        }
    }
}
//als je op deze site komt niet via signup.php dan word je naar home gestuurd
else{
    header("Location:../");
}

?>


Ja, waarom geen array's en je foutmeldingen verzamelen?

Steeds maar weer los tonen is behoorlijk vervelend, waarbij de gebruiker steeds maar heen en weer moet klikken.

Reageren