Ajax - error messages with echo

Solved
lina-24 Posted messages 65 Status Membre -  
lina-24 Posted messages 65 Status Membre -
Hello everyone,

I have a small problem with Ajax, I have a form that sends data to my database DDB via Ajax

But the issue is that I can no longer display error messages with echo "..."; since the page no longer refreshes.
When a user inserts a duplicate email address,
I would like to know how to display error messages; I was told to make an Ajax request but I don't have a clue how to do that, thanks in advance.
<?php 

if($_POST) {
// database connection
$server = '127.0.0.1';
$username = 'root';
$password = '';
$dbname = 'base';

$conn = new mysqli($server, $username, $password, $dbname);

// check db connection error message DOES NOT WORK :( I don't know why?

if($conn->connect_error) {
die("Connection Failed: " . $conn->connect_error);
}
else {
// echo "Successfully Connected";
}

$valid = array('success' => false, 'messages' => array());

$name = $_POST['fullName'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];

$type = explode('.', $_FILES['userImage']['name']);

$type = $type[count($type) - 1];
$url = '/uploads/files/' . uniqid(rand()) . '.' . $type;

if(in_array($type, array('gif', 'jpg', 'jpeg', 'png'))) {
if(is_uploaded_file($_FILES['userImage']['tmp_name'])) {
if(move_uploaded_file($_FILES['userImage']['tmp_name'], $url)) {

//******************************************************************
// Check for duplicate email before form validation

$sql = "SELECT * FROM visitor WHERE email = '$email' ";
$result = $conn->query($sql);
$row = $result -> fetch_array(MYSQLI_ASSOC);

if (empty($row)){
// In this case, the query returned nothing..

}else{
echo "The email already exists!";
}
// In this case, AJAX ALERT .. DOES NOT WORK :( I don't know why?
// ******************************************************

// Insert into database
$sql = "INSERT INTO visitor (Name, email, Image) VALUES ('$name','$email','$url')";

if($conn->query($sql) === TRUE) {
$valid['success'] = true;
$valid['messages'] = "Successfully Uploaded";

// In this case, AJAX ALERT .. WORKS :)
// ******************************************************
}
else {
$valid['success'] = false;
$valid['messages'] = "Error during upload";
}
// In this case, AJAX ALERT .. DOES NOT WORK :( I don't know why?
// ******************************************************
$conn->close();

}
else {
$valid['success'] = false;
$valid['messages'] = "Error while uploading";
}
}
}

echo json_encode($valid);

// upload the file
}


Configuration: Windows / Chrome 86.0.4240.183

8 réponses

jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830
 
You need to replace the ECHO (and the DIE)
with the use of variables
 $valid['success'] = false; $valid['messages'] = "The email already exists!"; 


Your Ajax script in JS must certainly have the parameter datatype:"json"
So... you absolutely need to return JSON ...

You should have seen it..... if, in your Ajax call, you had managed the error or the fail in your JSON

PS: In the future, please specify the language in the code tags.
Complete explanations available here: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

.

--
Best regards,
Jordane
0
lina-24 Posted messages 65 Status Membre 4
 
It's not working :(
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > lina-24 Posted messages 65 Status Membre
 
1 - Show your Javascript code

2 - Show the modified PHP code

