Affichage d'une requête Ajax dans un script PHP

Eléphanteau du PHP | 36 Messages

31 oct. 2023, 18:17

Bonjour à tous,

Je développe actuellement une interface en Js/Php pour une boutique en ligne. Mon script Javascript exécute les étapes de l'enregistrement du panier et exécute une requête Ajax, pour ainsi transmettre cela coté client en PHP.

l Voici le script JS avec a fonction "save" qui exécute la requête ajax.

RAS a ce niveau là. La requête ajax renvoie le panier, response statut 200 dans l'inspecteur/Réseaux.

Code : Tout sélectionner

// ADD, DELETE & TOTAL PRODUCT const cart = { products: [], total: 0, // Ajouter addProduct: function(product) { this.products.push(product); this.calculateTotal(); }, // Suprimer deleteProduct: function(id) { var index = -1; for (var i = 0; i < this.products.length; i++) { if (this.products[i].id === id) { index = i; break; } } if (index !== -1) { this.products.splice(index, 1); this.calculateTotal(); displayCart(); } }, // Supp All deleteAll: function() { this.products = []; this.calculateTotal(); displayCart(); this.deleteBasketCookie(); // Appel à la fonction pour supprimer le cookie "basket" }, // Supprimer le cookie "basket" deleteBasketCookie: function() { document.cookie = "basket=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; }, // Save save: function() { // Convertissez le panier en chaîne JSON const cartJSON = JSON.stringify(this); $.ajax({ type: "POST", url: "./index.php", data: { cart: cartJSON }, }).done(function(response) { //console.log(response); // Affiche le contenu de cartJSON }); //console.log(cartJSON); displayCart(); }, // Total calculateTotal: function() { var total = 0; for (var i = 0; i < this.products.length; i++) { total += this.products[i].price; } this.total = Math.round(total * 100) / 100; } }; ... // Bouton Suivant document.addEventListener("DOMContentLoaded", function() { var nextOneButtons = document.getElementsByClassName("nextOne"); for (var i = 0; i < nextOneButtons.length; i++) { nextOneButtons[i].addEventListener("click", function() { cart.save(); }); } });
Voici maintenant le script php contenant la variable $etatdupanier qui nous indique si le panier est bien enregistrer ou non
<?php 

$etatdupanier = 'le panier est vide';

if ($_SERVER["REQUEST_METHOD"] === "POST") {
  // Récupérez les données du panier depuis la requête POST
  $cartData = $_POST["cart"];

  // Vous pouvez décoder les données JSON en un tableau PHP
  $cart = json_decode($cartData, true);

  // réponse au client 
  $etatdupanier= "Le panier a été enregistré avec succès.";
} else {
  // Gérez les erreurs ou les requêtes non autorisées
  $etatdupanier = "Requête invalide.";
}
// ici ces cette variable que je souhaite utiliser dans mon html 
echo $etatdupanier;

?>
Encore une fois je constate dans l'inspecteur/réseau que mon script envoi correctement le panier, et que le php coté serveur récupère bien le message $etatdupanier. La variable est bien mise à jour dans l'inspecteur, le serveur traite bien la demande envoyée par le JS coté client. Donc en théorie tout est censé être ok mais je ne comprend pas pourquoi cette variable quant à elle niveau affichage présente une message diférent "Requête invalide."

Mon souci est donc que je n'arrive pas à afficher dans mon html ma variable $etatdupanier mise à jour, mais coté java script et php tout semble bien communiquer.

ici mon html simplifié :

<fieldset>
									<div class="form-card">
										<div class="row">
											<div class="col-7">
												<h2 class="fs-title">Personal Information:</h2>
											</div>
											<div class="col-5">

										</div>
										</div>
										



										 <div id="ajax">

// Je souhaite tous simplement afficher dans ce H5 le résultat qui s'affiche dans l'inspecteur 

										 	<h5 class="modal-title"> <span class="text-left titre"> <?= h($etatdupanier); ?> </span></h5>
											</div>


									</div>
									<input type="button" name="next" class="next action-button" value="Next"/>
									<input type="button" name="previous" class="previous action-button-previous prevOne" value="Previous"/>
</fieldset>


