Juiste foutafhandeling php

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Yoeri Achterbergen

Yoeri Achterbergen

18/09/2018 17:56:57
Quote Anchor link
Hallo,

Via de AJAX methode verzend ik gegevens naar een php file en wil als teruggave een bericht met succes of errors tonen.
momenteel heb ik dit
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
<?php
if(trim($_GET['first_name']) == ''){
    $first_name_error = '<li class="error">- Het veld voornaam is leeg!</li>';
}
else{
    
}


if(trim($_GET['email']) == ''){
    $mail_error = '<li class="error">- Het veld email is leeg!</li>';
}
else{
    
}


$return = array('message' => '<div class="error">'.$first_name_error.$mail_error.'</div>');
echo json_encode($return);

?>


Hoe zouden jullie de foutafhandeling doen?
Ik zou alles in één return willen als dat zou kunnen.
 
PHP hulp

PHP hulp

29/09/2020 10:39:37
 
Thomas van den Heuvel

Thomas van den Heuvel

18/09/2018 18:06:28
Quote Anchor link
Waarom zou je opmaak verwerken in een foutboodschap? Dit is iets wat je regelt op het moment van weergave lijkt mij.

Ik zou het persoonlijk opdelen per veldnaam, en daar dan ook een lijst van fouten toestaan, er kunnen namelijk meerdere dingen mis zijn aan één invoerveld.

Ook kunnen er foutmeldingen zijn met de verwerking van het formulier zelf, die niet direct gekoppeld kunnen worden aan een (zichtbaar) veld, zoals bijvoorbeeld een ongeldig formulier-token. Je zou dus ook nog onderscheid kunnen maken tussen (algemene) formulier-foutmeldingen en (specifieke) formulierveld-foutmeldingen.

Een schematische indeling van het errors-array (evt. verpakt als JSON) zou dus zoiets kunnen zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
* form
  - error #1
  - error #2
* fields
  * field #1
    - error #1
  * field #2
    - error #1
    - error #2
etc.

Zo kun je de foutmeldingen direct achter of bij het specifieke veld weergeven. Of bovenaan het formulier, als het algemene fouten betreft.
 
Yoeri Achterbergen

Yoeri Achterbergen

18/09/2018 19:03:26
Quote Anchor link
@tomas
Bedoel je het zo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$errors
= array(
    $array(Je bent vergeten je naam in te vullen),
    $array(Je bent vergeten je emailadres in te vullen, Dit is geen geldig emailadres)
);

?>
Gewijzigd op 18/09/2018 21:12:01 door Yoeri Achterbergen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/09/2018 22:30:39
Quote Anchor link
Je zou het zo kunnen doen. Dit is simpeler dan Thomas voorstelt met als nadeel dat je maar 1 foutmelding per formulierveld kunt teruggeven.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$errors
= array(
    'naam' => 'Je bent vergeten je naam in te vullen',
    'email' => 'Je bent vergeten je mailadres in te vullen, Dit is geen geldig mailadres'
);
?>


Beter vind ik het om een iets uitgebreider enigszins gestandaardiseerd antwoord te geven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$response
= array(
    'status' => 'error',
    'errors' => array(
            'naam' => 'Je bent vergeten je naam in te vullen',
            'email' => 'Je bent vergeten je mailadres in te vullen, Dit is geen geldig mailadres'
    )
);

?>


en als er geen foutmeldingen zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$response
= array(
    'status' => 'ok'
);
?>
Gewijzigd op 18/09/2018 22:37:18 door Frank Nietbelangrijk
 
Yoeri Achterbergen

Yoeri Achterbergen

18/09/2018 23:36:18
Quote Anchor link
@frank,

Hoe maak ik dan de juiste en kortste afhandeling met een array?

Ik definieer in een array met de verschillende foutmeldingen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$response
= array(
    'status' => 'error',
    'errors' => array(
            'naamleeg' => 'Je bent vergeten je naam in te vullen',
            'emailleeg' => 'Je bent vergeten je mailadres in te vullen',
            'allesleeg' => 'Meerdere velden zijn niet ingevuld',
            'emailfout' => 'Dit is geen geldig e-mailadres'

    )
);

?>


Maak ik dan allemaal if statements voor controle op leeg en eventuele fouten?
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
<?php
if(trim($_GET['first_name']) == ''){
     $response['errors']['naamleeg'];
}


if(trim($_GET['email']) == ''){
    $response['errors']['emailleeg'];
}


if(trim($_GET['email']) == ''){
    $response['errors']['emailleeg'];
}


if(trim($_GET['first_name']) == '') &&trim($_GET['email']) == ''){
    $response['errors']['allesleeg'];
}

?>


Met de status array kan ik natuurlijk met Javascript ook een if statement maken hoe de errors en de succes worden weergegeven.
Gewijzigd op 18/09/2018 23:36:42 door Yoeri Achterbergen
 
Thomas van den Heuvel

Thomas van den Heuvel

19/09/2018 01:06:28
Quote Anchor link
Het beste lijkt mij om deze te groeperen op invoerveld, zoals eerder beschreven.
 
Yoeri Achterbergen

Yoeri Achterbergen

19/09/2018 10:37:22
Quote Anchor link
@thomas,

Ik heb de arrays in groepen gezet en ik denk dat je het zo bedoeld:

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
<?php
$response
= array(
    'status' => 'error',
    'errors' => array(
        'formulierfout' => array(
            'allesleeg' => 'Meerdere velden zijn niet ingevuld',
        ),

        'firstname' => array(
            'naamleeg' => 'Je bent vergeten je naam in te vullen',
        ),

        'email' => array(
            'emailleeg' => 'Je bent vergeten je mailadres in te vullen',
            'emailfout' => 'Dit is geen geldig e-mailadres'
        )


    )
);

?>

?>

Gewijzigd op 19/09/2018 10:37:46 door Yoeri Achterbergen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/09/2018 12:08:01
Quote Anchor link
Volgens mij gaat dat de goede kant op Yoeri.
 
Yoeri Achterbergen

Yoeri Achterbergen

19/09/2018 12:22:49
Quote Anchor link
Arrays zijn nieuw voor me maar de opmaak ervan begin ik te snappen :)

Dus nog even voor de duidelijkheid:
- De arrays zijn gemaakt en zijn dus ook makkelijk toe te voegen en aan te passen.
- Met de status kan ik Javasript de opmaak laten bepalen door een if else statement te maken.
- Voor de foutafhandeling in PHP maak ik voor elk veld + elke error een if statemant en geen de $response de juiste array mee die word terug geven aan Javascript.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/09/2018 12:32:08
Quote Anchor link
in javascript kun je gewoon zoiets doen toch?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
if(response.status == 'error') {
    var html = '<ul class="errors">';
    for(var i = 0 ; i < response.errors.length ; i++) {
        html += '<li>' + response.errors[i] + '</li>';
    }
    html += '<ul>';

    een_bepaalde_div.innerHTML = html;
} else if(response.status == 'ok') {
    // do whatever you want
}


en met css geef je de foutmelding de gewenste stijl.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
.errors {
    /* style voor de unsorted list */
}
.errors li {
    /* style voor de list items */
}


Toevoeging op 19/09/2018 12:34:03:

p.s het voorbeeld werkt met de simpelere array uit mijn eerste reactie. als je de array's onderverdeeld per formulier veld dan wordt het wat uitgebreider.
Gewijzigd op 19/09/2018 12:34:47 door Frank Nietbelangrijk
 
Thomas van den Heuvel

Thomas van den Heuvel

19/09/2018 14:22:23
Quote Anchor link
Het is waarschijnlijk niet nodig om elke foutmelding een aparte naam (emailleeg, emailfout etc.) te geven.

En misschien is het ook verstandig om of uitsluitend engels of nederlands te gebruiken in code, maar niet een of andere mengvorm.

Ook zou je kunnen overwegen om een Boolean mee te geven voor de status in de vorm van hasErrors true/false, dan hoef je niet expliciet een vergelijking te doen met een statustekst. Dit hangt natuurlijk ook af van wat je verder met de response(s) wilt doen.
 
Yoeri Achterbergen

Yoeri Achterbergen

