Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 21/02/2011, 18h37   #1
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
Par défaut erreur in insert into php poo

Bonjour,
Je débute dans la POO, et j'ai un problème au niveau d'une de mes fonctions qui consiste a insérer des valeurs récupérer dans un formulaire, puis a les insérer dans ma Base de données.

Tous fonctionne assez bien, seulement lorsque mes valeurs sont inserer, celle ci ne contienne pas mes champs mais seulement des 0
Pourtant lorsque j'utilise un print_r mon code m'affiche les valeurs que j'ai rentré dans mon formulaire.
(Ma page vendre fait appel au formulaire que j'ai sur scriptAnnonce.php)
Voici quelque screen afin que vous y voyait un peu plus clair.

Merci
Images attachées
Type de fichier : png POD.png (7,5 Ko, 4 affichages)
Type de fichier : png script.png (35,0 Ko, 4 affichages)
Type de fichier : png fonction.png (10,4 Ko, 2 affichages)
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 18h53   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Hello

Déjà tu ne dois pas utiliser mysql_error si tu utilise PDO, il y a PDO::errorCode et PDO::errorInfo pour ça.

Ensuite, sache qu'il est très dangereux d'enregistrer des données sans les vérifier car les données POST peuvent être changées à la volée par un utilisateur un peu malin (pas beaucoup c'est ça qui est terrible - il y a une légende urbaine parmi la communauté PHP qui est de croire $_POST plus sécurisé que $_GET: ce n'est pas le cas, les données proviennent dans les deux cas de l'utilisateur et donc ne sont pas sûres !)

Bon le problème en lui même vient du fait que ton tableau de remplacement pour le prepare statement est faux.
$_GET ou $_POST sont des tableaux associatifs dont la clé est le nom du paramètres alors que PDOStatement->execute attends un tableau dont les clées sont les noms des placeholders (je ne trouve pas d'équivalent français) mis dans la requête.
Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$query = "INSERT INTO table VALUES (:id, :name, :value);"
$stmt = $pdo->prepare($query);

// Dans un post tu aurais ça par exemple:
$inputs = array(
  'id' => 1,
  'name' => 'test',
  'value' => 'hello'
);

// alors que PDOStatement attends:
$inputs = array(
  ':id' => 1,
  ':name' => 'test',
  ':value' => 'hello'
);
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 18h59   #3
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
D'accord, je te remercie déjà d'y jeter un coup d'oeil.
Mais simplement ce petit projet et à des fins personnel donc si les données ne sont pas sécurisées ce n'est pas très grave mais je prends note.
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 19h10   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
J'en profite pour attirer ton attention sur un point: le prepare statement est créé et détruit à chaque appel de ta méthode. Donc si par exemple tu appelles cette méthode 100x dans le déroulement d'une requête, le statement est créé puis détruit 100x ce qui est complêtement inutile et bousille les performances.

Une bonne manière de procéder est de mettre les statements (les objets PDOStatement donc) en tant que membres statiques protégés de la classe qui les utilisent (une classe donnée n'a pas en général à changer ces statements).
ça ressemble à ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
class MaClass {
 
protected static $_statement_1;
 
public static function executeStatement1 ($inputs) {
   if (!isset(static::$_statement_1))
      static::$_statement_1 = Database::prepare("<ta requête>");
 
   return static::$_statement_1->execute($inputs);
}
Vu que généralement l'instance de PDO est unique dans un programme PHP, il est de bon ton de la mettre dans un Singleton qu'on appelle Database.
Tu trouvera des exemples et des tutos sur les singleton et sur PDO un peu partout.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/02/2011, 19h27   #5
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
Je suis en train de modifier mon code en fonction de ce que tu m'a dit.
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 20h40   #6
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
J'ai tout a fait comprit ce que tu voulais dire, cependant j'ai du mal au niveau du DATABASE dans ta fonction j'ai du mal a voir comment l'on pourrait faire appel a ma PDO
Est ce que je doit me connecter avec une fonction de ce type ?

Code php :
1
2
3
4
5
6
    public static function getDBO()
    {
        if (!self::$db)
         self::$db = new PDO('mysql:host=localhost;dbname=personnage',root', '');
        return self::$db;
    }
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 20h59   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
En fait la classe Database est un Singleton pour PDO, c'est une classe qui ne peut être instanciée qu'une et une seule fois. L'avantage c'est que de n'importe où dans le code on peut accéder à l'objet PDO sans se soucier de la porté.

Mon Singleton perso c'est:
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
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);
    }
}
Après tu peux faire:
Code :
1
2
3
4
5
6
7
8
 
Database::instance($dsn, $user, $password);
 
class MaClasse {
 
public static function execSomeQuery () {
   return Database::query("SELECT * FROM table");
}
Pratique non ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 21h44   #8
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
En effet ceci a l'air très pratique, mais légèrement complexe et vu que je ne débute que..Du coup si possible je préféré rester sur la connection que j'ai établie.
Bref j'ai modifier le code que tu ma donner mais ceci insert toujours des valeurs = a 0.

Voici le screen de la modif
Images attachées
Type de fichier : png aaaaa.png (12,9 Ko, 2 affichages)
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 03h07   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Fait
Code :
1
2
 
var_dump($inputs);
a cet endroit.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2011, 14h43   #10
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
J'ai rajouter ta ligne a ma fonctions, voici ce que sa m'affiche:

Citation:
array
'titre' => string 'je vend' (length=7)
'type' => string 'voiture' (length=7)
'date' => string '0001-01-02' (length=10)
'heure' => string '13:45' (length=5)
'descriptif' => string 'Bonjours, je vend mon ordinnateur' (length=33)
'prix' => string '689' (length=3)
Votre annonce a etait poster
Donc on voit que sa rentre bien dans ma boucle, en insérant dans ma base de donnée et en affichant la validation.
Par contre l'insertion insère toujours des valeurs = a 0
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 17h37   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Tu n'as pas compris mon post précédent: il faut que les index (les clés) du tableau passé ($inputs) soient préfixés par ':' (':titre' par exemple et non 'titre'). Sinon le statement insère des données fausses.

Tu as une typo, c'est: "Votre annonce à été postée"
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2011, 21h52   #12
Invité régulier
 
Homme
Inscription : février 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 22
Points : 5
Points : 5
Daccord, je te remercie de ton aide, tout marche très bien !
Merci
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h02.


 
 
 
 
Partenaires

Hébergement Web