Je suis bloqué depuis plus d'une semaine sur le sujet c'est le moment de demander de l'aide (GPT à ses limites).
Si vous avez la gentillesse de me débloquer sur ce sujet , vous aurez ma reconnaissance éternelle hihihi je m'arrache les cheveux.

Mammouth du PHP | 2703 Messages

31 oct. 2023, 18:30

la console indique que index.php est appelé en méthode post ?
qu'est-ce que
echo $_SERVER["REQUEST_METHOD"];
affiche, une fois ajouté au début de index.php ?

c'est bien lors de l'appel ajax que cela affiche "Requête invalide." et non lors d'un autre appel de index.php ?

Eléphanteau du PHP | 36 Messages

31 oct. 2023, 18:48

oui voici les info de la console :

entête :
URL De Requête:
http://localhost:8888/Numerova/index.php
Méthode De Requête:
POST
Code D'état:
200 OK

charge util:

cart: {"products":[{"id":2,"title":"Compatibilité","price":49}],"total":49}

appercu :

Le panier a été enregistré avec succès.
Accueil
Logiciel
Amour
Qui sommes-nous ?
...

Réponse :

Le panier a été enregistré avec succès.

<!DOCTYPE html>
<html lang="fr">
...



Qu'est-ce que echo $_SERVER["REQUEST_METHOD"]; ? Ca je ne sais pas trop l'expliquer :
if ($_SERVER["REQUEST_METHOD"] === "POST") permet de verifier si il y a bien une requete ajax mais je m'arrete la niveau compréhenssion.


c'est bien lors de l'appel ajax que cela affiche "Requête invalide." et non lors d'un autre appel de index.php ? Non c'est des l'ouverture de l'index que ce message s'affiche, et non au declenchement d'ajax.

Dès l'ouverture de l'index le echo $etatdupanier; affiche "requete invalide". dans le html fournis idem, même au clique du bouton validé, lorsque à ce moment la console prend vie et affiche le bon message; Mon echo reste en "requete invalide'.

Mammouth du PHP | 2703 Messages

31 oct. 2023, 19:08

appeler en ajax un autre fichier que index.php pour sauver le panier serait beaucoup plus simple, plus propre, fichier qui ne fait que cette tâche.

Avatar du membre
Mammouth du PHP | 1564 Messages

01 nov. 2023, 14:48

