Formulier validatie: fout na fout wordt weergegeven ipv allemaal in een keer

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mohamed nvt

Mohamed nvt

17/01/2021 23:24:31
Quote Anchor link
In het registratieformulier heb ik 7 input velden
Tbv formulier validatie gebruik ik een array om alle fouten daarin op te slaan en om ze later weer te geven.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$errors = [];
// Controleer de voornaam:
$voornaam= trim($_POST['voornaam']);
if (empty($voornaam)) {
    array_push($errors,"Voornaam mag niet leeg zijn<br /");
}

Om te controleren of het mailadres reeds bestaat in DB gebruik ik, want overigens niet werkt en ik kom er niet uit waarom niet..
Als foutmelding krijg ik:
An error occurred in script '/register.php' on line 38: mysqli_num_rows() expects parameter 1 to be mysqli_result, bool given
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
// Controleer of het mailadres al bestaat
require('Inc/db-connection.php');
$checkingmail = mysqli_query($dbc, "SELECT * from behandelaars where Mailadres= '$mailadres'");
if(mysqli_num_rows($checkingmail) > 0)
{
    $errors[]="Het mailadres is al in gebruik";
}

Aan het einde wil ik alle fouten uit de array halen en hiervoor gebruik ik de volgende code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
foreach($errors as $error); {
                                    echo "Helaas, de volgende foutmeldingen zijn opgetreden!<br />" . $error . "<br />";

Wanneer ik alle velden leeg laat en ik klik op verzenden, dan wordt de melding van de laatste inputfield weergegeven dat het niet leeg mag zijn en daarna ene laatste totdat het helemaal de eerste input field heeft gehad.
Dit vind ik vreemd en het liefste wil ik dat alle foutmeldingen direct worden weergegeven en niet eentje voor eentje.
Ik vraag mij af of een array de juiste methode hiervoor is..
Alvast bedankt voor het meedenken.
 
PHP hulp

PHP hulp

08/11/2024 14:47:35
 
- Ariën  -
Beheerder

- Ariën -

17/01/2021 23:36:08
Quote Anchor link
Zorg eens voor goede foutafhandeling op je queries. Blijkbaar loopt $checkingmail ergens op fout.
 
Mohamed nvt

Mohamed nvt

18/01/2021 00:02:36
Quote Anchor link
Bedankt voor je feedback.
Foutmelding: An error occurred in script '/register.php' on line 38: mysqli_num_rows() expects parameter 1 to be mysqli_result, bool given heb ik nu opgelost door volgende code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$checkingmail = mysqli_query($dbc, "SELECT * from Behandelaars where Mailadres= '$mailadres'")  or die(mysqli_error($dbc));

Waar ik nu tegen aanloop is dat de foutmeldingen van formuliervalidatie eentje voor eentje worden weergegeven ipv allemaal in een keer.
In welke richting moet ik het opzoeken.
 
- Ariën  -
Beheerder

- Ariën -

18/01/2021 01:10:48
Quote Anchor link
Je foreach wil je toch enkel gebruiken voor de verschillende meldingen? Als je die in een array opslaat, dan zie je ze allemaal in één keer.

Ik raad wel aan om de punt-komma bij je foreach weg te halen.

Verder vind ik die() erg rigoureus. Dat kan vriendelijker... ;-)
Gewijzigd op 18/01/2021 01:11:47 door - Ariën -
 

18/01/2021 09:39:10
Quote Anchor link
Er zitten aannames in jouw code die er voor kunnen zorgen dat het niet werkt zoals je had verwacht:
1.) $_POST['voornaam'] is niet NULL
2.) $dbc bevat een resource voor een MySQL of MariaDB database connectie
3.) $mailadres bevat een mailadres dat niet ge-escaped hoeft te worden

De laatste aanname is de meest waarschijnlijke oorzaak dat mysqli_query() boolean FALSE terug geeft.
Mocht je in PHP code willen schrijven die ook veilig is, helpt het om je in te lezen in queries met parameters.
 
Jan Koehoorn

Jan Koehoorn

19/01/2021 18:55:26
Quote Anchor link
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
<?php
require 'Inc/db-connection.php';

if ('POST' === $_SERVER['REQUEST_METHOD']) {
    $errors    = [];
    $voornaam  = trim($_POST['voornaam']);
    $mailadres = trim($_POST['mailadres']);
    // Dit moet echt op een andere manier! Zie de post van Ad Fundum
    $checkingmail = mysqli_query($dbc, "SELECT * from behandelaars where Mailadres= '$mailadres'");

    if (empty($voornaam)) {
        array_push($errors, "Voornaam mag niet leeg zijn");
    }


    if (mysqli_num_rows($checkingmail) > 0) {
        array_push($errors, "Het mailadres is al in gebruik");
    }


    if ( ! empty($errors)) {
        echo "Helaas, de volgende foutmeldingen zijn opgetreden:";
        foreach ($errors as $error) {
            echo $error . "<br />";
        }
    }
}

?>
Gewijzigd op 19/01/2021 18:56:23 door Jan Koehoorn
 
Mohamed nvt

Mohamed nvt

26/01/2021 22:12:08
Quote Anchor link
Allen, bedankt voor het meedenken en ik gebruik niet meer arrays voor het opslaan van errors.
 



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.