Comment corriger efficacement une requête SQL PDO

Résolu
msi79
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
- 2 nov. 2017 à 11:15
 SkyCrasher - 8 nov. 2017 à 09:24
Bonjour,
Je tente d'enserrer des données dans une table en utilisant PDO.
mais il semble que qu'il y a une erreur dans la requête.

voici l'erreur quand j'execute en direct dans la base de données:

#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 ':periode_etabl_bulletin,:periode_etabl_bulletin_annee,:taux_grad,:num_ordre,:mat' at line 2

voici ma requête :
$tab = array(
              ':periode_etabl_bulletin' => $_GET['periode']
              ,':periode_etabl_bulletin_annee' => $_GET['annee']
              ,':taux_grad' => $_POST["taux_grad"]
			  ,':num_ordre' => $_POST["num_ordre"]
              ,':matricule' => $matricule
              ,':noms' => $rows_pers["nom"]
              ,':prenoms' => $rows_pers["prenom"]
              ,':nationalite' => $rows_pers["nationalie"]
              ,':nb_mois_trav_effect' => $n_nbre_mois
              ,':date_dept_cg' => ''
              ,':cg_ann_acqui' => ''
              ,':fonction' => $rows_pers["fonction"]
              ,':date_entree' => $rows_pers["date"]
              ,':ctg' => ''
              ,':sit_fam' => $rows_pers["sit_fam"]
              ,':chef_fm' => $rows_pers["chef_fm"]
              ,':homfem' => $rows_pers["sexe"]
              ,':nb_enft' => '0'
              ,':nb_part' => ''
              ,':num_cnps' => $rows_pers["num_cnps"]
              ,':salaire_brut' => $rows_sal[$lemois]
              ,':nbrejw' => '30'
              ,':sursalaire' => '0'
              ,':prim_resp' => '0'
              ,':prim_gard' => '0'
              ,':indem_transp' => '0'
              ,':type_sal' => 'Mensuel'
              ,':paymnt' => 'Espece'
              ,':ma_session' => 'Mis79'
              ,':date' => $date_utc
              ,':id_get' => $id_pers
              ,':jour' => $jour
              ,':mois' => $mois
              ,':annee' => $annee
              );
$sql_absc = "INSERT INTO bulletin(periode_etabl_bulletin,periode_etabl_bulletin_annee,taux_grad,num_ordre,matricule,noms,prenoms,nationalite,nb_mois_trav_effect,date_dept_cg,cg_ann_acqui,fonction,date_entree,ctg,sit_fam,chef_fm,homfem,nb_enft,nb_part,num_cnps,salaire_brut,nbrejw,sursalaire,prim_resp,prim_gard,indem_transp,type_sal,paymnt,ma_session,date,id_get,jour,mois,annee) 
        VALUES (:periode_etabl_bulletin,:periode_etabl_bulletin_annee,:taux_grad,:num_ordre,:matricule,:noms,:prenoms,:nationalite,:nb_mois_trav_effect,:date_dept_cg,:cg_ann_acqui,:fonction,:date_entree,:ctg,:sit_fam,:chef_fm,:homfem,:nb_enft,:nb_part,:num_cnps,:salaire_brut,:nbrejw,:sursalaire,:prim_resp,:prim_gard,:indem_transp,:type_sal,:paymnt,:ma_session,:date,:id_get,:jour,:mois,:annee)";			  
 $sql_absc;

$req_absc = $bdd->prepare($sql_absc);
// cette méthode te retourne true/false si ça a réussi/échoué
$result = $req_absc->execute($tab);

// Du coup, on peux tester sur le retour et afficher l'erreur en cas de soucis
if (!$result) {
    // ça t'affiche juste un code. C'est suffisant en prod pour que l'utilisateur te fasse un retour
    echo "Une erreur est survenue : " . $req_absc->errorCode();

    // Mais en dev, pour comprendre, tu peux faire ça :
    print_r($req_absc->errorInfo());
}



voici la structure de ma table:

