IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Class PDO et requetes prepare()


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Points : 49
    Points
    49
    Par défaut Class PDO et requetes prepare()
    Bonsoir à tous,

    J'ai écrit une classe mysql pour se connecter à une table (base Mysql) et retourner une liste de pages. Je précise que je débute en POO.
    Voici l'erreur que je rencontre :

    Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\test\pdo\class_mysql.php on line 55
    Merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    <?php
    require_once 'config.php'; // constantes
    require_once 'class_mysql.php';
     
    $db = new Mysql();
    $listesPages = $db->returnListe(
    	array(
    		"table" => pages,
    		"id,titre"
    	)
    );
     
     
     
    class Mysql {
     
    	protected $connect;
    	protected $host;
    	protected $db;
    	protected $login;
    	protected $password;
     
    	public function __construct(){
    		$this->setHost(DB_HOST);
    		$this->setDb(DB);
    		$this->setLogin(DB_LOGIN);
    		$this->setPassword(DB_PASSWORD);
    	}
     
     
    	/*
    	 * fonction qui se connecte à un serveur et une db Mysql
    	 * @host : serveur
    	 * @login : login de connexion
    	 * @password : mot de passe de connexion
    	 * $db : nom de la base
    	 */
    	protected function connectDb(){ 
    		try {
    			$db = new PDO('mysql:host='.$this->host.';dbname='.$this->db.'', ''.$this->login.'', ''.$this->password.'');
    			$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); // les noms de champs seront en caractères minuscules
    			$db->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION); // les erreurs lanceront des exceptions
    			$this->connect = $db;
    		}
    		catch (PDOException $e){
    			echo "Connection à la base de donnée impossible" . 
    			"<br/>" . $e->getMessage().
    			"<br/> LINE : " . $e->getLine();
    		}
    	}
     
     
    	/*
    	 * Fonction qui sélectionne une liste
    	 * @arrayReq : tableau pour construire une requête
    	 * @arrayReq['table'] = table à sélectionnée
    	 * @arrayReq['fiels'] = champs à sélectionner, tous les champs si vide
    	 * @arrayReq['condition'] = condition après le where sans le WHERE
    	 */
    	public function returnListe($arrayReq){
     
    		$conx = $this->connectDb();
    		$table = $arrayReq['table'];
    		$fields = (!isset($arrayReq['fiels'])) ? '*' : $arrayReq['fiels'];
    		$condition = (!isset($arrayReq['condition'])) ? '' : 'WHERE' . $arrayReq['condition'];
     
    		$select = $conx->prepare('SELECT '.$fields.' FROM '.$table.''.$condition.'');
    		$select->execute();
    		$return = $select->fetchAll();
    		return $return;
    	}
     
    	// Sets
    	protected function setHost($host){
    		$this->host = $host;
    	}
    	protected function setLogin($login){
    		$this->login = $login;
    	}
    	protected function setPassword($password){
    		$this->password = $password;
    	}
    	protected function setDb($db){
    		$this->db = $bd;
    	}
     
    	// gets
    	public function getConnect(){
    		return $this->connect;	
    	}
     
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ta fonction connectDb() ne retourne rien donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $conx = $this->connectDb();
    ne fait rien.

    Tu peux écrire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = $this->connect->prepare(blablabla)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Points : 49
    Points
    49
    Par défaut
    Bonjour et merci pour votre réponse

    Est-ce correct si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->connect; dans ma fonction connectDb()
    Ensuite dans ma fonction returnListe() est-ce que je peux ecrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = $this->connect->prepare('SELECT '.$fields.' FROM '.$table.''.$condition.'');
    ou directement sans m'occuper du retour de la fonction connectDb();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = $this->connect->prepare('SELECT '.$fields.' FROM '.$table.''.$condition.'');
    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Points : 49
    Points
    49
    Par défaut
    alors voici ma class modifiée et qui fonctionne :

    J'ai cependant une question :
    est-il plus judicieux d'avoir une class qui gère toutes les requetes ou une classe par type de requete.

    ex :
    une classe qui sélectionne les actualités
    une autre qui sélectionne les pages
    ...

    ou
    comme je l'ai fait une classe qui peut sélectionner n'importe quelle table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    $db = new Mysql();
    // sélection d'une liste
    $listesPages = $db->returnListe(
    	array(
    		"table" => pages,
    		"fields" => 'id,titre',
    		"condition" => ' tpl=:tpl ',
    		"varCondition" => 2
    	)
    );
     
     
    class Mysql extends Exception {
     
    	protected static $conx;
     
    	/*
    	 * fonction qui se connecte à un serveur et une db Mysql
    	 * @host : serveur
    	 * @login : login de connexion
    	 * @password : mot de passe de connexion
    	 * $db : nom de la base
    	 */
    	public static function connectDb(){ 
    		if(!isset($conx) || (empty($conx))){
    			try {
    				$conx = new PDO("mysql:host=".DB_HOST.";dbname=".DB."", DB_LOGIN, DB_PASSWORD);
    				$conx->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); // les noms de champs seront en caractères minuscules
    				$conx->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION); // les erreurs lanceront des exceptions
    			}
    			catch (PDOException $e){
    				echo "Connection à la base de donnée impossible" . 
    				"<br/>" . $e->getMessage().
    				"<br/> LINE : " . $e->getLine();
    			}
    		}
    		return $conx;
    	}
     
     
    	/*
    	 * Fonction qui sélectionne une liste
    	 * @arrayReq : tableau pour construire une requête
    	 * @arrayReq['table'] = table à sélectionnée
    	 * @arrayReq['fiels'] = champs à sélectionner, tous les champs si vide
    	 * @arrayReq['condition'] = condition après le where sans le WHERE
    	 */
    	public function returnListe($arrayReq){
     
    		$conx = $this->connectDb();
    		$table = $arrayReq['table'];
    		$fields = (!isset($arrayReq['fields'])) ? '*' : $arrayReq['fields'];
    		if(isset($arrayReq['condition'])){
    			$condition = 'WHERE' . $arrayReq['condition'];
    			$varCondition = $arrayReq['varCondition'];
    		}
    		$limit = (!isset($arrayReq['limit'])) ? '' : ' LIMIT '.$arrayReq['limit'];
    		$order = (!isset($arrayReq['order'])) ? '' : ' ORDER BY '.$arrayReq['order'];
     
    		$requete = $conx->prepare('SELECT '.$fields.' FROM '.$table.' '.$condition.' '.$order.' '.$limit.' ');
    		if($requete->execute(array("tpl"=>$varCondition))){
    			$return = $requete->fetchAll();
    			return $return;
    			$conx = null;
    		}else{
    			throw new Exception("Requête impossible", $cnx->errorInfo());
    		}
    	}
     
    /*
    	 * Fonction qui sélectionne une liste
    	 * @arrayReq : tableau pour construire une requête
    	 * @arrayReq['table'] = table à sélectionnée
    	 * @arrayReq['fiels'] = champs à sélectionner, tous les champs si vide
    	 * @arrayReq['condition'] = condition après le where sans le WHERE
    	 */
    	public function returnUnique($arrayReq){
     
    		$conx = $this->connectDb();
    		$table = $arrayReq['table'];
    		$fields = (!isset($arrayReq['fiels'])) ? '*' : $arrayReq['fiels'];
    		if(isset($arrayReq['condition'])){
    			$condition = 'WHERE' . $arrayReq['condition'];
    			$varCondition = $arrayReq['varCondition'];
    		}
     
    		$requete = $conx->prepare('SELECT id,titre FROM '.$table.' '.$condition.' ');
    		if($requete->execute(array("id"=>$varCondition))){
    			$return = $requete->fetch();
    			return $return;
    		}else{
    			throw new Exception("Requête impossible", $cnx->errorInfo());
    		}
    	}
     
    	// Sets
     
    	// gets
     
     
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 118
    Points : 49
    Points
    49
    Par défaut
    j'ai maintenant un souci avec la construction d'une requete préparée de mise à jour :

    Voici l'erreur rencontrée
    SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $db = new Mysql();
    $update = $db->updateDb(array(
    		"table" => pages,
    		"fields" => array
    			( 
    			"titre"=>"Nouvelle page modifiée 13", 
    			"text"=> "nouveau texte modifié", 
    			"tpl"=>2
    			),
    		"condition" => "id=:id"
    		));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    44
     
     
    class Mysql {
     
    ... je ne remet pas l'entete de la classe
     
    $conx = $this->connectDb(); // connexion à la base
     
    		$table = $arrayReq['table']; // la table concernée
    		$fields = $arrayReq['fields']; // la table concernée
    		$condition = $arrayReq['condition'];
    		$idUpdate = $arrayReq['idUpdate'];
     
    		// Liste des champs à modifier
    		$tabCles = array_keys($fields);
    		$sets = "";
    		for($i=0; $i<count($tabCles); $i++){
                $sets .= $tabCles[$i].' = :'.$tabCles[$i].', ';
    		}
    		$sets = substr($sets, 0, -2);
     
    		$tabValeurs = array_values($fields);
    		for($i=0; $i<count($tabValeurs); $i++){
                $valeurs[] .= '":'.$tabCles[$i].'" => '.$tabValeurs[$i].'';
    		}
    		$valeurs[] .= '":id" => 13';
     
    		try {
    			$sql = 'UPDATE '.$table.' SET '.$sets.' WHERE '.$condition.'';
    			$requete = $conx->prepare($sql);
    			$requete->execute($valeurs);
    		}
    		catch (PDOException $e){
    			echo "Modification impossible" . 
    			"<br/>" . $e->getMessage().
    			"<br/> FILE : " . $e->getFile().
    			"<br/> LINE : " . $e->getLine().
    			"<br/> REQUETE : " . $sql .
    			"<br/> SETS : " . $sets .
    			"<br/> VALUES : " . print_r($valeurs);
    			die();
    		}
    		return $requete;
    }

Discussions similaires

  1. [PDO] Lien URL vers requete preparée sur PDO
    Par Americano dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/08/2013, 09h31
  2. [PDO] pdo - requete prepare qui ne retourne rien
    Par killgors dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 12/11/2011, 23h06
  3. [ Windev 11 ] Classe Connexion fonction Requeter
    Par sterix92 dans le forum WinDev
    Réponses: 1
    Dernier message: 26/11/2007, 22h28
  4. [PDO] Ne trouve pas la classe pdo
    Par sliderman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/10/2007, 17h18
  5. [POO] POO pour une classe PDO
    Par nabab dans le forum Langage
    Réponses: 2
    Dernier message: 07/08/2007, 23h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo