[RESOLU] PDO execute() requête SQL comportement inattendu

Petit nouveau ! | 2 Messages

30 avr. 2023, 23:18

Bonjour/bonsoir à vous,

Désolé pour ce titre confus, je ne savais pas exactement comment décrire mon problème en une phrase.
En gros, je compte faire une interface pour modifier les informations personnels de l'utilisateur se connectant à son compte sur mon site.
Dans cette optique je dois au préalable récupérer ces info pour les lui afficher, ces info sont dans ma base de donnée dans un tableau :

Code : Tout sélectionner

<?php class Bdd { /* * * Ellipse attributs et d'autres méthodes * */ protected function getConnexion() { // Retourne une instance de connexion à la base if (!isset($this->connexion)) { // Le dsn contient les informations (sorte de chemin) pour se connecter à la base $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbName . ';port=' . $this->port; // Créé une instance de connexion à la base, les enregistrements sont récupérés sous la forme d'un objet $this->connexion = new PDO($dsn, $this->username, $this->password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ ]); } return $this->connexion; } protected function setTable($table) { $this->table = $this->dbName . '.' . $table; } protected function getTable() { return $this->table; } ?>

Code : Tout sélectionner

<?php class Evaluateurs extends Bdd { /* * * Attributs * */ public function __construct(){ $this->setTable('evaluateurs'); } /* * * Ellipse d'autres méthodes * */ public function getData($data_name, $id){ /* // Méthode 1 : $prepare = 'SELECT :data_name FROM ' . $this->getTable() . ' WHERE id = :id'; $execute = [ 'data_name' => $data_name, 'id' => $id ]; // Méthode 2 : $prepare = 'SELECT ' . $data_name . ' FROM ' . $this->getTable() . ' WHERE id = :id'; $execute = [ // 'data_name' => $data_name, 'id' => $id ]; */ $requete = $this->getConnexion()->prepare($prepare); $requete->execute($execute); return $requete->fetch()->$data_name; } } ?>

Code : Tout sélectionner

<?php class Evaluateur extends Evaluateurs { public function __construct($email){ $this->setTable('evaluateurs'); $this->setId($email); } public function setId($email){ if(!isset($this->id)){ $prepare = 'SELECT id FROM ' . $this->getTable() . ' WHERE email = :email'; $execute = [ 'email' => $email ]; $requete = $this->getConnexion()->prepare($prepare); $requete->execute($execute); $this->id = $requete->fetch()->id; } } public function getId(){ return $this->id; } public function getFirstName($id) { $this->first_name = $this->getData('first_name', $id); return $this->first_name; } public function getLastName($id) { $this->last_name = $this->getData('last_name', $id); return $this->last_name; } }
C'est dans la méthode getData() que j'ai le problème. Selon que j'utilise la méthode 1 ou la 2 je n'obtiens pas le même résultat.
- La première méthode va me renvoyer pour le "first name" : first_name, pour le "last name" : last_name, l'email : email, etc..
- La deuxième va bien me renvoyer ce que je veux (le contenu la cellule visée).

Ma question est : pourquoi donc?
Si ça se trouve il y a une erreur bête mais je bloque dessus et je ne trouve pas...

Je vous remercie d'avance ! :mrgreen:

Mammouth du PHP | 2703 Messages

30 avr. 2023, 23:29

select 'toto' from table
et
select toto from table
ne retourne pas la même chose, dans le 1er cas, on a une chaine donc cela retournera toujours la valeur de la chaine. dans le second cas, on a le nom d'un champ.

à noter, si je veux le nom et prénom, que 2 requêtes select sont exécutées, c'est une de trop si l'on veux avoir un code qui utilise les ressources à bon escient.

Petit nouveau ! | 2 Messages

01 mai 2023, 00:07

select 'toto' from table
et
select toto from table
ne retourne pas la même chose, dans le 1er cas, on a une chaine donc cela retournera toujours la valeur de la chaine. dans le second cas, on a le nom d'un champ.
Logique.. C'est ce que je me disais mais je suis encore plus bête que je ne le pensais, en gros je me demandais quelle était la différence entre les deux car dans les deux cas la variables est la même sauf que l'une est concaténée et l'autre directement mise dans la requête. Est-ce que vous connaîtriez une méthode pour que les paramètres de prepare ne prennent pas les guillemets? Je vais regarder de mon côté en même temps.
à noter, si je veux le nom et prénom, que 2 requêtes select sont exécutées, c'est une de trop si l'on veux avoir un code qui utilise les ressources à bon escient.

Merci, c'est bon à savoir. Je vais adapter mon code.

Edit, que pensez-vous de cela :

Code : Tout sélectionner

<?php class Evaluateurs extends Bdd { /* * Ellipse */ public function getDatas($id){ $prepare = 'SELECT * FROM ' . $this->getTable() . ' WHERE id = :id'; $execute = [ 'id' => $id ]; $requete = $this->getConnexion()->prepare($prepare); $requete->execute($execute); return $requete->fetch(); } /* * Ellipse */ ?>

Code : Tout sélectionner

<?php class Evaluateur extends Evaluateurs { /* * Ellipse */ public function getFirstName($datas) { return $datas->first_name; } /* * Ellipse */ } ?>