Insertion de données d'un formulaire dans une base.

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous,

Je rencontre un nouveau soucis dans la création de mon premier module. Cette fois-ci je n'arrive pas à insérer des données dans des tables que j'ai créées à partir de mon formulaire.

Voici le code de mon formulaire :

function form_basketfacile_domicile($form, &$form_state) {
       
        $form['#tree'] = TRUE;
       
        $form['description'] = array(
            '#type' => 'item',
            '#title' => t("Formulaire de saisie de matchs"),
        );
       
        if (empty($form_state['numHoraire'])) {
            $form_state['numHoraire'] = 1;
        }
       
        if (empty($form_state['numArbitre'])) {
            $form_state['numArbitre'] = 1;
        }
       
        for ($i = 1; $i <= $form_state['numHoraire']; $i++) {
           
            if ($form_state['numHoraire'] > $i) {
               
                $form['horaire'][$i] = array(
                    '#type' => 'fieldset',
                    '#title' => t('Match @num validé !', array('@num' => $i)),
                    '#collapsible' => TRUE,
                    '#collapsed' => TRUE,
                );
               
            }else{
               
                $form['horaire'][$i] = array(
                    '#type' => 'fieldset',
                    '#title' => t('Match @num', array('@num' => $i)),
                    '#collapsible' => TRUE,
                    '#collapsed' => FALSE,
                );
               
            }
           
            $form['horaire'][$i]['categorie'] = array(
                '#type' => 'select',
                '#options' => array( 1 => 'Baby-Basket',
                    2 => 'Mini-Poussins',
                    3 => 'Mini-Poussines',
                    4 => 'Poussins',
                    5 => 'Poussines',
                    6 => 'Benjamins',
                    7 => 'Benjamines',
                    8 => 'Minimes Filles',
                    9 => 'Minimes Garçons',
                    10 => 'Cadettes',
                    11 => 'Cadets',
                    12 => 'Juniors',
                    13 => 'Seniors Filles',
                    14 => 'Seniors Garçons'),
                '#title' => t("Catégorie de l'équipe : "),
                '#required' => TRUE,
            );

            $form['horaire'][$i]['niveau'] = array(
                '#type' => 'select',
                '#options' => array( 1 => '',
                    2 => 'D4',
                    3 => 'D3',
                    4 => 'D2',
                    5 => 'D1',
                    6 => 'Elite',
                    7 => 'Accès Région',
                    8 => 'Régionale 3',
                    9 => 'Régionale 2',
                    10 => 'Régionale 1',
                    11 => 'Nationale 3',
                    12 => 'Nationale 2',
                    13 => 'Nationale 1',),
                '#title' => t("Niveau : "),
            );

            $form['horaire'][$i]['heureConvocation'] = array(
                '#type' => 'textfield',
                '#title' => 'Heure de convocation',
                '#description' => 'Format HH:MM',
                '#default_value' => '13:30',
                '#required' => TRUE,
                '#size' => 4,
            );

            $form['horaire'][$i]['heureMatch'] = array(
                '#type' => 'textfield',
                '#title' => 'Heure du match',
                '#description' => 'Format HH:MM',
                '#default_value' => '14:00',
                '#required' => TRUE,
                '#size' => 4,
            );

            $form['horaire'][$i]['adversaires'] = array(
                '#type' => 'textfield',
                '#title' => 'Equipe adverse',
                '#required' => TRUE,
            );

            $form['horaire'][$i]['marqueur'] = array(
                '#type' => 'textfield',
                '#title' => 'Marqueur',
                '#required' => TRUE,
                '#autocomplete_path' => 'basketfacile/autocomplete',
            );

            $form['horaire'][$i]['chronometreur'] = array(
                '#type' => 'textfield',
                '#title' => 'Chronométreur',
                '#required' => TRUE,
                '#autocomplete_path' => 'basketfacile/autocomplete',
            );    

            $form['horaire'][$i]['arbitre1'] = array(
                '#type' => 'textfield',
                '#title' => 'Arbitre 1',
                '#required' => TRUE,
                '#autocomplete_path' => 'basketfacile/autocomplete',
            );

            $form['horaire'][$i]['arbitre2'] = array(
                '#type' => 'textfield',
                '#title' => 'Arbitre 2',
                '#autocomplete_path' => 'basketfacile/autocomplete',
            );
           
            $form['horaire'][$i]['bar'] = array(
                '#type' => 'textfield',
                '#title' => 'Familles de bar',
                '#required' => TRUE,
            );

        }

        $form['envoyer'] = array(
            '#type' => 'submit',
            '#value' => t('Envoyer'),
        );

        $form['ajoutHoraire'] = array(
                '#type' => 'submit',
                '#value' => t('Ajouter un match'),
                '#submit' => array('form_basketfacile_ajoutHoraire'),
        );

        if ($form_state['numHoraire'] > 1) {
           
            $form['supprimerHoraire'] = array(
                '#type' => 'submit',
                '#value' => t('Effacer le dernier match'),
                '#submit' => array('form_basketfacile_supprimerHoraire'),
                '#limit_validation_errors' => array(),
            );

        }

        return $form;

    }

