- Afficher résultat requête sql php pdo
- Easy php - Télécharger - Divers Web & Internet
- Lexer resultat - Télécharger - Sport
- Afficher appdata - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Afficher mot de passe wifi android - Guide
4 réponses
6 déc. 2022 à 21:44
Bonjour,
Déjà, certains messages d'erreurs sont assez explicits pour que tu puisse les résoudre toi même je pense.
Ensuite, sans avoir le code complet, impossible pour nous de savoir à quoi font références les lignes d'erreurs indiquées dans les messages.
Et encore, tu parles de deux "bases" .. alors que j'ai plutôt l'impression qu'il s'agit de deux "tables". ( et dans ce cas, ne connais tu pas les jointures en sql ? )
bref, Difficile également de savoir comment fonctionnement ton code. Tu utilises un framework ou c'est un "truc" codé entièrement par toi ?
Bref, commences par nous poster le code COMPLET de tes différents fichiers.
Bonjour,
En fait j'ai vu sur d'autres forum qu'il fallait éviter de mettre trop de code du coup j'ai mis le minimum.
Et oui je parlais de table mais j'aimerais éviter de créer une clé étrangère ce n'est pas ma bdd.
J'suis en php from scratch.
Mon userManager là où je créer mes fonctions qui me permettent d'afficher mes infos, CRUD en bdd etc... (j'ai raccourcis le fichiers car pas besoin de voir toutes mes fonctions qui contient juste un échantillon devrait suffire :
<?php use LDAP\Result; require_once 'Model.class.php'; require_once 'User.class.php'; class UserManager extends Model { private $user; //Tableau de vdc public function ajoutUser($user) { $this->users[] = $user; } public function getUser() { return $this->users; } // Fonction qui charge tous les utilisateurs de la bdd. public function chargementUsers() { $req = $this->getBdd()->prepare( 'SELECT id, login,password, mail, admin FROM user' ); $req->execute(); $donnees = $req->fetchAll(PDO::FETCH_ASSOC); $req->closeCursor(); if (!empty($donnees)) { foreach ($donnees as $donnees_users) { $q = new User( $donnees_users['id'], $donnees_users['login'], $donnees_users['password'], $donnees_users['mail'], $donnees_users['admin'] ); $this->ajoutUser($q); } } else { Toolbox::ajouterMessageAlerte("Echec du chargement des utilisateurs - Code erreur : #UM01", Toolbox::COULEUR_ROUGE); header('Location: ' . URL, "X-XSS-Protection: 1; mode=block"); } } // Fonction pour un utilisateur en fonction de son id public function getUserById($id) { for ($i = 0; $i < count($this->users); $i++) { if ($this->users[$i]->getId() === $id) { return $this->users[$i]; } } } // Fonction pour cherche le mot de passe d'un utilisateur en fonction de son login private function getPasswordUser($login) { $req = "SELECT password FROM user WHERE login = :login"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat != false) { return $resultat['password']; } else { //à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec de la requête", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Echec de la requête - Code erreur: #UM03", Toolbox::COULEUR_ROUGE); header("location: " . URL, "X-XSS-Protection: 1; mode=block"); } } public function isCombinaisonValide($login, $password) { $passwordBD = $this->getPasswordUser($login); // Code erreur: #UM04 if (password_verify($password, $passwordBD)) { return true; } else { // à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec lors de la connexion", Toolbox::COULEUR_ROUGE); //Toolbox::ajouterMessageAlerte("Echec de la comparaison - Code erreur: #UM04", Toolbox::COULEUR_ROUGE); return false; } } // Fonction qui ajoute un utilisateur à la bdd public function ajoutUserBd( $login, $password, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ) { $login = htmlspecialchars($login, ENT_QUOTES, 'UTF-8'); $mail = htmlspecialchars($mail, ENT_QUOTES, 'UTF-8'); $NomPrenom = htmlspecialchars($NomPrenom, ENT_QUOTES, 'UTF-8'); $password = htmlspecialchars($password, ENT_QUOTES, 'UTF-8'); $password = password_hash($password, PASSWORD_DEFAULT); if(verifier_token(300, URL . 'users/create', 'create_user')) { $req = "INSERT INTO user(login, password, mail, admin, bl, dist, NomPrenom, demandevalidation, pilote, rs) VALUES(:login, :password, :mail, :admin, :NomPrenom)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":password", $password, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin, PDO::PARAM_INT); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); if ($resultat > 0) { $user = new User( $this->getBdd()->lastInsertId(), $login, $password, $mail, $admin, $NomPrenom ); $this->ajoutUser($user); Toolbox::ajouterMessageAlerte("Ajout de l'utilisateur réussi", Toolbox::COULEUR_VERTE); header('Location: ' . URL . "users", "X-XSS-Protection: 1; mode=block"); } else { Toolbox::ajouterMessageAlerte("Echec de l'ajout d'un utilisateur - Code erreur: #UM05", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/create", "X-XSS-Protection: 1; mode=block"); } } else { Toolbox::ajouterMessageAlerte("Le formulaire a expiré veuillez recharger la page et réessayer", Toolbox::COULEUR_ROUGE); header("location: " . URL . "users/create", "X-XSS-Protection: 1; mode=block"); } } public function getListeDiffusion($mail) { $req = "SELECT nom FROM `mail` WHERE mail_to LIKE "%". :mail ."%""; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->execute(); $ListeDiffusion = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); return $ListeDiffusion; } // Fonction de la modification d'un utilisateur public function modificationUserBd( $id, $login, $mail, $admin, $NomPrenom ) { $ListeDiffusion = getListeDiffusion($mail); $login = htmlspecialchars($login, ENT_QUOTES, 'UTF-8'); $mail = htmlspecialchars($mail, ENT_QUOTES, 'UTF-8'); $NomPrenom = htmlspecialchars($NomPrenom, ENT_QUOTES, 'UTF-8'); if(verifier_token(300, URL . 'users/update/' . $id, 'update_user')) { $req = "UPDATE user set login = :login, mail = :mail, admin = :admin, NomPrenom = :NomPrenom WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin, PDO::PARAM_INT); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); if ($resultat > 0) { $this->getUserById($id)->setLogin($login); $this->getUserById($id)->setMail($mail); $this->getUserById($id)->setAdmin($admin); $this->getUserById($id)->setNomPrenom($NomPrenom); Toolbox::ajouterMessageAlerte("La modification a été effectuée avec succès", Toolbox::COULEUR_VERTE); header('Location: ' . URL . "users", "X-XSS-Protection: 1; mode=block"); } } else { Toolbox::ajouterMessageAlerte("Le formulaire a expiré veuillez recharger la page et réessayer", Toolbox::COULEUR_ROUGE); header("location: " . URL . "users", "X-XSS-Protection: 1; mode=block"); } }
Mon userController pareil un échantillon, c'est ici que j'appelle les fonctions de mon Manager :
<?php require_once "models/UserManager.class.php"; require_once 'models/Model.class.php'; // Connexion à la BDD class UserController extends Model { public $userManager; public function __construct() { $this->userManager = new UserManager; $this->userManager->chargementUsers(); } public function afficherUsers() { $users = $this->userManager->getUser(); require "views/user/users.view.php"; } public function modificationUser($id) { $user = $this->userManager->getUserById($id); require "views/user/updateUser.view.php"; } public function ajoutUser() { require "views/user/createUser.view.php"; } public function motDePasseOublie() { require "views/motDePasseOublie.view.php"; } public function ajoutuserValidation() { if (isset($_POST['admin'])){ if ($_POST['admin'] === 'on') $_POST['admin'] = 1; } else{ $_POST['admin'] = 0; } $password = $_POST['password']; if (preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@€\[$\]!?_-]).{12,}$#', $password)){ if ($_POST['password'] === $_POST['passwordverif']) { $this->userManager->ajoutUserBd( $_POST['login'], $_POST['password'], $_POST['mail'], $_POST['admin'], $_POST['NomPrenom'] ); //header('Location: ' . URL . "users", "X-XSS-Protection: 1; mode=block"); } else { Toolbox::ajouterMessageAlerte("Les mots de passe ne sont pas les mêmes", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/create", "X-XSS-Protection: 1; mode=block"); } } else{ Toolbox::ajouterMessageAlerte("Le mot de passe doit contenir au moins une majuscule, une minuscule, un chiffre, un caractère spéciale de cette liste (€,[,?,],!,$,@,-,_) et doit comporter au moins 12 caractères", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/create", "X-XSS-Protection: 1; mode=block"); } } public function modificationUserValidation() { if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } $this->userManager->modificationUserBd( $_POST['id'], $_POST['login'], $_POST['mail'], $_POST['admin'], $_POST['NomPrenom'] ); // Toolbox::ajouterMessageAlerte("La modification a été effectuée avec succès", Toolbox::COULEUR_VERTE); // header('Location: ' . URL . "users", "X-XSS-Protection: 1; mode=block"); }
Ma class user :
<?php
class User {
private $id;
private $login;
private $password;
private $mail;
private $admin;
public function __construct(
$id,
$login,
$password,
$mail,
$admin,
$NomPrenom
) {
$this->id = $id;
$this->login = $login;
$this->password = $password;
$this->mail = $mail;
$this->admin = $admin;
$this->NomPrenom = $NomPrenom;
}
public function getId(){return $this->id;}
public function setId($id){$this->id = $id;}
public function getLogin(){return $this->login;}
public function setLogin($login){$this->login = $login;}
public function getPassword(){return $this->password;}
public function setPassword($password){$this->password = $password;}
public function getMail(){return $this->mail;}
public function setMail($mail){$this->mail = $mail;}
public function getAdmin(){return $this->admin;}
public function setAdmin($admin){$this->admin = $admin;}
public function getNomPrenom(){return $this->NomPrenom;}
public function setNomPrenom($NomPrenom){$this->NomPrenom = $NomPrenom;}
}
Et la vue de update user, l'affichage :
<?php ob_start(); $token = generer_token('update_user'); ?> <form method="POST" action="<?= URL ?>users/updateValid"> <div class="row"> <div class="form-group col-6"> <label for="type_alerte">Login</label> <input type="text" class="form-control" name="login" id="login" placeholder="" value="<?= $user->getLogin() ?>"> </div> <div class="form-group col-6"> <label for="dates_heures_alarme">Mail</label> <input type="text" class="form-control" name="mail" id="mail" placeholder="" value="<?= $user->getMail() ?>"> </div> </div> <div class="row"> <div class="form-group col-6"> <label for="type_alerte">Nom et Prénom</label> <input type="text" class="form-control" name="NomPrenom" id="NomPrenom" placeholder="" value="<?= $user->getNomPrenom() ?>"> </div> <div class="form-check form-check-inline"> <input class="form-check-input " type="checkbox" id="defaultCheck1" name="admin" <?php if ($user->getAdmin() == '1') { echo 'checked'; } ?>> <label class="form-check-label" for="defaultCheck1"> ADMIN </label> </div> <div class="form-check form-check-inline"> <input class="form-check-input " type="checkbox" id="defaultCheck1" name="demandevalidation" <?php if ($user->getDemandeValidation() == '1') { echo 'checked'; } ?>> <p><strong>Liste de diffusion :</strong> <?= UserManager::getListeDiffusion($mail); ?></p> <input type="hidden" name="id" value="<?= $user->getId(); ?>"> <div class="form-group col-md-6"> <br> <button type="submit" class="btn btn-primary bouton border-0" id="baseN2" data-mdb-ripple-color="dark" data-bs-toggle="modal" data-bs-target="#referencer">Modifier</button> <a href="<?= URL ?>users" class="btn btn-primary bouton border-0" id="vdcsolo">Annuler</a> </div> </div> <input type="hidden" name="token" id="token" value="<?php echo $token; ?>"/> </form> <?php $content = ob_get_clean(); $titre = "Modification de l'utilisateur " . $user->getLogin(); require "views/template.php"; ?>
Voilà à peu près tout mon code qui concerne cette feature
7 déc. 2022 à 10:22
Et oui je parlais de table mais j'aimerais éviter de créer une clé étrangère ce n'est pas ma bdd.
Il n'est pas obligatoire de créer une foreign key pour pouvoir faire une jointure dans une requête SQL ...
Ensuite, Je ne suis pas certain que ton code soit des plus optimisé ... je ne sais pas si tu es en cours et que c'est un prof qui t'a demandé de faire comme ça... mais niveau performances c'est moyen.
Par exemple, pour récupérer un user via son ID .. tu charges tous tes users en mémoire et tu boucles dessus pour trouver celui qui t'interesse.
Si tu n'as qu'un poignée de users ..ça passe .. mais si tu en as plusieurs milliers/millions... ça commence à faire beaucoup de tours dans la boucle pour rien ...
L'idéal est directement de récupérer le user voulu via une simple requête SQL contenant un WHERE sur le champ voulu.
Requête à laquelle tu peux donc mettre un jointure ( même sans avoir déclaré de FK ) pour récupérer les informations voulues...
Je savais pas du tout pour les jointures sans fk, merci.
Oui je suis en alternance et je reprend le code de quelqu'un , ce n'est pas ma fonction on verra plus tard pour l'optimiser si tu veux bien j'aimerais réussir mon truc.
J'ai donc modifier ma requête sql et je l'ai mise dans une fonction dans mon userManager :
public function getListeDiffusion($mail) { $mail = $_POST['mail']; $req = "SELECT DISTINCT(nom) FROM `mail` JOIN user WHERE mail_to LIKE "%". $mail ."%";"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->execute(); $ListeDiffusion = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); return $ListeDiffusion; }
Et j'ai ajouté ça dans mon Controller :
public function ListeDiffusionUser($mail){
$user = $this->userManager->getListeDiffusion();
require "views/user/updateUser.view.php";
}
Et ma vue :
<p><strong>Liste de diffusion :</strong> <?= var_dump($user->ListeDiffusionUser($mail)); ?></p>
Ça ne fonctionne donc tjr pas et me retourne cette erreur :
Liste de diffusion :
Fatal error: Uncaught Error: Call to undefined method User::ListeDiffusionUser() in C:\Applications\wamp64\www\portail\views\user\updateUser.view.php:71 Stack trace: #0 C:\Applications\wamp64\www\portail\controllers\UserController.controller.php(26): require() #1 C:\Applications\wamp64\www\portail\index.php(137): UserController->modificationUser('81') #2 {main} thrown in C:\Applications\wamp64\www\portail\views\user\updateUser.view.php on line 71
Je ne comprend pas pourquoi il n'a pas accès à ma méthode ListeDiffusionUser().
En attendant une réponse je vais regarder pour optimiser le bout de code que tu m'as dit.
7 déc. 2022 à 20:38
Ta variable $user contient quoi ?
Il me semble qu'elle fait déjà référence à :
$user = $this->userManager->getListeDiffusion();
Fonction qui, normalement attend un paramètre ( $mail ) que tu ne lui transmets pas ??
Maintenant deux questions :
Es tu sûr de passer par ta fonction
ListeDiffusionUser
de ton controller ??
Et pourquoi ne pas avoir modifié ( la jointure) au niveau de ta class USER et ainsi la récupérer directement dans la page lorsque tu fais
$users = $this->userManager->getUser();
8 déc. 2022 à 09:28
$user contient un array d'un user, var_dump($user):
object(User)#7350 (11) { ["id":"User":private]=> string(3) "111" ["login":"User":private]=> string(8) "AAAA2727" ["password":"User":private]=> string(60) "$2y$10$dgzXSMJ7p"...
Ça représente tous les enregistrement de ma table user pour mon user sélectionné ici l'user avec l'id 111 par exemple.
J'ai ajouté $mail dans l'appel de ma fonction getListeDiffusion() dans mon Controller :
public function ListeDiffusionUser($mail){ $user = $this->userManager->getListeDiffusion($mail); require "views/user/updateUser.view.php"; }
Mais même erreur plus avec un bug d'affichage (genre sans css)
Nan j'suis pas sûr de passer par la fonction
ListeDiffusionUser
J'avais essayé aussi au niveau de ma classe d'ajouter un getListeDiffusion mais ça ne va pas:
<?php class User { private $id; private $login; private $password; private $mail; private $admin; private $NomPrenom; private $listeDiffusion; public function __construct( $id, $login, $password, $mail, $admin, $NomPrenom, $listeDiffusion ) { $this->id = $id; $this->login = $login; $this->password = $password; $this->mail = $mail; $this->admin = $admin; $this->NomPrenom = $NomPrenom; $this->listeDiffusion = $listeDiffusion; } public function getListeDiffusion(){return $this->$listeDiffusion;} public function getId(){return $this->id;} public function setId($id){$this->id = $id;} public function getLogin(){return $this->login;} public function setLogin($login){$this->login = $login;} public function getPassword(){return $this->password;} public function setPassword($password){$this->password = $password;} public function getMail(){return $this->mail;} public function setMail($mail){$this->mail = $mail;} public function getAdmin(){return $this->admin;} public function setAdmin($admin){$this->admin = $admin;} public function getNomPrenom(){return $this->NomPrenom;} public function setNomPrenom($NomPrenom){$this->NomPrenom = $NomPrenom;} }
Et ça me donne cette erreur :
Fatal error: Uncaught ArgumentCountError: Too few arguments to function User::__construct(), 11 passed in C:\Applications\wamp64\www\portail\models\UserManager.class.php on line 47 and exactly 12 expected in C:\Applications\wamp64\www\portail\models\User.class.php:17 Stack trace: #0 C:\Applications\wamp64\www\portail\models\UserManager.class.php(47): User->__construct('5', 'AAAA1111', 'dda8gb7e809685...', 'test.mail@...', '1', '1', '1', 'nom prénom', '1', '1', '0') #1 C:\Applications\wamp64\www\portail\controllers\UserController.controller.php(12): UserManager->chargementUsers() #2 C:\Applications\wamp64\www\portail\index.php(102): UserController->__construct() #3 {main} thrown in C:\Applications\wamp64\www\portail\models\User.class.php on line 17
Si tu te demande d'où vienne les 1 et les 0 dans l'erreur ça correspond à des rôles qui sont bien instancier comme Admin par exmple dans la class user juste je les enlèves quand je vous envois mon code pour le raccourcir
7 déc. 2022 à 14:39
Salut,
Je savais pas du tout pour les jointures sans fk, merci.
C'est généralement un truc qu'on cache aux utilisateurs débutants car ils nous font très rapidement des requêtes qui se transforment en produit cartésien et nous mettent les machines à genoux...