Deux "=" suffisent :
if ($_SERVER["REQUEST_METHOD"] == "POST") {
https://www.php.net/manual/fr/language. ... arison.php

Eléphanteau du PHP | 36 Messages

01 nov. 2023, 17:08

Malheureusement le problème persiste toujours. inspecteur = Le panier a été enregistré avec succès. et l'affichage html "Le panier est vide"

$etatdupanier = '';

if ($_SERVER["REQUEST_METHOD"] == "POST") {

// Récupérez les données du panier depuis la requête POST
$cartData = $_POST["cart"];

// Vous pouvez décoder les données JSON en un tableau PHP
$cart = json_decode($cartData, true);
// Vous pouvez renvoyer une réponse au client si nécessaire
$etatdupanier= "Le panier a été enregistré avec succès.";
}
else {
// Gérez les erreurs ou les requêtes non autorisées
$etatdupanier = 'Le panier est vide';
}
echo $etatdupanier;

Eléphanteau du PHP | 36 Messages

01 nov. 2023, 17:10

En fait ce fichier php à était unpeu partout, dans le html dans l'index, mais il a un shop.php ou il s'execute. Quand le code fonctionnera il ira dans une classe php sous la forme d'une fonction. Mais pour le moment j'aimerais que le html se mette à jour.

Eléphanteau du PHP | 36 Messages

01 nov. 2023, 17:11

Et merci d'essayer les gars !

Avatar du membre
Mammouth du PHP | 1564 Messages

01 nov. 2023, 17:19

Dans ton fichier où ya $_SERVER["REQUEST_METHOD"], met seulement ceci pour voir le résultat qui est retourné :
<?php var_dump( $_SERVER["REQUEST_METHOD"]) ?>

Eléphanteau du PHP | 36 Messages

01 nov. 2023, 18:05

string(3) "GET"
Bizarrement il me sort un GET. Je ne sais pas comment interpréter cela;

Avatar du membre
Mammouth du PHP | 1564 Messages

01 nov. 2023, 18:17

Modifie ta condition et rajoute "if == GET" avec "if == POST", tu acceptera les deux.

Je peux te conseiller de faire un var_dump de $_SERVER dans ton fichier et de choisir ce qui te convient le mieux pour accepter les appels jQuery.

Mammouth du PHP | 2703 Messages

01 nov. 2023, 18:20

je me répéte :
appeler en ajax un autre fichier que index.php pour sauver le panier serait beaucoup plus simple, plus propre, fichier qui ne fait que cette tâche.

Avatar du membre
Mammouth du PHP | 1564 Messages

01 nov. 2023, 18:34

Là n'est pas le problème or 1 :wink:

Mammouth du PHP | 2703 Messages

01 nov. 2023, 18:44

si je vais sur htps://forum.phpfrance.com/php-avance/topic283645.html ce sera en méthode get
en mettant dans le code donné :
url: "htps://forum.phpfrance.com/php-avance/topic283645.html",
l'appel ajax se sera en post. donc un coup, le fichier est appelé en méthod get, un coup en post, il ne faut pas mettre de else, et ne pas afficher de message ainsi :
<h5 class="modal-title"> <span class="text-left titre"> <?= h($etatdupanier); ?> </span></h5>
mais dans le retour de la fonction ajax, en jquery.

Eléphanteau du PHP | 36 Messages

01 nov. 2023, 19:21

ici le var dump server :


var_dump( $_SERVER) ;
// array(41) { ["HTTP_HOST"]=> string(14) "localhost:8888" ["HTTP_CONNECTION"]=> string(10) "keep-alive" ["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0" ["HTTP_SEC_CH_UA"]=> string(65) ""Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"" ["HTTP_SEC_CH_UA_MOBILE"]=> string(2) "?0" ["HTTP_SEC_CH_UA_PLATFORM"]=> string(7) ""macOS"" ["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1) "1" ["HTTP_USER_AGENT"]=> string(117) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ["HTTP_ACCEPT"]=> string(135) "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ["HTTP_SEC_FETCH_SITE"]=> string(11) "same-origin" ["HTTP_SEC_FETCH_MODE"]=> string(8) "navigate" ["HTTP_SEC_FETCH_USER"]=> string(2) "?1" ["HTTP_SEC_FETCH_DEST"]=> string(8) "document" ["HTTP_REFERER"]=> string(22) "http://localhost:8888/" ["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip, deflate, br" ["HTTP_ACCEPT_LANGUAGE"]=> string(44) "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6" ["PATH"]=> string(29) "/usr/bin:/bin:/usr/sbin:/sbin" ["SERVER_SIGNATURE"]=> string(0) "" ["SERVER_SOFTWARE"]=> string(142) "Apache/2.4.46 (Unix) OpenSSL/1.0.2u PHP/7.4.12 mod_wsgi/3.5 Python/2.7.13 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.30.1" ["SERVER_NAME"]=> string(9) "localhost" ["SERVER_ADDR"]=> string(3) "::1" ["SERVER_PORT"]=> string(4) "8888" ["REMOTE_ADDR"]=> string(3) "::1" ["DOCUMENT_ROOT"]=> string(25) "/Applications/MAMP/htdocs" ["REQUEST_SCHEME"]=> string(4) "http" ["CONTEXT_PREFIX"]=> string(0) "" ["CONTEXT_DOCUMENT_ROOT"]=> string(25) "/Applications/MAMP/htdocs" ["SERVER_ADMIN"]=> string(15) "[email protected]" ["SCRIPT_FILENAME"]=> string(44) "/Applications/MAMP/htdocs/Numerova/index.php" ["REMOTE_PORT"]=> string(5) "61798" ["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1" ["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1" ["REQUEST_METHOD"]=> string(3) "GET" ["QUERY_STRING"]=> string(0) "" ["REQUEST_URI"]=> string(10) "/Numerova/" ["SCRIPT_NAME"]=> string(19) "/Numerova/index.php" ["PHP_SELF"]=> string(19) "/Numerova/index.php" ["REQUEST_TIME_FLOAT"]=> float(1698859189.4315) ["REQUEST_TIME"]=> int(1698859189) ["argv"]=> array(0) { } ["argc"]=> int(0) }

Ici cela dépasse ma compréhension...