Envoie donnée: recuperer ma donnée dans l'ajax depuis le PHP
Résolu/FerméNesil Messages postés 37 Date d'inscription mardi 21 juin 2022 Statut Membre Dernière intervention 1 juillet 2024 - 31 mars 2023 à 10:57
- Envoie donnée: recuperer ma donnée dans l'ajax depuis le PHP
- Envoie impossible messenger - Forum Facebook Messenger
- Quand j'envoie des smileys ça fait des points d'interrogation ✓ - Forum Samsung
- Donnée gps - Guide
- Programmer envoie mail gmail - Guide
- Météo xiaomi aucune donnée - Forum Xiaomi
8 réponses
30 mars 2023 à 10:14
Bonjour,
Et quel est le souci exactement ?
Que t'affichent tes console.log ?
Les données te semblent correctes ?
SI oui, c'est que ton souci se trouve au niveau de ton code JS et donc de l'utilisation des réponses ajax que tu en fais...
Si non, c'est que le souci se situe au niveau de ton code php ...
30 mars 2023 à 10:55
Merci de ta réponse.
Je souhaite que cetains buton en Js ne s'affiche que pour certain utilisateur.
Pour cela j'ai besoin de recupere le level de l'utilisateur. Or seul les admins (level = 100) et les chefs de departement (level = 50) sont renseignés dans la table users. Les autres utilisateurs random ne sont pas enregistré en bdd.
Le seul endroit ou ces users vont etre rensegnés c'est dans la table "dossiers" lorsqu'il vont créer un dossier. J'ai donc ajouté une colonne 'level' dans la table 'dossiers' initialisé à NULL par defaut.
Lorsque le dossier est enregistrer cela appel la fonction "afficherDossier". J'ai donc fai en sorte dans le php de savoir si l'ipn de l'utilisateur était renseigné dans la table user.
Si non, je ferais en sorte que le bouton ne s'affiche pas si le level est NULL.
Si oui, je fais un UPDATE de la table 'dossiers' avec la valeur correspondante dans la table users.
Mais je bloque sur cette partie là car je pense que ma double requete est très mal faites. Voila le bout de code corresondant dans mon ficher php :
else{ //Une requete qui update le level de l'utilisateur si celui ci est trouvé dans la bdd $dbcontroller = new DBController(); // requête de mise à jour $update_query = "UPDATE dossiers SET dossiers.level = users.level INNER JOIN users ON dossiers.ipn_dos = users.ipnl"; $stmt_update = mysqli_query($dbcontroller->getConn(), $update_query); $data1 = $dbcontroller->executeSelectQueryMSQL($stmt_update); //Si je retire cette ligne j'obtiens l'erreur "Erreur de mise à jour:" // Vérification si la requête de mise à jour a échoué if (!$stmt_update) { die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn())); } // requête de sélection $select_query = 'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, users.level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'; $stmt_select = mysqli_query($dbcontroller->getConn(), $select_query); $data1 = $dbcontroller->executeSelectQueryMSQL($stmt_select); $dbcontroller->closeQuerySQL(); if ($data1 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data1); } else { $result = "Erreur : résultat vide."; } }
et voila l'erreur obtenu :
Depuis je bloque, je pense savoir que cela est du à ma double requetes
30 mars 2023 à 12:32
Bonjour,
Visiblement tu as un code qui permet d'exécuter des requêtes via le controller ...
Hors.. tu fais appeles à des instructions natives de mysqli PUIS a celle de ton controller .....
En plus, la fonction dans ton controller semble servir uniquement pour des requêtes de type SELECT ... et toi tu y balances un UPDATE ( * je me base sur le nom de la fonction $dbcontroller->executeSelectQueryMSQL )
NB: MSQL n'est pas MySQL .. soit c'est une erreur dans le nom de ta fonction .. soit tu utilises un BDD Microsoft SQL Server ...et non une bbd MySql
Si tu ne comprends pas comment fonctionne ton controller.... postes nous son code...
Modifié le 30 mars 2023 à 14:20
Je comprend mieux l'utilité de mon dbcontroller mais n'ai-je pas une fonction pour effectuer cet UPDATE. Voici le code de mon fichier dbcontroller.php :
<?php class DBController { private $conn; // Le constructeur renvoie une instance de la base de données qui sert à lancer les requêtes function __construct() { $connexion = $this->connectDBMSQL(); if (!empty($connexion)) { $this->conn = $connexion; } } function connectDBMSQL() { include '../PHP/SqlConn.php'; $connexion = mysqli_connect($hostMSQL, $loginMSQL, $passwordMSQL, $databaseMSQL, $port); return $connexion; } function getConn() { $connexion = $this->connectDBMSQL(); $this->conn = $connexion; return $this->conn; } function executeQueryMSQL($stmt) { return $stmt->execute(); } function executeSelectQueryMSQL($stmt) { $stmt->execute(); $meta = $stmt->result_metadata(); while($field = $meta->fetch_field()){ $params[] = &$row[$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $params); while($stmt->fetch()){ foreach($row as $key => $val){ $c[$key] = $val; } $resultset[] = $c; } $this->freeStatementSql($meta); if (!empty($resultset)) { return $resultset; } else { return "Aucune donnée à afficher !"; } } function closeQuerySQL() { mysqli_close($this->conn); } function freeStatementSql($query) { mysqli_free_result($query); } }
30 mars 2023 à 14:56
Il semble que tu puisses utiliser directement la fonction executeQueryMSQL pour les requêtes UPDATE / DELETE et INSERT
30 mars 2023 à 15:39
Des que tu m'en as parlé à la réponse précédente j'ai essayer de modifier ma requete comme tu viens de le suggerer. et l'erreur a juste changer de ligne :
avec ce code :
else{ //Une requete qui update le level de l'utilisateur si celui ci est trouvé dans la bdd $dbcontroller = new DBController(); // $stmt1 = mysqli_prepare($dbcontroller->getConn(), 'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'); // $data1 = $dbcontroller->executeSelectQueryMSQL($stmt1); // $dbcontroller->closeQuerySQL(); // requête de mise à jour $update_query = "UPDATE dossiers SET dossiers.level = users.level INNER JOIN users ON dossiers.ipn_dos = users.ipnl"; $stmt_update = mysqli_query($dbcontroller->getConn(), $update_query); $data1 = $dbcontroller->executeQueryMSQL($stmt_update); // Vérification si la requête de mise à jour a échoué if (!$stmt_update) { die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn())); } //requête de sélection $select_query = 'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, users.level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'; $stmt_select = mysqli_query($dbcontroller->getConn(), $select_query); $data1 = $dbcontroller->executeSelectQueryMSQL($stmt_select); $dbcontroller->closeQuerySQL(); if ($data1 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data1); } else { $result = "Erreur : résultat vide."; }
30 mars 2023 à 16:26
Sachant que tu fais des mysqli_query .... je ne vois pas ce que vient faire là ton controller db ....
Pour moi, le $stmt devrait être le résultat d'un prepare et non d'un mysqli_query (qui execute déjà la requête ! )
$stmt = $mysqli->prepare("ta requete sql");
30 mars 2023 à 16:51
Je m'en suis rendu compte apres avoir posté.
J'ai donc modifié cela pour au final avoir la meme erreur.
Mais j'ai trouvé une piste. Il s'agirait du fait que mysqli ne supporte pas les parametres mais plutot les '?' accompagnés d'un bind_param. J'ai donc remodifié mon code pour obtenir ce que j'ai là :
$stmt1 = mysqli_prepare($dbcontroller->getConn(),"UPDATE dossiers INNER JOIN users ON dossiers.ipn_dos = ? SET dossiers.level = ?"); mysqli_stmt_bind_param($stmt1, 'si', users.ipn, users.level); $data1 = $dbcontroller->executeQueryMSQL($stmt1); // Vérification si la requête de mise à jour a échoué if (!$stmt1) { die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn())); } //requête de sélection $stmt2 = mysqli_prepare($dbcontroller->getConn(),'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, users.level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'); $data2 = $dbcontroller->executeSelectQueryMSQL($stmt_select); $dbcontroller->closeQuerySQL(); if ($data2 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data2); } else { $result = "Erreur : résultat vide."; }
Je dois juste trouver la manière de declarer 'users.ipn' qui est censé relier mes 2 tables et 'users.level' qui correspondent aux 2 colonnes qui ont les valeurs qui m'interessent . Et je bloque sur ça
30 mars 2023 à 16:55
Alors non, tu dois laisser ta jointure comme elle était avant. pas besoin de paramètre.
Par contre .. est-il necessaire de faire une jointure pour ton update ?
A noter qu'il te manque également un where dans ta requête.... là tu vas modifier toutes les entrées de la table.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question30 mars 2023 à 20:15
J'ai besoin d'une jointure car je veux que la valeur de la colonne level de ma table dossiers (initialement à NULL) prenne la valeur de la colonne level dans la table users. Comme ca apres je pourrais gerer l'affichage de mes boutons en javascript en fonction du level de l'utilisateur. Je vais voir ce que je peux faire pour le WHERE et je remet l'ancienne requete. Je teste et je reviens vers vous. Merci beaucoup
30 mars 2023 à 20:29
Je refais ma requete comme ci-joint et j'ai toujours la meme erreur :(
function afficherDossiers() {
$ipn = $_SESSION['ipn2'];
$dbcontroller = new DBController();
$stmt1 = mysqli_prepare($dbcontroller->getConn(),"UPDATE dossiers SET dossiers.level = users.level INNER JOIN users ON dossiers.ipn_dos = users.ipn WHERE id_dos = $ipn");
// mysqli_stmt_bind_param($stmt1, 's', $ipn);
$data1 = $dbcontroller->executeQueryMSQL($stmt1);
// Vérification si la requête de mise à jour a échoué
if (!$stmt1) {
die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn()));
}
//requête de sélection
$stmt2 = mysqli_prepare($dbcontroller->getConn(),'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, users.level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC');
$data2 = $dbcontroller->executeSelectQueryMSQL($stmt_select);
$dbcontroller->closeQuerySQL();
if ($data2 != "Aucune donnée à afficher !") {
$result = $this->utf8_converter($data2);
} else {
$result = "Erreur : résultat vide.";
}
}
ob_clean();
return json_encode($result);
}
31 mars 2023 à 09:38
J'ai modifié ma requete et j'ai reussi à avancer. Maintenant l'erreur est la meme mais au niveau de ma 2ème requete. je le sais car c'est la meme erreur mais ligne 33 de mon DBController, or cela correspond au "executeSelectQueryMSQL" utilisé dans ma deuxième requete. Voici mon code :
$stmt1 = mysqli_prepare($dbcontroller->getConn(),"UPDATE dossiers INNER JOIN users ON dossiers.ipn_dos = users.ipn SET dossiers.level = users.level WHERE ipn_dos = ?"); mysqli_stmt_bind_param($stmt3, 's', $paramIpn); $data1 = $dbcontroller->executeQueryMSQL($stmt1); // Vérification si la requête de mise à jour a échoué if (!$stmt1) { die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn())); } //requête de sélection $stmt2 = mysqli_prepare($dbcontroller->getConn(),'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, users.level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'); $data2 = $dbcontroller->executeSelectQueryMSQL($stmt2); $dbcontroller->closeQuerySQL(); if ($data2 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data2); } else { $result = "Erreur : résultat vide."; }
Si vous avez une idée de ce que je peux changer, en attendant je continue sur cette piste
Bonjour,
Curieux de mélanger la syntaxe procédurale et la syntaxe objet pour l'utilisation de mysqli, il serait mieux de choisir et d'utiliser une seule syntaxe même si ca n'empêche pas le fonctionnement du code.
Ton précédent message d'erreur indique que la requête sql préparée est incorrecte. Il faut réaliser ton test if ($stmt1) { die(...); } avant l'exécution de la requête pour voir le message d'erreur sql à la place de l'erreur "call to a member function exetute() on bool".
L'affichage des messages d'erreurs sql n'est pas recommandé pour un site en ligne. En développement, au lieu d'utiliser die() et mysqli_error(), tu peux activer le rapport d'erreur de mysqli : https://www.php.net/manual/fr/mysqli-driver.report-mode.php
31 mars 2023 à 10:57
Bonjour à tous,
Apres plusieurs modifications, j'y suis arrivé! Vous allez me detester mais l'erreur venait une colonne quin'existait pas dans ma déclaration. Voici le code final :
function afficherDossiers() { $ipn = $_SESSION['ipn2']; $dbcontroller = new DBController(); $paramIpn = mysqli_escape_string($dbcontroller->getConn(), $ipn); $stmt3 = mysqli_prepare($dbcontroller->getConn(), "SELECT ipn FROM users WHERE ipn = ?"); mysqli_stmt_bind_param($stmt3, 's', $paramIpn); $data3 = $dbcontroller->executeSelectQueryMSQL($stmt3); if($data3=="Aucune donnée à afficher !"){ $dbcontroller = new DBController(); $stmt1 = mysqli_prepare($dbcontroller->getConn(), "SELECT id_rec, DATE_FORMAT(date_dos, '%d/%m/%Y') as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, cadeaux.id, level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE ipn_dos IS NOT NULL AND dossiers.status != '04' ORDER BY date_dos DESC"); $data1 = $dbcontroller->executeSelectQueryMSQL($stmt1); $dbcontroller->closeQuerySQL(); if ($data1 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data1); } else { $result = "Erreur : résultat vide."; } }else{ //Une requete qui update le level de l'utilisateur si celui ci est trouvé dans la bdd $dbcontroller = new DBController(); //VERSION QUI MARCHE // $stmt1 = mysqli_prepare($dbcontroller->getConn(), 'SELECT id_rec, DATE_FORMAT(date_dos, "%d/%m/%Y") as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != "04" ORDER BY date_dos DESC'); // $data1 = $dbcontroller->executeSelectQueryMSQL($stmt1); // $dbcontroller->closeQuerySQL(); // requête de mise à jour $stmt1 = mysqli_prepare($dbcontroller->getConn(),"UPDATE dossiers INNER JOIN users ON dossiers.ipn_dos = users.ipn SET dossiers.level = users.level WHERE ipn_dos = ?"); mysqli_stmt_bind_param($stmt1, 's', $paramIpn); $data1 = $dbcontroller->executeQueryMSQL($stmt1); // Vérification si la requête de mise à jour a échoué if (!$stmt1) { die('Erreur de mise à jour: ' . mysqli_error($dbcontroller->getConn())); } //requête de sélection $stmt2 = mysqli_prepare($dbcontroller->getConn(),"SELECT id_rec, DATE_FORMAT(date_dos, '%d/%m/%Y') as date_dos1, type_dos, ipn_dos, nom_dos, nom_can, motif_dos, dossiers.status, kdo_code, cadeaux.libelle, level FROM dossiers INNER JOIN cadeaux ON cadeaux.id = kdo_code WHERE dossiers.status != '04' ORDER BY date_dos DESC"); $data2 = $dbcontroller->executeSelectQueryMSQL($stmt2); $dbcontroller->closeQuerySQL(); if ($data2 != "Aucune donnée à afficher !") { $result = $this->utf8_converter($data2); } else { $result = "Erreur : résultat vide."; } } ob_clean(); return json_encode($result); }
Je vais retirer le message d'erreur sous les conseils de Pitet.
La il ne me reste plus qu'à aller dans le Js pour recuperer le level du users et filtrer la vue des boutons en fonction du level.
Merci