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

Langage PHP Discussion :

[POO] Utilisation d'une classe pdo perso


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut [POO] Utilisation d'une classe pdo perso
    Bonjour,
    j'essaie d'implémenter une class à partir de pdo, mais j'ai toujours des erreurs ?
    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
    <?php
    class ConnectionClass
    {
    	private $db = 'test'; //nom de la base de données
    	private $host = 'localhost'; // nom de la machine hôte
    	private $user = 'root'; // nom de l'utilisateur
    	private $pwd = 'xav';// mot de passe 
    	private $dsn;
    	private $con;
    	private $requette; // requette
     
    	function __construct()
    	{
    		try 
    		{
    			$this->dsn = "mysql:dbname=$this->db;host=$this->host";
    			$this->con = new PDO($this->dsn, $this->user, $this->pwd);	
    		}
    		catch (PDOException $e)
    		{
    			print 'Erreur ! : '.$e->getMessage().'<br/>';
    			echo 'N° : '.$e->getCode();
    			die();
    		}
    		return $this->con;
    	}
     
    	function reqSelection($requette)
    	{
    		$result = $con->query($requette);
    		//return $result;
    	}
    }
    //$conn=new ConnectionClass();
    reqSelection("select * From client");
    foreach ($result as $row)
    {
    echo $row['nomH'] . " - " . $row['prenomH'] . "<br />";
    }
    ?>
    l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to undefined function reqSelection() in /var/www/agenda_d_or/ConnectionClass.php on line 35
    numéro de ligne 35 correspond :
    reqSelection("select * From client");
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Bonjour,
    Il faut instancier un objet de type ConnectionClass pour pouvoir accéder à une de ses méthodes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Connec = new ConnectionClass();
    $result = $Connec->reqSelection("select * From client");

  3. #3
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    j'ai cette erreur

    Fatal error: Call to a member function query() on a non-object in /var/www/agenda_d_or/ConnectionClass.php on line 30

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	function reqSelection($requette)
    	{
    //ligne 30 ci-dessous
    		$result = $con->query($requette);
    		//return $result;
    	}

  4. #4
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    Cette fois je n'ai plus d'erreur, mais la requete ne renvoie rien ?
    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
    <?php
    class ConnectionClass
    {
    	private $db = 'test'; //nom de la base de données
    	private $host = 'localhost'; // nom de la machine hôte
    	private $user = 'root'; // nom de l'utilisateur
    	private $pwd = 'xav';// mot de passe 
    	private $dsn;
    	private $con;
    	private $requette; // requette
     
    	function __construct()
    	{
    		try 
    		{
    			$this->dsn = "mysql:dbname=$this->db;host=$this->host";
    			$this->con = new PDO($this->dsn, $this->user, $this->pwd);
    		}
    		catch (PDOException $e)
    		{
    			print 'Erreur ! : '.$e->getMessage().'<br/>';
    			echo 'N° : '.$e->getCode();
    			die();
    		}
    		return $this->con;
    	}
     
    	function reqSelection($requette)
    	{
    		$result = $this->con->query($requette);
    		//return $result;
    	}
    }
     
    $Connec = new ConnectionClass();
    $result = $Connec->reqSelection("select * From client");
    foreach ($Connec as $row)
    {
    echo $row['nom'] . " - " . $row['prenom'] . "<br />";
    }
    ?>
    ma 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
    -- phpMyAdmin SQL Dump
    -- version 2.10.3deb1ubuntu0.1
    -- http://www.phpmyadmin.net
    -- 
    -- Serveur: localhost
    -- Généré le : Sam 16 Février 2008 à 20:19
    -- Version du serveur: 5.0.45
    -- Version de PHP: 5.2.3-1ubuntu6.3
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
     
    -- 
    -- Base de données: 'test'
    -- 
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table 'client'
    -- 
     
    CREATE TABLE `client` (
      nom varchar(30) NOT NULL,
      prenom varchar(30) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table 'client'
    -- 
     
    INSERT INTO client VALUES ('jacky', 'double Coup');
    INSERT INTO client VALUES ('Rasmus', 'Lerdorf');
    INSERT INTO client VALUES ('Rasmus', 'Lerdorf');
    INSERT INTO client VALUES ('Rasmus', 'Lerdorf');
    INSERT INTO client VALUES ('developpus', 'artotal');
    INSERT INTO client VALUES ('developpus', 'artotal');

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Ok, il faut que ta fonction renvoie le résultat avec le return et le foreach doit utiliser le résultat et pas l'objet $Connec.
    Par contre, dans tes requêtes il est préférable de ne pas faire de SELECT *...mais plutôt SELECT NOM,PRENOM....

    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
    <?php
    class ConnectionClass
    {
    	private $db = 'test'; //nom de la base de données
    	private $host = 'localhost'; // nom de la machine hôte
    	private $user = 'root'; // nom de l'utilisateur
    	private $pwd = '';// mot de passe 
    	private $dsn;
    	private $con;
    	private $requette; // requette
    	
    	function __construct()
    	{
    		try 
    		{
    			$this->dsn = "mysql:dbname=$this->db;host=$this->host";
    			$this->con = new PDO($this->dsn, $this->user, $this->pwd);
    		}
    		catch (PDOException $e)
    		{
    			print 'Erreur ! : '.$e->getMessage().'<br/>';
    			echo 'N° : '.$e->getCode();
    			die();
    		}
    		return $this->con;
    	}
    	
    	function reqSelection($requette)
    	{
    		$result = $this->con->query($requette);
    		return $result;	}
    }
     
    $Connec = new ConnectionClass();
    $result = $Connec->reqSelection("select nom,prenom From client");
    foreach ($result as $row)
    {
    	echo $row['nom'] . " - " . $row['prenom'] . "<br />";
    }
    ?>

  6. #6
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    Bonjour,
    j'ai toujours la même erreur !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur ! : SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)
    N° : 0
    curieux, je vais peut-être faire une classe en php sans PDO().
    Mais c'est dommage on perd la Persistence, les requêtes préparés, la sécurité accrue et plus important la robusteste.
    Qu'an penses-tu ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Non attend, tu as dû faire un copier coller du code et moi j'ai enlever le password pour tester chez moi, il suffit de le remettre et c'est ok...

  8. #8
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    j'amène une amélioration notable:
    (pour une production sans risque)
    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
    <?php
    class Connection
    {
    	private $db = 'pdo'; 			// base de données
    	private $host = 'localhost'; 	// adresse de la base
    	private $user = 'root'; 		// nom
    	private $pwd = ''; 				// mot de passe 
    	private $con;
    	private $reqSelect; 			// requette de séléction
     
    	public function __construct()
    	{
    		try 
    		{
    			$dsn = "mysql:dbname=$this->db;host=$this->host";
    			$this->con = new PDO($dsn, $this->user, $this->pwd);
    		}
    		catch (PDOException $e)
    		{
    			//On indique par email qu'on n'a plus de connection disponible
    			error_log(date('c').': '.$e->getMessage(), 1, 'artotal@gmail.com');
    			$message= new Message();
    			$message=outPut('Erreur critique', 'Serveur de BDD indisponible, veuillez réessayer dans un instant');
    		}
    		return $this->con;
    	}
     
    	public function requette($reqSelect)
    	{
    		$result = $this->con->query($reqSelect);
    		return $result;	
    	}
    }
     
    $Connec = new Connection();
    $result = $Connec->requette("select * FROM personne");
    foreach ($result as $row)
    {
    	echo $row['nom'] . " - " . $row['prenom'] . "<br />";
    }
    echo date('c');
    ?>
    la classe message (moteur de template)
    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
    <?php
    class Message
    {
    	private $messageHtml;
    	function __construct($as_file='message.html')
    	{
    		//file_get_contents — Lit tout un fichier dans une chaîne
    		$this->messageHtml=file_get_contents($as_file);
    	}
    	public function exceptionHandler($exception)
    	{
    		Message::erreur('erreur inconnue', $exception->getMessage(), 'message.html');
    	}
    	public function outPut($as_titre, $as_message, $as_file=NULL)
    	{
    		// gestion des caractères spéciaux pour le titre et texte (affiche < == &lt;)
    		$ls_msg=htmlentities($as_message);		
    		$ls_titre=htmlentities($as_titre);
    		// remplace dans le message
    		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
    		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
    		// Affichage et arrêt du traitement
    		die($ls_sortie);
    	}
    	public static function erreur($exception, $message, $file)
    	{
    		$ls_titre=htmlentities('Erreur inconnue');
    		$ls_msg=htmlentities($message);
    		$ls_messageHtml=file_get_contents($file);
    		// remplace dans le message
    		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
    		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
    		die($ls_sortie);
    	}
    }
    ?>
    Le fichier xhtml "message.html"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD xhtml" xml:lang="fr">
    <html>
    <head>
    <title>Ereur</title>
    <link rel="stylesheet" type="text/css" media="all" href="*.css" />
    </head>
    <body>
    	<h1>{TITRE}</h1>
    	<p class="">
    		{TITRE}
    	</p>
    </body>
    </html>
    Si quelqu'un peux le tester notamment les erreurs sa serai cool , sa permetra d'améliorer cette contribe.

  9. #9
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    Quand je provoque une erreur
    private $host = 'localhostuuuuuuuuuuuuu'; // adresse de la base
    j'ai une première erreur qui est lié à ma configuration local ?
    sendmail_from (sous m$)
    Mais la deuxième erreur je ne vois pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Warning: error_log() [function.error-log]: "sendmail_from" not set in php.ini or custom "From:" header missing in C:\wamp\www\pdo\testPdo.php on line 23
     
    Fatal error: Call to undefined function outPut() in C:\wamp\www\pdo\testPdo.php on line 25
    La class message modifié
    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
    <?php
    class Message
    {
    	private $messageHtml;
    	function __construct($as_file='message.html')
    	{
    		//file_get_contents — Lit tout un fichier dans une chaîne
    		$this->messageHtml=file_get_contents($as_file);
    	}
    	public function exceptionHandler($exception)
    	{
    		Message::erreur('erreur inconnue', $exception->getMessage(), 'message.html');
    	}
    	public function outPut($titre, $message, $as_file=NULL)
    	{
    		// gestion des caractères spéciaux pour le titre et texte (affiche < == &lt;)
    		$ls_msg=htmlentities($message);
    		$ls_titre=htmlentities($titre);
    		// remplace dans le message
    		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
    		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
    		// Affichage et arrêt du traitement
    		die($ls_sortie);
    	}
    	public static function erreur($exception, $message, $file)
    	{
    		$ls_titre=htmlentities('Erreur inconnue');
    		$ls_msg=htmlentities($message);
    		$ls_messageHtml=file_get_contents($file);
    		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
    		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
    		die($ls_sortie);
    	}
    }
    ?>

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Salut,
    Peux tu envoyer le code de ta page de test "testPdo.php" stp ??

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Dans ta gestion d'exception tu devrais avoir plutôt un truc du genre
    objet->outPut plutot que objet=outPut puisque c'est une méthode de ton objet..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $message->outPut('Erreur critique', 'Serveur de BDD indisponible, veuillez réessayer dans un instant');

  12. #12
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    499
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 499
    Points : 190
    Points
    190
    Par défaut
    Oui c'était ça, une faute d'inatention...
    Mais j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Warning: error_log() [function.error-log]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\pdo\testPdo.php on line 23
    Erreur critique
     
    Erreur critique
    quand je lance testPdo.php
    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
    <?php
    require_once('message.class.php');
    class Connection
    {
    	private $db = 'pdo'; 			// base de données
    	private $host = 'localhost'; 	// adresse de la base
    	private $user = 'rootiiii'; 		// nom
    	private $pwd = ''; 				// mot de passe 
    	private $con;
    	private $reqSelect; 			// requette de séléction
    	private $reqExecution; 			// requette d'execution
     
    	public function __construct()
    	{
    		try 
    		{
    			$dsn = "mysql:dbname=$this->db;host=$this->host";
    			$this->con = new PDO($dsn, $this->user, $this->pwd);
    		}
    		catch (PDOException $e)
    		{
    			//On indique par email qu'on n'a plus de connection disponible
    			error_log(date('D-m-Y').': '.$e->getMessage(), 1, 'artotal@gmail.com');
    			$message= new Message();
    			$message->outPut('Erreur critique', 'Serveur de BDD indisponible, veuillez réessayer dans un instant');
    		}
    		return $this->con;
    	}
     
    	public function requetteSel($reqSelect)
    	{
    		$result = $this->con->query($reqSelect);
    		return $result;
    	}
     
    	public function requetteExe($reqExecution)
    	{
    		$result = $this->con->exec($reqExecution);
    		return $result;
    	}	
    }
     
    $Connec = new Connection();
    $result = $Connec->requetteSel("select * FROM personne");
    foreach ($result as $row)
    {
    	echo $row['id'].'/ '.$row['nom'] . " - " . $row['prenom'] . "<br />";
    }
    $result = $Connec->requetteExe("delete id FROM personne where id=2");
    ?>
    dans le php.ini j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [mail function]
    ; For Win32 only.
    SMTP = localhost
    smtp_port = 25
     
    ; For Win32 only.
    sendmail_from = artotal@gmail.com
    je crois que l'utilisation de set_ini(); serait pas mal, ça devrai amélioré la portabilité ?

    @MKITONE
    as-tu des idée d'amélioration, on en parle ?
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] POO pour une classe PDO
    Par nabab dans le forum Langage
    Réponses: 2
    Dernier message: 07/08/2007, 23h58
  2. Réponses: 1
    Dernier message: 03/02/2007, 18h02
  3. pb utilisation d'une classe perso
    Par sharivaree dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/12/2006, 18h44
  4. Réponses: 4
    Dernier message: 25/07/2006, 16h30
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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