19/09/2018 16:51:57
Quote Anchor link
De benamingen ga ik in het nederlands doen aangezien er alleen nederlandse gebruikers op de website zitten.

Het betreft een aanmeld formulier waarbij de voornaam en email gebruikt gaan worden.
Het formulier verstuur ik via de AJAX methode:

<input class="register-field" name="first_name" type="text"/>
<input class="register-field" name="email" type="email"/>

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
<script type="text/javascript">

$(document).ready(function(){
    
    $(".register-field-submit").click(function(event){
        
        event.preventDefault();
        
        $.ajax({
            
            cache: false,
            
            url:"register.php",
            
            data:$("#registernp").serialize(),
            
            success: function (data){
                
                $('#target').html(data.message).fadeIn();
            
            }
        
        })
;    
    });

});

</script>


Als er errors zijn dan wil ik deze terug geven zoals boven uitgelegd.
Als alles correct is wil ik dat de naam en emailadres worden teruggeven.
 
Jop B

Jop B

19/09/2018 17:39:35
Quote Anchor link
Je kan dan toch 2 arrays tegelijk terug zenden of bij je response array ook een succes maken en deze vullen met de informatie wat je krijgt uit het formulier.
 
Yoeri Achterbergen

Yoeri Achterbergen

19/09/2018 21:24:38
Quote Anchor link
De array heb ik opgebouwd en ziet er nu zo uit voor de legevoornaam
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
<?php
header('Content-Type: application/json; charset=UTF-8');
if(trim($_GET['first_name']) == ''){
     $response = array(
         'status' => 'false',
          'errors' => array(
             'formerror' => array(
                'empty' => 'Meerdere velden zijn niet ingevuld',
             ),
         ),
     );
    
}
else{
     $response = array('status' => 'true');
}


echo json_encode($response);
?>


?>



de Javascript ziet er zo uit
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
<script type="text/javascript">
$(document).ready(function(){
    $(".register-field-submit").click(function(event){
        event.preventDefault();
        $.ajax({
            cache: false,
            url:"register.php",
            data:$("#registernp").serialize(),
            success: function (data){
                if(data.status == 'false') {
                    $('#target').html('<span style="background-color:red;">'+data.errors+'</span>').fadeIn();
                }else{
                    $('#target').html('<span style="background-color:green;">Gelukt</span>').fadeIn();
                }
            }
        })
    });
});
</script>


Als ik het veld leeg laat geeft hij false terug en zou hij ook de errors moeten laten zien, maar hij geeft nu "[object Object]" terug.


Toevoeging op 19/09/2018 21:53:39:

Als ik de console.log gebruik geeft hij dit weer: {formerror: {empty: "Meerdere velden zijn niet ingevuld"}}
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/09/2018 22:16:49
Quote Anchor link
data.errors geeft nog een array terug met weliswaar één item: formerror waarin wederom nog een array zit :-). dus je kan of een lus maken die daar doorheen wandelt of je maakt er data.errors.formerror.empty van. Status => true .. dat klinkt niet. Een status is niet waar of onwaar. Maak er dan success => true van...

Statussen zoals ok en error worden door veel developers toegepast overigens dus trek je niet alles aan. Voordeel is ook dat je meerdere mogelijkheden hebt dan alleen true en false.
Denk aan een payprovider die de status van een betaling doorgeeft met Open, Payed, Cancelled, Denied enz.

(Thomas waarom moet het altijd zo ingewikkeld? al zijn het suggesties die je geeft.)
Gewijzigd op 19/09/2018 22:22:24 door Frank Nietbelangrijk
 
Yoeri Achterbergen

Yoeri Achterbergen

19/09/2018 22:29:30
Quote Anchor link
@frank,


dank voor de goede tips :) heb de statussen een andere waarde gegeven.
Je hebt het over een lus maken bedoel je dan een loop zoals je al eerder aangaf zoals
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
for(var i = 0 ; i < response.errors.length ; i++) {
}
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/09/2018 22:34:31
Quote Anchor link
Sorry lopen door objecten (in PHP associative arrays) gaat niet lukken merk ik nu.

