Aller au contenu

Incorrect integer value: '' for column 'id' at row 1


Sujets conseillés

Posté

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 !


Posté

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


Posté

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 !


Posté

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é


Posté

+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.


Posté

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) ?

Posté

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.


Posté

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 attendant
GTA5, à 86 ans elle joue à GTA
IV','en-attendant-gta5-a-86-ans-elle-joue-a-gta-iv','Cette dame de 86
ans 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 pensait
que les jeux vidéo étaient réservés aux jeunes ? Vous l\'avez surement
cru vous aussi et nous avons la preuve que les jeux intéressent aussi
parfois nos ainés ! La preuve avec cette grand mère de 86 qui joue à GTA
IV en attendant la sortie de GTA5.

\r\n

\r\nHilda
Knott, cette mamie interviewée par BBC affirme que le fait de jouer
maintien son activité cérébrale. Cela lui sert plus de prétexte car elle
avoue volontiers qu\'elle adore jouer sur sa Playstation 3 pendant
plusieurs 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 fait
maintenant plus de quarante ans qu\'elle joue et ce n\'est pas prêt de
changer.

\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\nVous
pensez 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-23
16: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"

Posté

Mais non, si tu utilises mysql_real_escape_string, tu ne dois pas utiliser stripslashes, mysql_real_escape_string va se demerder tout seul


Posté

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.

Posté

Ah, alors problème d'encodage d'un fichier, qui fait que le mysql_real_escape_string ou le addslashe est perturbé


Posté

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.


Posté

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 d_clap_20.giflaugh.gif

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 ^^

Posté

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.

Posté

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 smile.gif

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...