Il permet comme vous pouvez le constater de créer des plannings de matchs. Le but est maintenant d'insérer les informations saisies dans ma base de données. Mais je n'y arrive pas. J'ai créé un fonction "submit" qui enregistre pour le moment que certaine informations :

function form_basketfacile_domicile_submit($form, &$form_state) {
       
        for ($i = 1; $i <= $form_state['numHoraire']; $i++){
           
            db_insert('match')
            ->fields(array(
               
                'categorie' => $form_state['values']['horaire'][$i]['categorie'],
                'niveau' => $form_state['values']['horaire'][$i]['niveau'],
                'heureconvoc' => $form_state['values']['horaire'][$i]['heureConvocation'],
                'heurematch' => $form_state['values']['horaire'][$i]['heureMatch'],
               
            ))
            ->execute();
           
        }
       
    }

Cette fonction semble fonctionner en partie car elle récupère bien les informations mais elles ne sont pas insérées dans la base et ce message d'erreur apparaît lors de l'envoie du formulaire :

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'match (categorie, niveau, heureconvoc, heurematch) VALUES ('2', '3', '13:30', '1' at line 1: INSERT INTO {match} (categorie, niveau, heureconvoc, heurematch) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3); Array ( [:db_insert_placeholder_0] => 2 [:db_insert_placeholder_1] => 3 [:db_insert_placeholder_2] => 13:30 [:db_insert_placeholder_3] => 14:00 ) in form_basketfacile_domicile_submit() (line 182 of C:\xampp\htdocs\TUTO\sites\all\modules\basketfacile\form_basketfacile.inc).

Je comprend le message, il y a donc un problème de syntaxe mais je ne vois pas lequel...

Ma base de données "MATCH" ressemble à ça :

NUMMATCH bigint(4)
NUMCLUB varchar(128)
NUMPLANNING int(11)
CATEGORIE varchar(128
NIVEAU varchar(128
HEURECONCOV char(5)
HEUREMATCH char(5)
domicile tinyint(1)

Quelqu'un à une idée de ce qui ne fonctionne pas ?

Merci !

Forum : 
Version de Drupal : 

hello,

à mon avis c'est le 13:30 du HEURECONCOV qui pose problème...comment as-tu créés tes tables ? dans le .install de ton module ?

cela dit, pourquoi ne crées-tu pas un content type spécifique avec les champs dont tu as besoin ? un CMS ça sert à ça ! et te débarrasser justement du sale boulot d'insertion / création des tables ...

Merci de répondre aussi vite

Je débute dans le développement et l'utilisation de drupal, et dans le cadre d'un prochain stage en entreprise pour mon BTS je cherche à en apprendre un peu plus par mes propre moyen pour être plus opérationnel.

C'est pourquoi je cherche plus à développer mon propre module plutôt que de créer un content type. Mais ce n'est pas dit que je ne me tourne pas vers cette solution...

Pour en revenir à mon problème je n'est pas créé les tables dans le .install de mon module, je les ai créées en SQL dans ma base de données. Peut-être es-ce ça le problème.

J'ai aussi essayé de modifier le 13:30 par autre chose mais ça ne marche pas non plus. Le même message d'erreur apparaît...

Non le nom de la table est bien "match". Et je pense que les noms sont insensible à la casse non ?

Est ce important que la ou les tables soient crées lors du .install du module ?

Merci

EDIT :

J'ai trouvé une solution à mon problème. J'ai en fait recréé une base de données avec tous mes champs et j'y ai ajouté tous mes résultats d'insertion. Le code est donc le suivant :

function form_basketfacile_domicile_submit($form, &$form_state) {
       
        for ($i = 1; $i <= $form_state['numHoraire']; $i++){
                   
            db_insert('matchs')
           
            ->fields(array(
                'categorie' => $form_state['values']['horaire'][$i]['categorie'],
                'niveau' => $form_state['values']['horaire'][$i]['niveau'],
                'heureconvoc' => $form_state['values']['horaire'][$i]['heureConvocation'],
                'heurematch' => $form_state['values']['horaire'][$i]['heureMatch'],
                'adversaire' => $form_state['values']['horaire'][$i]['adversaires'],
                'marqueur' => $form_state['values']['horaire'][$i]['marqueur'],
                'chronometreur' => $form_state['values']['horaire'][$i]['chronometreur'],
                'arbitre1' => $form_state['values']['horaire'][$i]['arbitre1'],
                'arbitre2' => $form_state['values']['horaire'][$i]['arbitre2'],
                'bar' => $form_state['values']['horaire'][$i]['bar'],
                'date' => date('d-m-Y G:i'),
            ))
            ->execute();
           
            drupal_set_message(t('Les matchs ont été enregistrés.'));
           
        }
       
    }