Page 1 sur 1

Problème sur un update champ vide

Posté : 11 janv. 2008, 11:41
par saebakun
Bonjour,

je viens de passer ma prog de mon poste sur le serveur de production et sur le serveur il me fait une erreur quand je lui demande de me faire un update sur un champ avec une valeur int alors que sur mon poste tout roule :/

La même requête executée sur mon poste est ok mais sur le serveur il ne veut pas update la valeur si elle est vide...

J'ai un Version du serveur: 5.0.41-community-nt sur mon poste et un Version du serveur: 5.0.45-community-nt sur mon serveur donc je ne vois pas :/

voilà le message:

Code : Tout sélectionner

1366 - Incorrect integer value: '' for column 'service_id' at row 1
Merci :)

Posté : 11 janv. 2008, 11:54
par zeus
Modération :
saebakun, afin d'obtenir une réponse sur ce forum, il est indispensable de :

- Préciser quel est le SGBD utilisé ainsi que sa Version
- Poster la Structure des Tables utilisées dans la requête sous la forme d'un "CREATE TABLE ..." :!:
(Vous pouvez exporter la structure d'une table via phpMyAdmin. Retirez les colonnes inutiles)
- Donner les requête SQL générée

Pensez à utiliser les balises

Code : Tout sélectionner

pour afficher les requêtes SQL, la Structure des Tables et si nécessaire un échantillon des données. Assurez vous également d'avoir suivi ces [url=http://www.phpfrance.com/forums/voir_sujet-19378.php]conseils de débogage[/url]. [/color]

Posté : 11 janv. 2008, 12:06
par saebakun
ok ok ^^

Voilà ma table

Code : Tout sélectionner

CREATE TABLE `user` ( `id_user` int(11) NOT NULL auto_increment, `nom` varchar(200) NOT NULL, `prenom` varchar(200) NOT NULL, `service` varchar(200) NOT NULL, `service_id` int(11) NOT NULL, `mail` varchar(200) NOT NULL, `tel` varchar(60) NOT NULL, PRIMARY KEY (`id_user`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
Voilà la requête :

Code : Tout sélectionner

update user set nom='ALBERT', prenom='Damien', service='', service_id='', mail='[email protected]', tel='0 (33) 1 54 54 54 54', where id_user='4'

Je suis sur MYSQL 5.0.45-community-nt sur mon serveur de prod et sur MYSQL 5.0.41-community-nt
sur mon post en local.

Donc cette requête fonctionne sur mon poste en local sur la même table avec la même structure mais ne fonctionne pas sur mon serveur il faut aussi savoir que j'utilise PDO pour me connecter et executer ma requête.

Je passe par cette méthode:

Code : Tout sélectionner

function sql_exec($query){ GLOBAL $connexion; if($resultats=$connexion->exec($query) === FALSE){ $data=false; }else{ $data=true; } return $data; $resultats->closeCursor(); $connexion = NULL; }
Merci par avance :)

Posté : 11 janv. 2008, 12:15
par Xenon_54
Est-ce qu'il s'agit de la même structure de table pour les 2 environnements?

Étant donné que le champ est de type INT, il n'accepte pas les chaines de caractères. (même vide) Il faudra insérer 0.

MySQL retournera alors un Warning:
Warning: #1366 Incorrect integer value: '' for column 'nb' at row 1
Et convertira la valeur automatiquement à 0.

Peux-tu exécuter cette requête sur les 2 environnements?

Code : Tout sélectionner

SHOW VARIABLES LIKE 'max_error_count';
Ceci retournera le nombre maximal d'erreurs que MySQL pourra conserver en mémoire après une requête contenant des erreurs. 0 indique que les erreurs sont comptés mais que les messages d'erreurs ne sont pas conservés.

Posté : 11 janv. 2008, 12:18
par Truc
Je dirais que '' (chaine vide) n'est pas un entier numérique (pas de valeur par défaut + non NULL) remplace par 0 (zéro).

Posté : 11 janv. 2008, 12:20
par saebakun
j'ai
max_error_count 64
sur les deux environnements et sinon oui j'ai bien la même structure pour les deux tables.

Mais je viens de remarquer quelques choses dans mon code que je ne comprend pas, en fait le formulaire envoi un $_POST['nom'] pour le nom et j'ai ça sur mon poste si je rentre comme valeur l'arche
echo $_POST['nom']; ->>>> l\'arche
mais sur mon serveur j'ai ça :
echo $_POST['nom']; ->>>> l'arche
et là du coup j'ai forcement une erreur......

Pourquoi il rajoute un \ sur mon poste et pas sur le serveur avec le même code >_<

Peut être que ça joue pour l'autre problème aussi? Sur mon poste il converti peut être et pas sur le serveur?


A oui ma version MYSQL sur des deux côtés c'est 5.0.37

Edit:

Je viens de comprendre de slash qui se rajoutait pas c'était parce que l'option magic_quotes_gpc dans le php.ini était à off.

Mais j'ai toujours un souci avec ce integer :/

Posté : 11 janv. 2008, 13:50
par Nagol
magic_quote c'est mal!

va falloir se dépêcher de corriger tout ça php6 arrive.

Posté : 11 janv. 2008, 13:54
par saebakun
Pourquoi c'est mal?

Posté : 11 janv. 2008, 14:17
par Nagol
parceque c'est un mécanisme trés incomplet pour palier aux problèmes de programmation et une mauvaise habitude qui n'amène pas les dévelopeurs à se méfier.

PHP6 suprimera purement et simplement cette possibilité pour forcer les gens à être un peu plus autonome quand à leur sécurité.

Accessoirement il semble que magic quote te force à rajouter du code, ironique non? :)

Posté : 11 janv. 2008, 15:04
par saebakun
Héhé ok

Bon j'ai résolu mon pb autrement :)

La valeur venait d'un select du coup j'ai mis value=0 sur le premier <option> :)

Par contre juste un conseil encore, comment se protéger des ' ou autres caractères spéciaux s'en le magic_quote?

Enfin pas en détail mais juste le nom de la méthode la plus couru :)

Merci

Posté : 11 janv. 2008, 16:11
par Sékiltoyai
Ca dépend, si c'est pour une requète SQL, c'est mysql_real_escape_string() ou bien les requètes préparées, si c'est pour de l'affichage, c'est htmlentities() ou htmlspecialchars(), sinon, en plus général, il y a addslashes()…
Et pour des données entières, il y a intval(), et pour les autres données, d'autres méthodes, voire, aucune nécessité de traiter quoi que ce soit, si on fait gaffe à l'utilisation…

Posté : 11 janv. 2008, 16:53
par saebakun
En fait je vais me lancer dans les requètes préparées, j'ai acheté le eyrolles PHP 5 avancé qui a un super chapitre dessus :)

Mais je voudrais savoir si tu n'as pas un tuto avec des cas pratique sous la main car je ne trouve rien de très concluant sur google.

Bon je passe en résolue donc et merci pour les infos.