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

  1. #1
    Membre expert
    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

  2. #2
    Modérateur

    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 !
    # Dans la Création, tout est permis mais tout n'est pas utile...

  3. #3
    Membre expert
    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

  4. #4
    Modérateur

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  5. #5
    Membre expert
    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:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_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

  6. #6
    Modérateur

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  7. #7
    Membre expert
    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

  8. #8
    Modérateur

    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();
    # Dans la Création, tout est permis mais tout n'est pas utile...

  9. #9
    Modérateur

    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:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_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:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_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à.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  10. #10
    Rédacteur/Modérateur

    Citation Envoyé par rawsrc Voir le message
    j'ai repris un de mes code et l'ai adapté ...
    Adieu Laurent.... on t'aimait bien...
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  11. #11
    Membre expert
    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

  12. #12
    Modérateur

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...