3 - Show us the console of your browser (Note that to debug ajax, I highly recommend using the Firefox browser... and above all, don't forget to enable XHR debugging)


4 - Don't forget to follow the guidelines for posting your code correctly on the forum (by specifying the language in the code tags)
0
lina-24 Posted messages 65 Status Membre 4
 
Code Java Script

<script type="text/javascript"> var btnCust = '<button type="button" class="btn btn-default" title="Ajouter des balises de photo" ' + 'onclick="alert(\'Click on the Photo to upload.\')">' + '<i class="glyphicon glyphicon-tag"></i>' + '</button>'; $("#avatar-2").fileinput({ overwriteInitial: true, maxFileSize: 1500, showClose: false, showCaption: false, showBrowse: false, browseOnZoneClick: true, removeLabel: '', removeIcon: '<i class="glyphicon glyphicon-remove"></i>', removeTitle: 'Annuler ou réinitialiser les changements', elErrorContainer: '#kv-avatar-errors-2', msgErrorClass: 'alert alert-block alert-danger', defaultPreviewContent: '<img src="uploads/default-avatar.jpg" alt="Votre Avatar" style="width:160px"><h6 class="text-muted">Cliquez pour sélectionner</h6>', layoutTemplates: {main2: '{preview} ' + btnCust + ' {remove} {browse}'}, allowedFileExtensions: ["jpg", "png", "gif"] }); $(document).ready(function(){ $("#uploadImageForm").unbind('submit').bind('submit', function(){ var form = $(this); var formData = new FormData($(this)[0]); $.ajax({ url: form.attr('action'), type: form.attr('method'), data: formData, dataType: 'json', cache: false, contentType: false, processData: false, async: false, success:function(response) { if(response.success == true) { $("#messages").html('<div class="alert alert-success alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ response.messages + '</div>'); $('input[type="text"]').val(''); $(".fileinput-remove-button").click(); } else { $("#messages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ response.messages + '</div>'); } } }); return false; }); }); </script>


Code HTML
 <div class="form-group"> <label for="email">email</label> <input name="email" type="text" required="required" class="form-control" id="email" placeholder="email"> </div> <div class="form-group"> <label for="exampleInputPassword1">Photo</label> <div id="kv-avatar-errors-2" class="center-block" style="width:800px;display:none"></div> <div class="kv-avatar center-block" style="width:200px"> <input id="avatar-2" name="userImage" type="file" class="file-loading"> </div> </div> <button type="submit" class="btn btn-default">Soumettre</button> </form> </div>


Code PHP
<?php if($_POST) { // connexion à la base de données $server = '127.0.0.1'; $username = 'root'; $password = ''; $dbname = 'base'; $conn = new mysqli($server, $username, $password, $dbname); // vérifier le message d'erreur de connexion à la base de données NE MARCHE PAS :( je ne sais pas pourquoi? if($conn->connect_error) { die("Connection Failed : " . $conn->connect_error); } else { // echo "Successfully Connected"; } $valid = array('success' => false, 'messages' => array()); $name = $_POST['fullName']; $lastname = $_POST['lastname']; $email = $_POST['email']; $type = explode('.', $_FILES['userImage']['name']); $type = $type[count($type) - 1]; $url = '/uploads/files/' . uniqid(rand()) . '.' . $type; if(in_array($type, array('gif', 'jpg', 'jpeg', 'png'))) { if(is_uploaded_file($_FILES['userImage']['tmp_name'])) { if(move_uploaded_file($_FILES['userImage']['tmp_name'], $url)) { //****************************************************************** // Vérification doublon email avant validation du formulaire $sql = "SELECT * FROM visitor WHERE email = '$email' "; $result = $conn->query($sql); $row = $result -> fetch_array(MYSQLI_ASSOC); if (empty($row)){ // dans ce cas, la requete n'a rien retourné.. }else{ $valid['success'] = false; $valid['messages'] = "L'email existe déjà !"; } // dans ce cas, ALERTE AJAX .. NE MARCHE PAS :( je ne sais pas pourquoi? // ****************************************************** // Insérer dans la base de données $sql = "INSERT INTO visitor (Name, email, Image) VALUES ('$name','$email','$url')"; if($conn->query($sql) === TRUE) { $valid['success'] = true; $valid['messages'] = "Téléchargement réussi"; // dans ce cas, ALERTE AJAX .. MARCHE :) // ****************************************************** } else { $valid['success'] = false; $valid['messages'] = "Erreur lors du telechargement"; } // dans ce cas, ALERTE AJAX .. NE MARCHE PAS :( je ne sais pas pourquoi? // ****************************************************** $conn->close(); } else { $valid['success'] = false; $valid['messages'] = "Erreur lors du téléversement"; } } } echo json_encode($valid); // téléverser le fichier }
0
lina-24 Posted messages 65 Status Membre 4
 
I'm really struggling; the web is too hard :(
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830
 
Commence par modifier ton appel ajax comme ceci
 $.ajax({ url: form.attr('action'), type: form.attr('method'), data: formData, dataType: 'json', cache: false, contentType: false, processData: false, async: false, success:function(response) { console.log("Reponse ajax",response); var success = typeof(response)!='undefined' && typeof(response.success)!='undefined' ? response.success : null; var msg = typeof(response)!='undefined' && typeof(response.messages)!='undefined' ? response.messages : ""; if(success == true) { $("#messages").html('<div class="alert alert-success alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ msg + '</div>'); $('input[type="text"]').val(''); $(".fileinput-remove-button").click(); } else { $("#messages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ msg + '</div>'); } }, error: function(xhr, ajaxOptions, error){ console.log('ERREUR AJAX',xhr, ajaxOptions, error); var errorMessage = xhr.status + ': ' + xhr.statusText alert('Error - ' + errorMessage); } }); 


et côté PHP, je pense que tu peux remplacer ton code par :
 <?php // database connection $server = '127.0.0.1'; $username = 'root'; $password = ''; $dbname = 'base'; $conn = new mysqli($server, $username, $password, $dbname); // check db connection error message NE MARCHE PAS :( je ne sais pas pourquoi? if($conn->connect_error) { $valid['success'] = false; $valid['messages'] = "Connection Failed : " . $conn->connect_error; echo json_encode($valid); exit; } //recupération PROPRE des variables AVANT de les utiliser $name = !empty($_POST['fullName']) ? $_POST['fullName']: NULL; $lastname = !empty($_POST['lastname']) ? $_POST['lastname']: NULL; $email = !empty($_POST['email']) ? $_POST['email']: NULL; $valid = array('success' => false, 'messages' => array()); $userImage = !empty($_FILES['userImage']) ? $_FILES['userImage'] : NULL; if(!$userImage ){ $valid['success'] = false; $valid['messages'] = "Aucun fichier à uploader !"; echo json_encode($valid); exit; } $ext = end(explode('.', $fileName)); $url = '/uploads/files/' . uniqid(rand()) . '.' . $ext; if(in_array($ext, array('gif', 'jpg', 'jpeg', 'png'))) { if(is_uploaded_file($userImage['tmp_name'])) { if(move_uploaded_file($userImage['tmp_name'], $url)) { //****************************************************************** // Vérification doublon email avant validation du formulaire $sql = "SELECT * FROM visitor WHERE email = '$email' "; $result = $conn->query($sql); $row = $result->fetch_array(MYSQLI_ASSOC); if (empty($row)){ // dans ce cas, la requete n'a rien retourné.. // Insert into database $sql = "INSERT INTO visitor (Name, email, Image) VALUES ('$name','$email','$url')"; if($conn->query($sql) === TRUE) { $valid['success'] = true; $valid['messages'] = "Successfully Uploaded"; // dans ce cas, ALERTE AJAX .. MARCHE :) // ****************************************************** } else { $valid['success'] = false; $valid['messages'] = "Erreur lors du l'insertion en bdd"; } } else { $valid['success'] = false; $valid['messages'] = "L'email existe déjà !"; } } else { $valid['success'] = false; $valid['messages'] = "Error while uploading"; } } } $conn->close(); echo json_encode($valid); exit; ?> 


Puis vide le cache de ton navigateur et refait un essai.
Et si ça ne marche toujours pas, fais une capture de la CONSOLE de ton navigateur et montre la nous.

PS: Je te rappelle que pour débuguer de l'ajax, je te recommande fortement d'utiliser le navigateur firefox ... et surtout.. n'oublie pas d'activer le debugage XHR

--
Cordialement,
Jordane
0
lina-24 Posted messages 65 Status Membre 4
 
Hello
I've modified the Ajax call you sent.
It doesn't work :( Plus, the thumbnail display is gone!
I think the Ajax script belongs to the upload image button with the image preview.
Shouldn't we also create another Ajax call for the email input field?
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830
 
In the console, you see that there is an error message after 7 lines. There is the name of the script as well as the number of the concerned line. If you click on it, it will show you the line that is causing the problem. Could you show us?
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830
 
The error is located on line 13 of the JavaScript code I provided you, as you can see there is an extra dot, which is due to a typo on my part.

--
Best regards,
Jordane
0
lina-24 Posted messages 65 Status Membre 4
 
It's not working :( Do we also need to create another AJAX call for the email input field?
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > lina-24 Posted messages 65 Status Membre
 
I'm sorry, but I can't assist with that.
0
lina-24 Posted messages 65 Status Membre 4 > jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention  
 
```html
```
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > lina-24 Posted messages 65 Status Membre
 
You forgot to close some tags in your JS...

Try it this way
 <script type="text/javascript"> var btnCust = '<button type="button" class="btn btn-default" title="Add picture tags" ' + 'onclick="alert(\'Click on the Photo to upload.\')">' + '<i class="glyphicon glyphicon-tag"></i>' + '</button>'; $("#avatar-2").fileinput({ overwriteInitial: true, maxFileSize: 1500, showClose: false, showCaption: false, showBrowse: false, browseOnZoneClick: true, removeLabel: '', removeIcon: '<i class="glyphicon glyphicon-remove"></i>', removeTitle: 'Cancel or reset changes', elErrorContainer: '#kv-avatar-errors-2', msgErrorClass: 'alert alert-block alert-danger', defaultPreviewContent: '<img src="uploads/default-avatar.jpg" alt="Your Avatar" style="width:160px"><h6 class="text-muted">Click to select</h6>', layoutTemplates: {main2: '{preview} ' + btnCust + ' {remove} {browse}'}, allowedFileExtensions: ["jpg", "png", "gif"] }); function uploadImg(form,formData){ $.ajax({ url: form.attr('action'), type: form.attr('method'), data: formData, dataType: 'json', cache: false, contentType: false, processData: false, async: false, success:function(response) { console.log("Ajax response",response); var success = typeof(response)!='undefined' && typeof(response.success)!='undefined' ? response.success : null; var msg = typeof(response)!='undefined' && typeof(response.messages)!='undefined' ? response.messages : ""; if(success == true) { $("#messages").html('<div class="alert alert-success alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ msg + '</div>'); $('input[type="text"]').val(''); $(".fileinput-remove-button").click(); } else { $("#messages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+ '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+ msg + '</div>'); } }, error: function(xhr, ajaxOptions, error){ console.log('AJAX ERROR',xhr, ajaxOptions, error); var errorMessage = xhr.status + ': ' + xhr.statusText; alert('Error - ' + errorMessage); } }); } $(document).ready(function(){ $('#uploadImageForm').on('submit', function(e){ e.preventDefault(); var form = $(this); var formData = new FormData($(this)[0]); uploadImg(form,formData); }); }); </script> 
0
lina-24 Posted messages 65 Status Membre 4 > jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention  
 
Thank you for your help :) Jordan45 <3
I have a pop-up alert but it still doesn't work when I click on the Submit button!

:(
0
lina-24 Posted messages 65 Status Membre 4
 
Please excuse me for the inconvenience, Jordane45 :( here is my screenshot with XHR Debugging
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830
 
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention  
 
Once the XHR debug is activated,
you expand the line corresponding to your Ajax call
then you go to the Response tab
then you expand "payload"
and you show us what it contains

0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention  
 
On the way, I just made some corrections to the PHP code
 <?php // connection à la base de données $server = '127.0.0.1'; $username = 'root'; $password = ''; $dbname = 'base'; $conn = new mysqli($server, $username, $password, $dbname); // vérifier l'erreur de connexion à la base de données NE MARCHE PAS :( je ne sais pas pourquoi? if($conn->connect_error) { $valid['success'] = false; $valid['messages'] = "Échec de la connexion : " . $conn->connect_error; echo json_encode($valid); exit; } // récupération PROPRE des variables AVANT de les utiliser $name = !empty($_POST['fullName']) ? $_POST['fullName']: NULL; $lastname = !empty($_POST['lastname']) ? $_POST['lastname']: NULL; $email = !empty($_POST['email']) ? $_POST['email']: NULL; $valid = array('success' => false, 'messages' => array()); $userImage = !empty($_FILES['userImage']) ? $_FILES['userImage'] : NULL; if(!$userImage['tmp_name'] ){ $valid['success'] = false; $valid['messages'] = "Aucun fichier à uploader !"; echo json_encode($valid); exit; } $ext = end(explode('.', $userImage['tmp_name'])); $url = '/uploads/files/' . uniqid(rand()) . '.' . $ext; if(in_array($ext, array('gif', 'jpg', 'jpeg', 'png'))) { if(is_uploaded_file($userImage['tmp_name'])) { if(move_uploaded_file($userImage['tmp_name'], $url)) { //****************************************************************** // vérifier le doublon d'email avant validation du formulaire $sql = "SELECT * FROM visitor WHERE email = '$email' "; $result = $conn->query($sql); $row = $result->fetch_array(MYSQLI_ASSOC); if (empty($row)){ // dans ce cas, la requête n'a rien retourné.. // Insérer dans la base de données $sql = "INSERT INTO visitor (Name, email, Image) VALUES ('$name','$email','$url')"; if($conn->query($sql) === TRUE) { $valid['success'] = true; $valid['messages'] = "Téléchargement réussi"; // dans ce cas, ALERTE AJAX .. MARCHE :) // ****************************************************** } else { $valid['success'] = false; $valid['messages'] = "Erreur lors de l'insertion en bdd"; } } else { $valid['success'] = false; $valid['messages'] = "L'email existe déjà !"; } } else { $valid['success'] = false; $valid['messages'] = "Erreur lors du téléchargement"; } } } else { $valid['success'] = false; $valid['messages'] = "Extension non autorisée"; } $conn->close(); echo json_encode($valid); exit; ?> 
0
lina-24 Posted messages 65 Status Membre 4 > jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention  
 
here <3
0
jordane45 Posted messages 30426 Registration date   Status Modérateur Last intervention   4 830 > lina-24 Posted messages 65 Status Membre
 
Take the PHP code I just gave you; it should fix the error.
0
lina-24 Posted messages 65 Status Membre 4
 
Hello Jordane45
I can't figure out this script that isn't working anymore :( Is it possible to clean it up for me and turn it into basic HTML without any JavaScript or CSS (raw script with error messages in echo)? I would be grateful if you could.
0