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

<?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.
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"/>


<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.
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.
De array heb ik opgebouwd en ziet er nu zo uit voor de legevoornaam

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

<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.


[size=xsmall]Toevoeging op 19/09/2018 21:53:39:[/size]

Als ik de console.log gebruik geeft hij dit weer: {formerror: {empty: "Meerdere velden zijn niet ingevuld"}}
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.)
@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

for(var i = 0 ; i < response.errors.length ; i++) {
}
Sorry lopen door objecten (in PHP associative arrays) gaat niet lukken merk ik nu.

Je zult je array moeten wijzigen in
<?php
$response = array(
'status' => 'false',
'errors' => array(
'formerrors' => array(
'Meerdere velden zijn niet ingevuld',
'nog een foutmelding'
),
),
);
?>
en zo benaderen in javascript

// 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]);
}


[size=xsmall]Toevoeging op 19/09/2018 23:00:34:[/size]

https://codepen.io/anon/pen/mGaaRg
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


<?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',
                ),
	 );	
}
?>
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?
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?
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

[size=xsmall]Toevoeging op 20/09/2018 12:35:01:[/size]
Met die variabelen werkt prima voor mij:)

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

Reageren