Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/01/2012, 01h12   #1
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
Par défaut PDO PHP-POO et requêtes préparées

Bonjour à vous,
J'ai pas mal cherché mais je n'arrive décidement pas à me servir des requêtes préparées avec PDO en prog. objet.
Je débute tout juste avec la POO et je tatonne un peu...
Voici ma classe de connexion :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
class BD
{
	private static $conn;
        private $PDOInstance = null;
 
        const DEFAULT_SQL_USER = 'root';
        const DEFAULT_SQL_HOST = 'localhost';
        const DEFAULT_SQL_PASS = '';
        const DEFAULT_SQL_DTB = 'reseaubeaute';
 
 
	private function __construct()
    {
                $this->PDOInstance = new PDO ('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST, self::DEFAULT_SQL_USER, self::DEFAULT_SQL_PASS);
    }
 
 
	public static function getConnexion()
    {
		if(is_null(self::$conn))
                {
			self::$conn = new BD();
		}
		return self::$conn;
	}
 
	public function query($query)
	{
		return $this->PDOInstance->query($query);
	}
 
	public function prepare($prepare)
	{
		return $this->PDOInstance->prepare($prepare);
	}
 
	public function exec($exec)
	{
		return $this->PDOInstance->exec($exec);
	}
 
}
et ma petite classe ou je me sers de PDO :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
<?php
class MyClass
{
	public function maFonction($m_var)
	{
		$sql = "SELECT  * FROM codes_postaux WHERE id =".$m_var."";
		 $requete = BD::getConnexion()->query($sql);
		$data = $requete->fetch();
		return $data['ville'];
	}
 
	public function liste()
	{
		$sql = "SELECT * FROM codes_postaux ORDER BY id DESC LIMIT 30 ";
		return BD::getConnexion()->query($sql);
	}
 
	public function queryPrepare($maVar)
	{
 
		$sql = "SELECT  * FROM codes_postaux WHERE  id = ?";
		$requete = BD::getConnexion();
		$requete->prepare($sql);
		return $requete->exec(array($maVar));
 
	}
 
	public function deleteVille($numVille)
	{
		$sql = "DELETE * FROM codes_postaux WHERE id=".$numVille."";
		$requete=BD::getConnexion()->exec($sql);
	}
}
?>
Donc forcement les fonctions queryPrepare et deleteVille ne fonctionnent pas, c'est surtout parce que je ne comprends pas comment se servir de ces fameuses requêtes préparées...

mon fichier index.php où je me sers de ma classe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php
	require('BD.class.php');
	require('maClasse.php');
 
	$m_class = new MyClass();
 
 
 
	echo $m_class->maFonction(333333);
	$m_class->deleteVille(333333);
 
?>
Bien cordialement,

Jérôme.
distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 02h30   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
normal, quand tu fais appel à ta méthode de class :
elle ne te retourne pas directement une connexion mais une instance de ton objet de type BD qui lui contient un attribut '$PDOInstance' contenant la connexion, donc tu devrais faire :
Code :
$requete = BD::getConnexion()->PDOInstance->query($sql);
or ton attribut '$PDOInstance' étant privé, je doute fort que tu puisse y acceder mais si tu le mets en public ça passe.
Maintenant la question que je me pose c'est :
ta class c'est une tentative de singleton raté...?! à quoi elle sert ?!
en plus ta requete :
Code :
1
2
3
4
5
	public function deleteVille($numVille)
	{
		$sql = "DELETE * FROM codes_postaux WHERE id=".$numVille."";
		$requete=BD::getConnexion()->exec($sql);
	}
est fausse enlève le joker (*)
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 09h16   #3
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
Ok, merci pour ton aide !
Oui ça doit être une tentative de singleton raté (involontaire), à vrai dire, je ne sais même pas ce qu'est un singleton...

C'était juste une classe dont je pourrais me resservir pour me connecter aux bdd dans mes classes...

Donc si je veux faire une requête préparé, je dois faire ça ?

Code :
1
2
3
 
$requete = BD::getConnexion()->PDOInstance->prepare($sql);
$requete->exec($maVar);
Bien cordialement,
J.
distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 14h14   #4
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
Désolé pour la critique...
Le singleton est un design pattern qui te permet d'instancier qu'un seul objet de ta class, dans le constructeur tu vérifies si ton attribut de classe pointe vers l'instance de l'objet : si c'est le cas tu renvois cette attribut sinon tu instancies l'objet.
Pour répondre à ta question : ça doit être bon pour la requête préparé.
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 15h46   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
pourquoi tu fais pas des requêtes préparées partout ? la t'es soumis aux injections
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 19h04   #6
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
Merci pour vos réponses !

distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h18.


 
 
 
 
Partenaires

Hébergement Web