Wolf18 Posted January 22, 2013 Share Posted January 22, 2013 Bonjour à toutes et tous, voila que je suis bien embêté, j'ai galéré toute la soirée hier (voir une bonne partie de la nuit) sur une requête INSERT qui ne fonctionne pas. Pourtant je ne suis pas fou, j'ai repris une requête existante d'un autre de mes sites (hébergé sur le même serveur) afin de la modifier. Le problème est qu'aucune ligne n'est insérée dans la base de données alors que cela devrait être le cas ! La ligne en question : mysql_query("INSERT INTO $matable VALUES ('', '$categorie', '$souscategorie', '$titre', '$titre_clean', '$description', '$page', '$url_image', '$user_id', '$ip', '$date', '0', '$source', '0', '0')"); Bref pour moi ça semble correct ! J'ai tout vérifié et revérifié, je n'ai pas fait de faute de frappe sur mes variables, sur le nom de ma table. Bref c'est ok ! Sauf qu'en rajoutant un die mysql_error en fin de requête pour comprendre, j'ai le message d'erreur suivant : Incorrect integer value: '' for column 'id' at row 1 Comme je n'aime pas venir poster un sujet d'aide pour rien. Je suis allé chercher sur Google, j'ai trouvé pas mal de sujet, visiblement c'est mysql5 qui génère cette erreur car le champ id est vide ! Normal quand on sait qu'il doit s'auto-incrémenter non ? J'ai tout essayé, remplacer '' par NULL, ne rien mettre du tout en lui mettant le nom des colonnes sauf celle de l'id, etc... Rien à y faire, j'ai suivi tous les conseils trouvés ici et là, j'ai même essayé de modifier ma config mysql sur le serveur. Rien ne fonctionne ! Encore une fois ce que je ne comprends pas, c'est que mes requêtes fonctionnent sur le même principe sur mes autres sites, hébergés sur le même serveur, donc même configuration PHP/MySQL. Un mystère pour moi ! Je suis un peu bloqué. Avez-vous déjà eu ce message d'erreur ? Comment y remédier ? Si vous avez besoin de plus d'infos je suis à votre disposition, cela va de soi ! Link to comment Share on other sites More sharing options...
Dadou Posted January 22, 2013 Share Posted January 22, 2013 En utilisant la syntaxe complète pour insérer dans Mysql : INSERT INTO nom_table (nom_colonne_1, nom_colonne_2) VALUES (valeur_1, valeur_2) Sans utiliser utiliser la colonne de la clé primaire Link to comment Share on other sites More sharing options...
Wolf18 Posted January 22, 2013 Author Share Posted January 22, 2013 J'avais déjà essayé et ça ne marchait pas non plus. Je viens de réessayer par acquis de conscience comme on dit, et il est vrai, j'ai un autre message d'erreur... Incorrect string value: '\xEAte d\...' for column 'description' at row 1 Pourtant mon champ description est un champ tout ce qu'il y a de plus classique (VARCHAR 255). Franchement c'est à s'arracher les cheveux là ! Première fois que je rencontre un tel soucis, et visiblement mes autres requêtes INSERT ne fonctionnent pas non plus... Si je fais la requête SQL dans PhpMyAdmin elle fonctionne et insert ma ligne ! Link to comment Share on other sites More sharing options...
Dadou Posted January 22, 2013 Share Posted January 22, 2013 Je pense que tu as probablement un caractère à la con qui casse la requête. Personnellement, je n'utilise mysql_query qui est obslete dans PHP 5.5 et qui est voué à disparaitre, mais plutôt PDO avec des requêtes préparées, et l'usage de bindparam qui permet d'être tranquille de ce côté Link to comment Share on other sites More sharing options...
jcaron Posted January 22, 2013 Share Posted January 22, 2013 +1 sur le fait que pour utiliser un auto-increment, soit tu ne dois pas préciser du tout la colonne (et donc utiliser une liste de colonnes: INSERT INTO table (liste des colonnes) VALUES (liste des valeurs)), soit passer "default". Au delà, passer des variables par concaténation, c'est très dangereux, et sujet à de nombreuses erreurs. Il suffit qu'il y ait un ' dans un des champs, et plof, ça ne marche plus. Et ça peut être très nettement pire si les variables viennent directement ou indirectement de l'extérieur (cf injection SQL). Au minimum, utilise mysql_real_escape_string sur chacune des variables passées, au mieux utilise PDO. Jacques. Link to comment Share on other sites More sharing options...
Wolf18 Posted January 23, 2013 Author Share Posted January 23, 2013 Merci pour les conseils en tout cas. Je vais regarder tout ça... Pour les variables normalement il ne devrait pas y avoir de ' qui se balade tout seul avec un addslashes($variable) ? Link to comment Share on other sites More sharing options...
Licorne Posted January 23, 2013 Share Posted January 23, 2013 Bonjour, C'est certainement un caractère spécial qui empêche les requête sql. Link to comment Share on other sites More sharing options...
jcaron Posted January 23, 2013 Share Posted January 23, 2013 Addslashes gère le cas général, alors que mysql_real_escape_string gère les choses exactement comme il faut pour mysql. Il y a tout un tas de cas de figure qui ne passent pas avec addslashes. Jacques. Link to comment Share on other sites More sharing options...
Wolf18 Posted January 23, 2013 Author Share Posted January 23, 2013 Cela ne fonctionne toujours pas... J'ai essayé la fonction mysql_real_escape_string() mais rien n'y fait, ou alors j'ai mal compris le principe ! Voici ma requête : $sql = 'INSERT INTO '.$table_articles.' ( categorie, souscategorie, titre, titre_clean, description, page, image, auteur, ip, date, vu, source, temperature, nb_commentaires) VALUES ('; $sql .= "'" . mysql_real_escape_string($categorie) . "',"; $sql .= "'" . mysql_real_escape_string($souscategorie) . "',"; $sql .= "'" . mysql_real_escape_string($titre) . "',"; $sql .= "'" . mysql_real_escape_string($titre_clean) . "',"; $sql .= "'" . mysql_real_escape_string($description) . "',"; $sql .= "'" . mysql_real_escape_string($page) . "',"; $sql .= "'" . mysql_real_escape_string($url_image) . "',"; $sql .= "'" . mysql_real_escape_string($user_id) . "',"; $sql .= "'" . mysql_real_escape_string($ip) . "',"; $sql .= "'" . mysql_real_escape_string($date) . "',"; $sql .= "'" . mysql_real_escape_string($vide) . "',"; $sql .= "'" . mysql_real_escape_string($source) . "',"; $sql .= "'" . mysql_real_escape_string($vide) . "',"; $sql .= "'" . mysql_real_escape_string($vide) . "')";mysql_query($sql); Sachant que comme indiqué, j'ai effectué un stripslashes sur toutes mes variables au préalable... Le résultat renvoyé avec les champs de mon formulaire (avec un simple echo $sql) : INSERT INTO site_articles ( categorie, souscategorie, titre,titre_clean, description, page, image, auteur, ip, date, vu, source,temperature, nb_commentaires) VALUES ('All','articles','En attendantGTA5, à 86 ans elle joue à GTAIV','en-attendant-gta5-a-86-ans-elle-joue-a-gta-iv','Cette dame de 86ans joue à Grand Theft Auto IV en attendant la sortie de GTA V. Grâce àla Playstation 3 Hilda Knott maintient son activité cérébrale,incroyable non ?','Bonjour à tous,\r\n\r\nqui pensaitque les jeux vidéo étaient réservés aux jeunes ? Vous l\'avez surementcru vous aussi et nous avons la preuve que les jeux intéressent aussiparfois nos ainés ! La preuve avec cette grand mère de 86 qui joue à GTAIV en attendant la sortie de GTA5.\r\n\r\nHildaKnott, cette mamie interviewée par BBC affirme que le fait de jouermaintien son activité cérébrale. Cela lui sert plus de prétexte car elleavoue volontiers qu\'elle adore jouer sur sa Playstation 3 pendantplusieurs heures. Parmi ces jeux préférés on retrouve la saga des Grand Theft Auto,Disgaea 4 : A Promise Unforgotten et d\'autres encore. Cela faitmaintenant plus de quarante ans qu\'elle joue et ce n\'est pas prêt dechanger.\r\n\r\n\r\n\r\nUne chose est sûre, cette dame ne sera pas concernée par l\'interdiction probable de GTA 5 aux mineurs en France...\r\n\r\nVouspensez toujours que les jeux vidéos sont réservés aux jeunes?','upload/2013/01/2-1358956026.jpg','2','109.213.9.176','2013-01-2316:47:06','0','http://www.gta5france.com/le-jeu/a','0','0') En en gros cela me semble correct mais la table de ma base de données reste vierge... Et au cas où, la structure de ma table dont il est question. CREATE TABLE IF NOT EXISTS `site_articles` ( `id` int(20) NOT NULL auto_increment, `categorie` varchar(25) NOT NULL, `souscategorie` varchar(25) NOT NULL, `titre` varchar(150) NOT NULL, `titre_clean` varchar(175) NOT NULL, `description` varchar(255) NOT NULL, `page` text NOT NULL, `image` varchar(255) NOT NULL, `auteur` int(11) NOT NULL, `ip` varchar(15) NOT NULL, `date` datetime NOT NULL, `vu` int(11) NOT NULL, `source` varchar(255) NOT NULL, `temperature` varchar(10) NOT NULL, `nb_commentaires` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; EDIT: après quelques tests, si je ne mets pas de caractères accentués ça semble passer et la ligne est insérée, avec ça ne passe plus ! Comment faire dans ce cas ? L'interclassement de ma table ?Les champs concernés semblent être "page", "description" et "titre" Link to comment Share on other sites More sharing options...
Dadou Posted January 23, 2013 Share Posted January 23, 2013 Mais non, si tu utilises mysql_real_escape_string, tu ne dois pas utiliser stripslashes, mysql_real_escape_string va se demerder tout seul Link to comment Share on other sites More sharing options...
Wolf18 Posted January 23, 2013 Author Share Posted January 23, 2013 Je viens de les enlever et ça ne change rien. Par contre je précise à nouveau, sans caractère accentué ça fonctionne, la ligne est insérée. Dès qu'il y a un accent ça ne marche plus... Précision également, le formulaire est envoyé en (car une image est également chargée) : enctype="multipart/form-data" Merci de votre patience et de votre aide en tout cas. Link to comment Share on other sites More sharing options...
Dadou Posted January 23, 2013 Share Posted January 23, 2013 Ah, alors problème d'encodage d'un fichier, qui fait que le mysql_real_escape_string ou le addslashe est perturbé Link to comment Share on other sites More sharing options...
Popular Post Portekoi Posted January 23, 2013 Popular Post Share Posted January 23, 2013 Ouvre ton script avec NotePad++ puis va dans "Encoding". Tu as quoi de sélectionner? Tu as essayé avec un Utf8_Encode ou inversement? Et ton champ Mysql, il est encodé en quoi? 1 Link to comment Share on other sites More sharing options...
Ernestine Posted January 23, 2013 Share Posted January 23, 2013 Si tu es sur mutualisé, il y a des chances que le magic quote soit activé (ce qui a pour effet d'échapper les données de formulaire), auquel cas il est bon de faire un stripslashes sur les données récupérées depuis un formulaire, puis de leur appliquer le mysql_real_escape_string au moment de les insérer. Apparemment ta table est créée avec le default charset latin1. Si ton fichier php n'est pas en utf8, alors vérifie que tu n'aurais pas un mysql_query("SET NAMES 'utf8'"); qui traîne quelque part, ce qui serait néfaste puisque la table n'est pas en utf8. Link to comment Share on other sites More sharing options...
Wolf18 Posted January 23, 2013 Author Share Posted January 23, 2013 Quand j'ouvre Notepad++, il me dit que ma page est en ANSI.Mes champs MySQL concernés sont en latin1_swedish_ci et mes pages elles, sont encodées en charset=iso-8859-1 Mon site est sur un dédié, avec les autres qui eux, fonctionnent très bien (charset et codage des tables équivalents) ! Après recherche, est-ce que ça peut provenir du forum installé sur le même domaine ? En regardant les tables elles sont toutes en UTF-8 ! Je fais un include sur mes pages (dont celle qui merde) pour que la session du forum soit active sur le site... Bon c'était déjà le cas sur mon autre site donc en fait ça ne doit avoir aucune conséquence. EDIT: en utilisant utf8_encode à l'entrée et utf8_decode à la sortie ça fonctionne ! C'est laborieux mais au moins ça marche... Un grand merci à toutes et tous EDIT2: je reviens faire un petit tour car après de nombreux tests je me rends compte que ça ne fonctionne pas quand je souhaite insérer un point d'exclamation, d'interrogation en fin de chaine... Cela reste un grand mystère pour moi Link to comment Share on other sites More sharing options...
Portekoi Posted January 24, 2013 Share Posted January 24, 2013 Re, Tu as forcément un souci sur ton encodage. Change l'encodage de ta page en UT8 via NotePad++, fais pareil dans ta base Mysql pour les champs concernés et essaies voir. Link to comment Share on other sites More sharing options...
Wolf18 Posted January 24, 2013 Author Share Posted January 24, 2013 J'ai encore modifié deux ou trois trucs, j'ai passé une colonne en TEXT au lieux de VARCHAR (celle qui me posait soucis) et visiblement là tout fonctionne ! Par contre du coup il faut que je limite le nombre de caractères de mon TEXTAREA...Encore merci à vous pour votre aide précieuse, j'ai pu avancer Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now