Je zult je array moeten wijzigen in
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$response
= array(
     'status' => 'false',
      'errors' => array(
         'formerrors' => array(
            'Meerdere velden zijn niet ingevuld',
            'nog een foutmelding'
         ),
     ),
 );

?>

en zo benaderen in javascript
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
// in json
var data = {"status":"failure","errors":{"formerrors":["Meerdere velden zijn niet ingevuld","nog een foutmelding"]}};

for(var i = 0 ; i < data.errors.formerrors.length; i++) {
    console.log(data.errors.formerrors[i]);
}


Toevoeging op 19/09/2018 23:00:34:

https://codepen.io/anon/pen/mGaaRg
Gewijzigd op 19/09/2018 22:57:06 door Frank Nietbelangrijk
 
Yoeri Achterbergen

Yoeri Achterbergen

20/09/2018 00:30:50
Quote Anchor link
Oke dit werkt prima :) Als er een error is rood bericht met de error en status ok groen bericht.
Nu heb ik nog één vraag betreft de juiste foutafhandeling:

Als ik meerde controles uitvoer dan word de array overschreven tot er geen meer is.
Hoe kan ik toch meerdere controles uitvoeren met een return array

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
<?php
if(trim($_GET['first_name']) && trim($_GET['email']) == ''){
    $response = array(
         'status' => 'error',
          'errors' => array(
             'Je bent vergeten je naam in te vullen',
             'Zonder emailadres kunnen wij geen e-mail sturen',
                  ),
     );    
}


if(trim($_GET['first_name']) == ''){
     $response = array(
         'status' => 'error',
          'errors' => array(
             'Je bent vergeten je naam in te vullen',
                ),
     );    
}


if(trim($_GET['email']) == ''){
     $response = array(
         'status' => 'error',
          'errors' => array(
            'Zonder emailadres kunnen wij geen e-mail sturen',
                ),
     );    
}

?>
 
Jop B

Jop B

20/09/2018 10:00:19
Quote Anchor link
En als je op het einde je array maakt en deze vult met variabelen? Een lege variablen geeft hij toch niet weer en als deze gevuld is krijg je je foutmeldingen terug.
Of zit ik niet verkeerd?
 
- Ariën -
Beheerder

- Ariën -

20/09/2018 10:12:16
Quote Anchor link
Hier zou ik zelf kiezen voor de DRY-methode:
Don't
Repeat
Yourself

Dus enkel de variabelen defineren per controlestatement en aan het eind je array genereren.

Lijn 6 en 7 zijn twee aparte foutmeldingen. Maar moeten dit geen twee zinnen in een error zijn?
Gewijzigd op 20/09/2018 10:14:03 door - Ariën -
 
Yoeri Achterbergen

Yoeri Achterbergen

20/09/2018 10:30:33
Quote Anchor link
Hi Ariën,

lijn 6 en 7 zijn inderdaad 2 aparte foutmeldingen, dit omdat er op 2 velden word gecontroleerd of er iets is ingevuld
Met de bovenstaande loop van Frank worden deze netjes terug gecommuniceerd. Omdat ik met een array werk word deze steeds herschreven waardoor ik niet alle errors terug krijg maar enkel de laatste (wat logisch is).
De DRY-methode ga ik even opzoeken of het gaat wat ik zou willen

Toevoeging op 20/09/2018 12:35:01:
Met die variabelen werkt prima voor mij:)
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
<?php
header('Content-Type: application/json; charset=UTF-8');
$emptyfirstname = "";
$lengthfirstname ="";
$emptymail = "";

if(trim($_GET['first_name']) == ''){
    $emptyfirstname = 'Je bent vergeten je naam in te vullen';    
}
elseif(strlen($_GET['first_name']) <= 1){
    $lengthfirstname = 'Een naam met 1 letter bestaat niet';
}




if(trim($_GET['email']) == ''){
    $emptymail = 'Zonder emailadres kunnen wij geen e-mail sturen';
}



$response = array(
         'status' => 'error',
          'errors' => array(
             $emptyfirstname,
             $lengthfirstname,
             $emptymail,
         ),
     );
    





echo json_encode($response);
?>
Gewijzigd op 20/09/2018 14:42:39 door Yoeri Achterbergen
 

Pagina: 1 2 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.