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 :

Erreur d'insertion dans la BDD


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut Erreur d'insertion dans la BDD
    J'ai cette requete basique qui ne veut pas marcher, pourtant j'ai verifié 10 fois et il me semble pas avoir fait d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class inventaire extends mysql {
     
    	public function ajouter($sexe, $categorie, $taille, $quantite, $description) {
    			$dbh = mysql::getInstance();
    			$sql = "INSERT INTO inventaire VALUES ('$sexe', '$categorie', '$taille', '$quantite', '$description', '0')";
    			$result = $dbh->execute($sql);
     
    		}

    Et donc voici l'erreur qui ne me parle vraiement pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    exception 'PDOException' with message 'invalid data source name' in C:\xxx\includes\class\mysql.php:19 Stack trace: #0 C:\xxx\includes\class\mysql.php(19): PDO->__construct('DB_DNS', 'root', '') #1 C:\xxx\includes\class\inventaire.php(6): mysql::getInstance() #2 C:\xxx\template\inventaire.php(85): inventaire->ajouter('fille', 'Tee-shirt', '1', NULL, NULL) #3 C:\xxx\index.php(14): include('C:\wamp\www\elz...') #4 {main}
    Fatal error: Call to a member function execute() on a non-object in C:\xxx\includes\class\inventaire.php on line 8

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Je suppose que mysql est un singleton PDO je me trompe ? et que donc $dbh est une référence sur un objet PDO.

    Si tel est bien le cas, c'est la méthode PDO::exec que tu dois appeller.
    'execute' est une méthode de PDOStatement que tu dois appeller sur l'objet retourné par PDO::prepare.

    Tu devrais munir ton singleton d'une méthode statique 'exec' afin de faire directement mysql::exec() au lieu de récupérer la référence à chaque fois.

    Au passage, si l'exeption "invalid data source name" c'est que ton DSN est mauvais et donc l'instanciation de PDO à échoué.

    Read more: http://www.php.net/manual/en/book.pdo.php

    Edit ---

    Je te file ma classe singleton pour PDO:
    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
     
    class Database {
     
        protected static $_pdo_instance;
     
        private function __construct () { }
     
        public function instance () {
            if (!isset(static::$_pdo_instance)) {
                $args = func_get_args();
                try {
                    switch (count($args)) {
                        case 0:
                            throw new InvalidArgumentException("The first parameter is mandatory"); break;
                        case 1:
                            static::$_pdo_instance = new PDO($args[0]);
                            break;
                        case 2:
                            static::$_pdo_instance = new PDO($args[0], $args[1]);
                            break;
                        case 3:
                            static::$_pdo_instance = new PDO($args[0], $args[1], $args[2]);
                            break;
                        case 4:
                            static::$_pdo_instance = new PDO($args[0], $args[1], $args[2], $args[3]);
                            break;
                        default:
                            throw new BadMethodCallException(__METHOD__ . " takes at least 1 parameter and at most 4 parameters");
                            break;
                    }
                }
                catch (Exception $e) {
                    throw new RuntimeException("Cannot connect to database", 0, $e);
                }
            }
            return static::$_pdo_instance;
        }
     
        public static function beginTransaction () {
            return static::$_pdo_instance->beginTransaction();
        }
     
        public static function commit () {
            return static::$_pdo_instance->commit();
        }
     
        public static function errorCode () {
            return static::$_pdo_instance->errorCode();
        }
     
        public static function errorInfo () {
            return static::$_pdo_instance->errorInfo();
        }
     
        public static function exec ($statement) {
            return static::$_pdo_instance->exec($statement);
        }
     
        public static function getAttribute ($attribute) {
            return static::$_pdo_instance->getAttribute($attribute);
        }
     
        public static function getAvailableDrivers () {
            return static::$_pdo_instance->getAvailableDrivers();
        }
     
        public static function lastInsertId ($name = null) {
            return static::$_pdo_instance->lastInsertId($name);
        }
     
        public static function prepare ($statement, $driver_options = array()) {
            return static::$_pdo_instance->prepare($statement, $driver_options);
        }
     
        public static function query ($statment) {
            return static::$_pdo_instance->query($statment);
        }
     
        public static function quote ($string, $parameter_type = PDO::PARAM_STR) {
            return static::$_pdo_instance->quote($string, $parameter_type);
        }
     
        public static function rollBack () {
            return static::$_pdo_instance->rollBack();
        }
     
        public static function setAttribute ($attribute, $value) {
            return static::$_pdo_instance->setAttribute($attribute, $value);
        }
    }

  3. #3
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut
    Merci

    Mais ma classe a toujours bien fonctionné, et oui je me susi trompé dans le code, c'est execute() mais exec() mais ce la ne change strictement rien a l'erreur.


    Voici ma classe que je j'utilise depuis plusieurs années deja :
    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
     
    <?php
    class mysql extends PDO {
     
    	private static $_instance;
     
    	/* Constructeur : héritage public obligatoire par héritage de PDO */
    	public function __construct( ) {
     
    	}
    	// End of PDO2::__construct() */
     
    	/* Singleton */
    	public static function getInstance() {
     
    		if (!isset(self::$_instance)) {
     
    			try {
     
    				self::$_instance = new PDO('xxx', 'xxx', 'xxx');
     
    			} catch (PDOException $e) {
     
    				echo $e;
    			}
    		} 
    		return self::$_instance; 
    	}
    	// End of PDO2::getInstance() */
    }
    ?>

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Benjamin Delespierre > y'a pas de static pour ta fonction instance

    thebarbarius > d'ou sortent les 'xxx' dans : new PDO('xxx', 'xxx', 'xxx'); ?


    si vous voulez rendre n'importe quelle classe en Singleton faites :

    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
    class Database extends PDO
    {
        protected static $_instance;    
     
        public static function getInstance()
        {
            if(null === static::$_instance || 0 === func_num_args())
            {        
                $class = new ReflectionClass(__CLASS__);            
                static::$_instance = $class->newInstanceArgs(func_get_args());
            }
     
            return static::$_instance;
        }
    }

  5. #5
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut
    Le premier XXX est le host, le suivant le user et l'autre le mot de passe de connexion a mysql.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par thebarbarius Voir le message
    Le premier XXX est le host, le suivant le user et l'autre le mot de passe de connexion a mysql.
    oui mais c'est des constantes ou c'est écrit en dur dans le code ?

  7. #7
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Par défaut
    C'est erit en gros.

    pas de constante ni de variable.

Discussions similaires

  1. Erreur lors de l'insert dans une BDD MySQL
    Par gagaz21 dans le forum C#
    Réponses: 4
    Dernier message: 16/07/2011, 00h10
  2. [ODBC] Erreur d'insertion dans la BDD
    Par thebarbarius dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 07/11/2010, 01h11
  3. [MySQL] Insertion dans la BDD inexistant, aucune erreur donnée
    Par Alcolyte dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 15/04/2008, 19h05
  4. Récupération message d'erreur lors d'une insertion dans une BDD
    Par LoDev dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 22/12/2007, 19h11

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