Probleme insert avec JDatabase

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Probleme insert avec JDatabase

    Bonjour,
    Je veux faire une boucle d'insertion dans BDD en utilisant jDatabase
    Prépa de la requette et dans la boucle des bind qui rajoutent valeur de chaque champ avec des variables.

    Si je fait afficher le contenu de la requette a chaque boucle, les valeurs ne sont ps prises en compte;
    Mon code concerné:
    Code:
    $query_insert = $db->getQuery(true);// Create a new query object.
                // Insert columns.
                
                $columns = array('saison','num_champ','date_tarot','date_annulee','mess_alert','date_m_a_j','auteur_m_a_j');
                // Insert values. (Pb avec NULL en Joomla4
                
                //boucle insertion
                // Prepare the insert query.
                $query_insert
                    ->insert($db->quoteName($table_calendrier_tarot))
                    ->columns($db->quoteName($columns))
                    ->values(':saison,:num_champ,:date_tarot,:date_annulee,:mess_alerte,:date_m_a_j,:auteur_m_a_j');
                if(sizeof($array_dates_tarot) >0){
                    foreach($array_dates_tarot as $num_champ=>$date_tarot){
                        $enr=false;
                        $date_tarot= '' ? '0000-00-00' : $date_tarot ;
                        $date_annulee= $_POST['message_annulation'][$num_champ]    !='' ? '1' : '0' ;
                        $mess_alert= $_POST['message_modif'][$num_champ]!='' ? '1' : '0' ;
                        $date_m_a_j=date('Y-m-d');
                        $auteur_m_a_j=$auteur;
                        //bind values
                        $query_insert
                            ->bind(':saison',$db->quote($saison))
                            ->bind(':num_champ',$db->quote($num_champ))
                            ->bind(':date_tarot',$db->quote($date_tarot))
                            ->bind(':date_annulee',$db->quote($date_annulee))
                            ->bind(':mess_alert',$db->quote($mess_alert))
                            ->bind(':date_m_a_j',$db->quote($date_m_a_j))
                            ->bind(':auteur_m_a_j',$db->quote($auteur_m_a_j));
                            
                        echo '<br /><b>'.$num_champ.' - </b>  ';
                        
                        $db->setQuery($query_insert);
                        echo($query_insert->__toString());
                        //$enr=$db->execute();            
                    
                    }
                }    ​
    Et la copie d'écran echo des requettes:

    Code:
    1 - INSERT INTO `xxxx_calendrier_tarot` (`saison`,`num_champ`,`date_tarot`,`date_annulee`,`mess_alert`,`date_m_a_j`,`auteur_m_a_j`) VALUES (:saison,:num_champ,:date_tarot,:date_annulee,:mess_alerte,:date_m_a_j,:auteur_m_a_j)
    2 - INSERT INTO `xxxx_calendrier_tarot` (`saison`,`num_champ`,`date_tarot`,`date_annulee`,`mess_alert`,`date_m_a_j`,`auteur_m_a_j`) VALUES (:saison,:num_champ,:date_tarot,:date_annulee,:mess_alerte,:date_m_a_j,:auteur_m_a_j)
    etc.....
    ​
    apparemment ce sont les bind qui ne fonctionnent pas pourquoi ?

    Merci d'avance
    @lain

  • #2
    Bonsoir,

    Je n'ai pas encore essayé le bind sur insert, mais, je pense que c'est le $db->quote qui coince.

    Essayez par exemple ->bind(':saison',$saison, Joomla\Database\ParameterType::STRING) ;

    Sinon, est-ce que $saison et $num_champ existent bien ? ils ne sont pas dans la partie de code fournie.

    Pascal
    Dernière édition par pmleconte à 09/12/2024, 18h31
    If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

    Commentaire


    • #3
      bonsoir,

      merci pour ta réponse.
      je viens de faire l'essai mais c'est pareil.
      $saison récupérée plus haut valeur postée
      $num_champ c'est l'index du foreach

      existe-t-il une method pour afficher les erreur dans jDatabase ?

      Commentaire


      • #4
        En principe, s'il y avait un plantage, tu devrais avoir une erreur 500.

        Pour intercepter les erreurs sql, j'utilise :

        Code:
        try {
        $db->setquery($query);
        $tmp3 = $db->loadResult();
        } catch (\Exception $e) {
        throw new \Exception($e->getMessage());}
        Je ne suis pas sûr de l'endroit où les remplacements des variables est fait.

        Après un petit test, il n'est pas fait dans le setQuery mais, dans mon exemple, dans le execute (libraries/vendor/joomla/database/src/DatabaseDriver.php, ligne 632).

        Donc, il est normal que l'echo de la query ne donne rien.

        Pascal



        If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

        Commentaire


        • #5
          Je l'ai mis la, mais ça ne sort pas d'erreur

          Code:
          $query_insert
                                  ->bind(':saison',$saison,Joomla\Database\ParameterType::STRING)
                                  ->bind(':num_champ',$num_champ,Joomla\Database\ParameterType::INTEGER)
                                  ->bind(':date_tarot',$date_tarot,Joomla\Database\ParameterType::STRING)
                                  ->bind(':date_annulee',$date_annulee,Joomla\Database\ParameterType::INTEGER)
                                  ->bind(':mess_alert',$mess_alert,Joomla\Database\ParameterType::INTEGER)
                                  ->bind(':date_m_a_j',$date_m_a_j, Joomla\Database\ParameterType::STRING)
                                  ->bind(':auteur_m_a_j',$auteur_m_a_j,Joomla\Database\ParameterType::STRING);
                              
                              echo '<br /><b>'.$num_champ.' - </b>  ';
                              try{
                                  $db->setQuery($query_insert);
                                  
                              }catch (\Exception $e) {
                                  throw new \Exception($e->getMessage());
                              }
                              echo($query_insert->__toString());​

          Commentaire


          • #6
            Bonjour,

            j'ai contourné le problème du bind avec une solution sans requette préparée.
            A chaque boucle je créée un nouvel objet Query, et je met les values:
            Code:
            $values = array($db->quote($saison),$db->quote($num_champ),$db->quote($date_tarot),$db->quote($date_annulee),$db->quote($mess_alert),    $db->quote($date_m_a_j),$db->quote($auteur_m_a_j));
            @lain

            Commentaire


            • #7
              Bonjour,

              Après la requête du message de 20h, il manque le $db->execute qui aurait dû être dans le try, après le setQuery.

              Comme écrit précédemment, l'echo du query_string ne donnera rien puisque le remplacement bind est fait dans l'execute.

              Pascal
              If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

              Commentaire


              • #8
                Ha ok je vais tester.
                merci

                Commentaire


                • #9
                  J'ai maintenant l'erreur:
                  Code:
                  Impossible d'utiliser un argument positionnel après un argument nommé​

                  Commentaire


                  • #10
                    mon code actuel:
                    Code:
                        $query_insert = $db->getQuery(true);// Create a new query object.
                                // Insert columns.
                                
                                $columns = array('saison','num_champ','date_tarot','date_annulee','mess_alert','date_m_a_j','auteur_m_a_j');
                                // Insert values. (Pb avec NULL en Joomla4
                                //$values = array($db->quote(':saison'),$db->quote(':num_champ'),$db->quote(':date_tarot'),$db->quote(':date_annulee'),$db->quote(':mess_alert'),    $db->quote(':date_m_a_j'),$db->quote(':auteur_m_a_j'));
                                //$values = array(':saison',':num_champ',':date_tarot',':date_annulee',':mess_alert',':date_m_a_j',':auteur_m_a_j');
                                
                                // Prepare the insert query.
                                $query_insert
                                    ->insert($db->quoteName($table_calendrier_tarot))
                                    ->columns($db->quoteName($columns))
                                    //->values(implode(',', $values));
                                    ->values(':saison,:num_champ,:date_tarot,:date_annulee,:mess_alerte,:date_m_a_j,:auteur_m_a_j');
                                    
                                //boucle insertion    
                                if(sizeof($array_dates_tarot) >0){
                                    foreach($array_dates_tarot as $num_champ=>$date_tarot){
                                        $enr=false;
                                        $date_tarot= '' ? '0000-00-00' : $date_tarot ;
                                        $date_annulee= $_POST['message_annulation'][$num_champ]!='' ? 1 : 0 ;
                                        $mess_alert= $_POST['message_modif'][$num_champ]!='' ? 1 : 0 ;
                                        $date_m_a_j=date('Y-m-d');
                                        $auteur_m_a_j=$auteur;
                                        //bind values
                                        
                                        $query_insert
                                            ->bind(':saison',$saison,Joomla\Database\ParameterType::STRING)
                                            ->bind(':num_champ',$num_champ,Joomla\Database\ParameterType::INTEGER)
                                            ->bind(':date_tarot',$date_tarot,Joomla\Database\ParameterType::STRING)
                                            ->bind(':date_annulee',$date_annulee,Joomla\Database\ParameterType::INTEGER)
                                            ->bind(':mess_alert',$mess_alert,Joomla\Database\ParameterType::INTEGER)
                                            ->bind(':date_m_a_j',$date_m_a_j, Joomla\Database\ParameterType::STRING)
                                            ->bind(':auteur_m_a_j',$auteur_m_a_j,Joomla\Database\ParameterType::STRING);
                                        
                                            $db->setQuery($query_insert);
                                    
                                        $enr=$db->execute();            
                                    
                                    }
                                }​

                    Commentaire


                    • #11
                      Je pense qu'il manque des quotes au niveau de la déclaration values : ->values(':saison',':num_champ',...

                      Pascal

                      ps: après relecture de la doc, https://docs.joomla.org/J4.x:Inserti...g_JDatabase/fr , en fait, ce n'est pas la bonne piste....
                      Dernière édition par pmleconte à 10/12/2024, 09h59
                      If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                      Commentaire


                      • #12
                        L'erreur annoncée semble venir de l'appel de la fonction et non de la requête sql.

                        Pascal

                        PS : voir https://www.php.net/manual/fr/functi...func-array.php
                        If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                        Commentaire


                        • #13
                          une IA m a gentiment repondu ceci:
                          Code:
                          $query_insert = $db->getQuery(true); $columns = array('saison','num_champ','date_tarot','date_annulee','mess_alert','date_m_a_j','auteur_m_a_j');
                          $query_insert ->insert($db->quoteName($table_calendrier_tarot)) ->columns($db->quoteName($columns)) ->values('(:saison,:num_champ,:date_tarot,:date_ann ulee,:mess_alerte,:date_m_a_j,:auteur_m_a_j)');​
                          • Incorrect Placeholder Usage:
                            • The values() method expects a string representing the values to be inserted.
                            • You're directly passing placeholders like :saison without proper string formatting.
                          Explanation:
                          • By enclosing the placeholders within single quotes '(:saison,...'), you provide the correct string format for the values() method.

                          Commentaire

                          Annonce

                          Réduire
                          Aucune annonce pour le moment.

                          Partenaire de l'association

                          Réduire

                          Hébergeur Web PlanetHoster
                          Travaille ...
                          X