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 :

La méthode select de la classe MYPDO de rawsrc retourne soit un tableau vide soit NULL [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut La méthode select de la classe MYPDO de rawsrc retourne soit un tableau vide soit NULL
    Bonjour,
    j'utilise la méthode select de la classe MYPDO de rawsrc. Celle-ci, si elle réussit, retourne un tableau rempli de valeurs (issues d'un fetchAll) et NULL si elle échoue. Je teste donc la valeur de retour pour savoir si ça s'est bien passé ou non.

    Code php : 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
     
     
    public function createBdd($val,$type_CSV)
    {
        $bdd=new MYPDO();
        foreach($val as $val_bdd)
        {
                 $deb_req="INSERT INTO `".$type_CSV."` ";
                 $list_colons='(id_SESA,alternate_id,platform,platform_owner,publisher,application_name,HFMCODE,Currently_active,Activate_date,Deactivate_date,Group_name,Office_Country,Firstname,Lastname,Company_name,Job_code,Reporting_entity,Business_unit_name,Location,Internet_Address,Manager_firstname,Manager_lastname,Manager_email)';
                 $list_values=" VALUES('".$val_bdd."')";
     
                 $sql=$deb_req.$list_colons.$list_values;
     
                 $ret=$bdd->select( $sql, [] );
     
                 var_dump($ret);
        }
        return $ret;
    }
    ///////////////////////
     $CSV_in_bdd=new CSVInBDD();
                    $ret=$CSV_in_bdd->createBdd($val['content'],$val['type_csv']);
     
                    if ($ret)
                    {
                        $body = new PhpEcho('', ['msg_end' => $_FILES['file2']['name']." fully processed, without errors."]);
                        $body->setCode('<p>'.$body('msg_end').'</p>');
                        echo $body;
                    }
                    else{
                        $body = new PhpEcho('', ['msg_error' => $_FILES['file2']['name']." has not been put in BDD."]);
                        $body->setCode('<p>'.$body('msg_error').'</p>');
                        echo $body;
                    }
    Je constate que l'exécution de la requête SQL (effectuée par cette méthode) s'est bien déroulée mais néanmoins les 36 var_dump de la ligne 16 (la méthode est appelée 36 fois) affichent soit un tableau vide, soit NULL. Pourquoi ? Merci.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut Laurent,

    euh... tu bois ou quoi ?
    je te mets juste ce qui ne va pas en remplaçant les valeurs de tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ret = $bdd->select("INSERT INTO ...", []);
    Faut dessaouler là parce que les dents du fond baignent !

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Désolé, mais même parfaitement clean, je ne vois pas ce que tu as changé dans mon code, donc ce qui n'allait pas...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je vais te l'écrire en plus gros :
    tu fais un select() avec une chaîne sql : INSERT

    Opte pour l'eau gazeuse mon gars

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    OK, du coup, j'ai rajouté une méthode dans ta classe :
    Code php : 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
     
    public function insert($sql, array $values, array $type = []):bool
        {
            try {
                $stmt = self::$pdo->prepare($sql);
                foreach ($values as $tag => $v) {
                    $stmt->bindValue($tag, $v, $type[$tag] ?? \PDO::PARAM_STR);
                }
                $exec = $stmt->execute();
                //var_dump($stmt);
                return true;
            } catch (\PDOException $e) {
                error_log('PDO::select - '.$e->getmessage());
                return false;
            }
        }
    à laquelle je passe ma requête INSERT. Correct ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    oui c'est correct, par contre tu pourrais améliorer dans la mesure où les INSERT sont standard dans leur syntaxe. Tu pourrais générer tout seul la chaîne sql qui va bien en y ajoutant les tableaux de valeurs (multi insertions en une seule fois : la syntaxe VALUES (val1a, val1b), (val2a, val2b), ...
    J'ai ça en stock mais je te laisse phosphorer un peu surtout au réveil quand t'es sobre

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    surtout au réveil quand t'es sobre
    Bon, ça fait longtemps que je suis levé (plus pour très longtemps d'ailleurs) et je n'ai pas imité le grand-père de ma femme (il mettait du schnaps (eau de vie de mirabelles en Lorraine) dans son café le matin ...). J'ai donc phosphoré une bonne partie de la journée.

    Ca vaut quoi, ça ?

    Code php : 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
     
      public function insertMultipleValues(string $table_name, string $list_colons, array $values):bool
        {
            try { 
                $list_values=" VALUES ";
                foreach ($values as $val_bdd)
                 {   
                     $sup_str="(".$val_bdd."),";
                     $list_values.=$sup_str;
                 }
                 $ln=strlen($list_values);
                 $list_values=substr($list_values,0, -1);
                 $deb_req="INSERT INTO `".$table_name."` ";
     
                 $sql=$deb_req.$list_colons.$list_values;
                 $stmt = self::$pdo->prepare($sql);
                 $exec = $stmt->execute();
     
                return true;
            } catch (\PDOException $e) {
                error_log('PDO::select - '.$e->getmessage()); 
                return false;
            }
        }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    comment tu sécurises tes données ? parce que là je ne vois rien du tout.
    c'est pas avec ces deux lignes que ça fait la blague
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = self::$pdo->prepare($sql);
    $exec = $stmt->execute();

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    j'ai repris un de mes code et l'ai adapté :
    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
    /**
     * @param  string $table_name
     * @param  array  $values       [field => value] | [[field => value]]
     * @param  array  $fields_type  [field => \PDO::PARAM_XXX] Default : \PDO::PARAM_STR
     * @return bool
     */
    public function insert(string $table_name, array $values, array $fields_type = []): bool
    {
        // générateur de tag unique pour PDO
        $tag = function(): string {
            $alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            static $tags;
            do {
                $tag = ':'.substr(str_shuffle($alpha), 6).mt_rand(1000, 9999);
            } while (isset($tags[$tag]));
            $tags[$tag] = true;
            return $tag;
        };
     
        $tokens = $types = $sql_dataset = [];
     
        $sql_builder = function(array $data) use (&$tokens, &$types, &$sql_dataset, $fields_type, $tag) {
            ksort($data); // on met les données toujours dans le même ordre selon les nom des colonnes
            $sql = [];
            foreach ($data as $field => $value) {
                $token          = $tag();
                $tokens[$token] = $value;
                $types[$token]  = $fields_type[$field] ?? \PDO::PARAM_STR;
                $sql[]          = $token;
            }
            $sql_dataset[] = '('.implode(', ', $sql).')';
        };
     
        // on vérifie si on a un qu'un jeu de données ou plusieurs jeux de données
        if ((count($values, COUNT_RECURSIVE) - count($values))) {
            $fields = array_keys(reset($values));
            foreach ($values as $v) {
                $sql_builder($v);
            }
        } else {
            $fields = array_keys($values);
            $sql_builder($values);
        }
     
        sort($fields); // on trie les colonnes pour coller à l'ordre des données
     
        $sql = 'INSERT INTO '.$table_name.' ('.implode(', ', $fields).') VALUES '.implode(', ', $sql_dataset);
     
        try {
            $stmt = self::$pdo->prepare($sql);
            foreach ($tokens as $token => $v)
                $stmt->bindValue($token, $v, $types[$token]);
            }
            $exec = $stmt->execute();
            return true;
        } catch (\PDOException $e) {
            error_log('PDO::select - '.$e->getmessage());
            return false;
        }
    }
    Je n'ai pas eu le temps de tester mais l'idée est là.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    j'ai repris un de mes code et l'ai adapté ...
    Adieu Laurent.... on t'aimait bien...

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    En effet, ayant lu le post de rawsrc, je me suis dit que j'avais 2 options :
    1- le suicide
    2- un retour en arrière

    Mon instinct de conservation m'a fait choisir la 2e option . Ca n'a pas été très rapide car je suis tombé sur plusieurs problèmes, mais ça y est, c'est au point (et je n'utilise que la méthode décrite au post #5).
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Rohhôôooo, comment qu'il exagère l'autre
    Une petite fonction de 50 lignes et ça y est, il saigne des yeux et veut se suicider, non mais !
    Au lieu de palabrer, intéresse-toi au code et tu verras que ces quelques lignes résolvent pas mal de cas de figure sans trop de contraintes lors des appels.
    Si tu la reprends dans le code source de la classe PDO, tu verras qu'il est possible de sacrement factoriser le code afin que toutes les méthodes (insert, update, delete, select, call) en bénéficient.

    Ah zut, j'ai oublié qu'il fallait coder les quelques fonctions qui manquent à l'appel

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

Discussions similaires

  1. [XL-2007] La méthode select de la classe worksheet a échoué
    Par nanousik dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/07/2013, 11h17
  2. Méthode select de la classe range a échoué
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 06/06/2013, 13h11
  3. Réponses: 4
    Dernier message: 26/08/2010, 13h40
  4. erreur méthode select de la classe range
    Par chloe2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2009, 10h23
  5. Méthode Select de la classe worksheet a échoué
    Par marinef dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/07/2009, 13h36

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