CREATE TABLE IF NOT EXISTS `bulletin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`periode_etabl_bulletin` varchar(15) NOT NULL,
`periode_etabl_bulletin_annee` varchar(10) NOT NULL,
`taux_grad` int(10) NOT NULL,
`num_ordre` varchar(30) NOT NULL,
`matricule` varchar(30) NOT NULL,
`noms` varchar(200) NOT NULL,
`prenoms` varchar(200) NOT NULL,
`nationalite` varchar(120) NOT NULL,
`nb_mois_trav_effect` varchar(15) NOT NULL,
`date_dept_cg` varchar(30) NOT NULL,
`cg_ann_acqui` varchar(60) NOT NULL,
`fonction` varchar(150) NOT NULL,
`date_entree` varchar(60) NOT NULL,
`ctg` varchar(30) NOT NULL,
`sit_fam` varchar(60) NOT NULL,
`chef_fm` varchar(10) NOT NULL,
`homfem` varchar(60) NOT NULL,
`nb_enft` varchar(10) NOT NULL,
`nb_part` varchar(10) NOT NULL,
`num_cnps` varchar(30) NOT NULL,
`salaire_brut` int(30) NOT NULL,
`nbrejw` int(10) NOT NULL,
`sursalaire` varchar(30) NOT NULL,
`prim_resp` varchar(30) NOT NULL,
`prim_gard` varchar(30) NOT NULL,
`indem_transp` varchar(30) NOT NULL,
`type_sal` varchar(80) NOT NULL,
`paymnt` varchar(50) NOT NULL,
`ma_session` varchar(100) NOT NULL,
`date` datetime NOT NULL,
`id_get` int(11) NOT NULL,
`jour` varchar(30) NOT NULL,
`mois` varchar(30) NOT NULL,
`annee` varchar(30) NOT NULL,
`date2` varchar(30) NOT NULL,
`id_period` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

3 réponses

SkyCrasher
Messages postés
45
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2022

7 nov. 2017 à 09:04
Bonjour, je trouve bizarre qu'il y ait $_POST et $_GET, alors que dans un formulaire on choisit soit l'un soit l'autre.
Non?
0
jordane45
Messages postés
35417
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
356
7 nov. 2017 à 12:26
Bonjour,


Pour commencer, ... où est passé la récupération PROPRE des variables AVANT de les utiliser ... tel que je te l'explique depuis au moins 1 an ????

Il serait bien que tu commences ENFIN à suivre le contenu de ce lien http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code et que je n'ai pas à te répéter toujours les mêmes choses à chaque fois que tu viens poser une question sur ce forum !


Ensuite, pour ce qui est de ton souci, peux tu essayer d'écrire la requête comme ceci puis de voir si tu as toujours le même message d'erreur :
<?php

$sql_absc = "INSERT INTO bulletin(
					periode_etabl_bulletin,
					periode_etabl_bulletin_annee,
					taux_grad,
					num_ordre,
					matricule,
					noms,
					prenoms,
					nationalite,
					nb_mois_trav_effect,
					date_dept_cg,
					cg_ann_acqui,
					fonction,
					date_entree,
					ctg,
					sit_fam,
					chef_fm,
					homfem,
					nb_enft,
					nb_part,
					num_cnps,
					salaire_brut,
					nbrejw,
					sursalaire,
					prim_resp,
					prim_gard,
					indem_transp,
					type_sal,
					paymnt,
					ma_session,
					date,
					id_get,
					jour,
					mois,
					annee
					) 
			VALUES (
					:periode_etabl_bulletin,
					:periode_etabl_bulletin_annee,
					:taux_grad,
					:num_ordre,
					:matricule,
					:noms,
					:prenoms,
					:nationalite,
					:nb_mois_trav_effect,
					:date_dept_cg,
					:cg_ann_acqui,
					:fonction,
					:date_entree,
					:ctg,
					:sit_fam,
					:chef_fm,
					:homfem,
					:nb_enft,
					:nb_part,
					:num_cnps,
					:salaire_brut,
					:nbrejw,
					:sursalaire,
					:prim_resp,
					:prim_gard,
					:indem_transp,
					:type_sal,
					:paymnt,
					:ma_session,
					:date,
					:id_get,
					:jour,
					:mois,
					:annee
				)";	


Assures toi également que ton fichier est bien encodé en utf8
Rappel : http://www.commentcamarche.net/faq/47069-html-php-caracteres-accentues-et-l-utf8#1-verifiez-l-encodage-des-fichiers
0
Regarde aussi tes guillemets:
$_POST["num_ordre"] et $_GET['periode']
0