Enregistrer dans une table

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

  • [RÉGLÉ] Enregistrer dans une table

    Bonjour,
    J'ai besoin d’enregistrer des infos dans une table, je suis la doc https://docs.joomla.org/Inserting,_U...g_JDatabase/fr

    Je souhaite insérer les infos présentes dans un formulaire.

    La question, dois-je y mettre l'id et ordering ? (Et laisser vide ces champs ?)

    Code:
    <form>
            <input type = "text"  name = "id" value = ""/>
            <input type = "text"  name = "ordering" value = ""/>
            <input type = "text"  name = "checked_out" value = ""/>
            <input type = "text"  name = "checked_out_time" value = ""/>
            <input type = "text"  name = "created_by" value = ""/>
            <input type = "text"  name = "modified_by" value = ""/>        
            <input type = "text"  name = "state" value = ""/>
            <input type = "text"  name = "User_id" value = "<?php echo $IdUser; ?>"/>
            <input type = "text"  name = "date" value = "<?php echo $dateJMA; ?>"/>
            <input type = "text"  name = "date_h" value = "<?php echo $heure; ?>"/>
            <input type = "text"  name = "lat" value = ""/>
            <input type = "text"  name = "lng" value = ""/>
            <input type = "button" id = "more_gps" onclick = "" value = ""/>
    </form>
    Qui pourrait m'expliquer cette ligne :
    Code PHP:
    $values = array(1001$db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1); 
    Code PHP:
    <?php
    // Enregistrer dans une table  
    // Get a db connection.
    $db JFactory::getDbo();
    // Create a new query object.
    $query $db->getQuery(true);
    // Insert columns.
    $columns = array('id','checked_out','checked_out_time','created_by','modified_by','ordering','state','user_id','date','date_h','lat','lng');
    // Insert values.
    $values = array(1001$db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1);
    // Prepare the insert query.
    $query
        
    ->insert($db->quoteName('#__efgeoloc_tracking'))
        ->
    columns($db->quoteName($columns))
        ->
    values(implode(','$values));
    // Set the query using our newly populated query object and execute it.
    $db->setQuery($query);
    $db->execute();
    ?>
    Je ne sais pas quel code mettre dans le bouton.
    Toutefois l'idéal serait que les infos soient enregistrée automatiquement à la connexion de la page.


    J'ai cette erreur : Erreur: 1136 Column count doesn't match value count at row 1
    J'ai pourtant bien toutes les colonnes de la table et les bons noms de colonnes.

    Quelqu'un sait-il pourquoi ?

    Cordialement.

    Eric
    Dernière édition par Agrepe à 06/02/2020, 15h32

  • #2
    Bonjour Eric,

    Tu as 12 zones à remplir dans ta base et seulement 4 dans $values....

    Au niveau de id, cela dépend si, dans ta table, cette zone est en autoincrément ou non.

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

    Commentaire


    • #3
      Bonjour Pascal,
      Oui les champs id et ordering sont auto incrémentés.
      Il y a des champs vides, mais est-ce obligatoire d'envoyer quelque chose ?

      Est-ce la valeur "1001" de $value qui détermine la quantité de colonnes à remplir ?
      Je n'ai pas trouvé d'info à ce sujet.
      Si c'est la cas 1 signifierait que je n'envoie rien et 0 la valeur que je prendrais dans le formulaire ?
      Dernière édition par Agrepe à 06/02/2020, 15h49

      Commentaire


      • #4
        Je ne comprends pas : tu as une array $columns (12 élements) et une array $values (4 éléments).

        Le message d'erreur te dit que tu n'as pas le même nombre d'éléments dans ces 2 arrays. Insert prend tes 2 arrays et essaie de remplir l'une avec les informations de l'autre.

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

        Commentaire


        • #5
          J'ai bien compris cela, mais est-ce la chaîne de 1 et 0 de $values qui détermine la quantité de colonnes ?

          Commentaire


          • #6
            salut, et non, ce n est pas ca.
            Ce qui contient le nombre de colonnes est le contenu de la variable $columns. C'est un tableau avec le nom de chacunes .Si tu veux ajouter des champs utilise ceci dans la requete: ,'champ', ou en supprimer en les supprimant de $colums.

            Le 1001 est la valeur associée à la colonne id.

            Question, les champs de ton formulaire sont des champs de parametres d'article Joomla, sont ils reellement utiles ?
            Met la liste des champs existant dans ta base de données, on y verras plus clair.

            Commentaire


            • #7
              Bonjour lefabdu51,
              Merci pour ton aide.
              Je développe un petit composant qui permettra de géolocaliser les visiteurs d'un site en vu de statistiques.
              Tous les champs mentionnés sont présents (et uniquement ceux-là, dans la table)
              En ce qui concerne les champs de formulaires, ils me permettent pour le moment de contrôler si toutes les infos sont correctes.
              Cordialement.
              Eric

              Commentaire


              • #8
                Voici la structure de la table:

                Cliquez sur l'image pour l'afficher en taille normale  Nom : Capture_tracking_table.JPG  Affichages : 0  Taille : 64,5 Ko  ID : 2012633

                Dans la doc Joomla, je n'ai pas vu où était expliqué comment transmettre les infos. (Celles-que j'affiche dans le formulaire)

                Cordialement.
                Eric

                Commentaire


                • #9
                  Hello.

                  La correspondance 1 à 1 entre columns et values ne correspond pas.

                  Il faut aussi comprendre que de surcroit tu ne peux pas placer $db->quote('custom.message') dans checked_out qui correspond au verrou (qui est donc un entier) et encore moins $db->quote('Inserting a record using insert()') dans checked_out_time qui est le champ correspondant à la date/heure de pose du verrou et donc un datetime !

                  Les champs spécifiques à Joomla (au framework) comme 'checked_out','checked_out_time','created_by','modified_by','ordering','state' sont "normalement" remplis automatiquement dans ta classe dérivée de JTable (méthodes check et store).

                  Pour les enregistrements individuels (donc à partir d'un formulaire JForm) tu devrais utiliser un model héritant de Jmodelform.

                  Le plus simple pour toi serait de t'inspirer d'un composant livré avec Joomla (com_contact par exemple, vue contact).

                  Bon dev.
                  A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                  Rejoignez le Joomla Users Groupe Alsace...
                  roland_d_alsace va-t-il devenir roland_du_grand_est ?

                  Commentaire


                  • #10
                    Bonsoir,
                    J'ai carrément tout modifier, j'obtiens bien maintenant un formulaire qui me permet d'écrire dans la table.

                    Voici la partie du formulaire qui me pose problème:
                    Code:
                    $lat = "40.00000";
                    $lng = 3.00000";            
                    
                        <?php echo $this->form->renderField('lat'); ?>
                        <?php echo $this->form->renderField('lng'); ?>
                    Je souhaiterai remplir automatiquement mes champs lat et lng avec les valeurs des variables.

                    Comment puis-je faire cela ?

                    Cordialement.

                    Eric
                    Dernière édition par Agrepe à 06/02/2020, 23h17

                    Commentaire


                    • #11
                      Je réponds à ma question précédente.

                      J'ai remplacé

                      <?php echo $this->form->renderField('lat');?> par un Input <input type="text" name="jform[lat]" value="<?php echo $lat; ?>" />

                      Les infos s'enregistrent bien dans la table.

                      J'ai une autre question pour compléter les fonctionnalités de mon fichier, j'ouvre une nouvelle discussion pour ça.
                      Dernière édition par Agrepe à 06/02/2020, 23h17

                      Commentaire


                      • #12
                        Envoyé par Agrepe Voir le message
                        Je réponds à ma question précédente.

                        J'ai remplacé

                        <?php echo $this->form->renderField('lat');?> par un Input <input type="text" name="jform[lat]" value="<?php echo $lat; ?>" />

                        Les infos s'enregistrent bien dans la table.

                        J'ai une autre question pour compléter les fonctionnalités de mon fichier, j'ouvre une nouvelle discussion pour ça.
                        Dommage, car tu perds tout l’intérêt d'utiliser JForm.

                        Si un jour tu veux y revenir, la methode qu'il faut utilise est loadFormData() qu'il faut définir dans ton model de vue hérité de JModelAdmin (même en front bien sûr)

                        Par exemple :
                        Code PHP:
                        class MoncomposantModelMavue extends JModelAdmin
                        {
                        .....
                            
                        /**
                             * Method to get the data that should be injected in the form.
                             *
                             * @return  mixed  The data for the form.
                             *
                             * @since   1.6
                             */
                            
                        protected function loadFormData()
                            {
                                
                        // Check the session for previously entered form data.
                                
                        $app JFactory::getApplication();
                                
                        $data $app->getUserState(...); // recherche les donnée en session afin d'eviter des requetes multiple en DB

                                
                        if (empty($data))
                                {
                                    
                        $data $this->getItem();
                                }

                                
                        // If there are params fieldsets in the form it will fail with a registry object
                                
                        if (isset($data->params) && $data->params instanceof Registry)
                                {
                                    
                        $data->params $data->params->toArray();
                                }

                                
                        $this->preprocessData(...);

                                return 
                        $data;
                            }
                        .....

                        Tu remarqueras que cette méthode appele bien getItem qui effectue la lecture en DB.

                        Cette méthode ne devant être redéfinie que si tu as des traitement particuliers.

                        Dans ton cas je me demande si ton formulaire est bien trouvé par le framework et s'il ne comporte pas d'erreur xml.
                        En général le problème vient plutôt de là

                        Ensuite il faut aussi definir dans le même model :
                        Code PHP:
                            /**
                             * Method to get the record form.
                             *
                             * @param   array    $data      Data for the form.
                             * @param   boolean  $loadData  True if the form is to load its own data (default case), false if not.
                             *
                             * @return  mixed  A JForm object on success, false on failure
                             *
                             * @since   1.6
                             */
                            
                        public function getForm($data = array(), $loadData true)
                            {
                                
                        $form $this->loadForm('nomducomposant.nomdexml''club', array('control' => 'jform''load_data' => $loadData)); // appele loadformdata

                                
                        if (empty($form))
                                {
                                    return 
                        false;
                                }

                                return 
                        $form;
                            } 
                        Et dans la vue (methode display()) on appele la methode getForm du model qui lance le tout
                        Code PHP:
                        $this->form  $this->get('Form'); 
                        Ainsi la boucle est bouclée.
                        Dernière édition par roland_d_alsace à 08/02/2020, 11h29
                        A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                        Rejoignez le Joomla Users Groupe Alsace...
                        roland_d_alsace va-t-il devenir roland_du_grand_est ?

                        Commentaire

                        Annonce

                        Réduire
                        Aucune annonce pour le moment.

                        Partenaire de l'association

                        Réduire

                        Hébergeur Web PlanetHoster
                        Travaille ...
                        X