Fatal error et réaffichage champs Formulaire

Résolu/Fermé
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - Modifié par rjl le 5/08/2012 à 21:03
 Utilisateur anonyme - 13 août 2012 à 09:31
Bonsoir,

Je saisis et contrôle par formulaire HTML et vue d'enregistrer en BD MySQL. Ces 2 opérations sur la même page se font en donnant comme action au Submit la page elle-même sur laquelle on se trouve.

Deux problèmes se posent alors :
En cas d'erreurs, les champs restitués ne sont restaurés que pour la première sous-chaîne ; ainsi, "Rue des Dragées" ne sera repris que par Rue ;
Second problème, peut-être plus grave, en l'absence d'erreurs, le traitement se poursuit sur une autre page chargée d'écrire l'enregistrement ; pour autant, j'obtiens une "Fatal error :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'anais' cannot be null' in /web/utlsudgoelo/www/pgUTL/traitformul.php:33 Stack trace: #0 /web/utlsudgoelo/www/pgUTL/traitformul.php(33): PDOStatement->execute(Array) #1 {main} thrown in /web/utlsudgoelo/www/pgUTL/traitformul.php on line 33

Le champ signalé "anais" contenait lors de la saisie 1945 mais semble réputé NULL !

Un constat (à travers quelques dizaines d'essais) : en revanche, si... je contrôle ma page comme prévu mais, au lieu de boucler sur elle-même pour les corrections je modifie l'adresse de la page ciblée par le Submit et l'écris directement dans la page déjà évoquée (où j'ai la "Fatal Error"), l'enregistrement s'écrit parfaitement par cette même page HTML (sans zones amputées).

Bien entendu, ce n'est qu'une observation car cette solution ne peut me convenir (sans correction des zones réputées incorrectes) pour des saisies par des internautes !
Conclusion (peut-être hâtive) : ça semble bien être la réécriture par écho (qui déjà me splite la fin de mes champs) qui serait là encore la cause des désordres ? Il ne faudrait pas que cet "à priori" fasse de l'ombre à une saine recherche de la réalité.
Je joins la manière dont je contrôle et réaffiche les champs (les contrôles ont été "simplifiés et surtout expansés face à des difficultés par ailleurs) :
Code :
<input id="anais" name="anais"  type="text" required="required" size="4" value=<? echo $anais;?> /> 
    <label for="civil">   

Merci de votre aide pour un domaine où mes toutes récentes acquisitions (PHP, MySQL et PDO) ne peuvent me permettre de me confronter. RJL2805

24 réponses

rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
12 août 2012 à 13:38
De plus en plus hermétique pour moi... A force de bidouillage, j'ai même perdu le maintien du choix bouton radio lors des rafraîchissements de page (après erreur).

Mais, ce qui me chagrine, c'est que je n'ai pas réussi (mauvaise utilisation ?) avec les fonctions que tu m'as indiquées.
Pour les majuscules, je ne suis qu'à moitié surpris, car je l'avais déjà essayée et avait lu qu'elle ne traitait pas les minuscules accentuées... Malgré tout, j'ai trouvé cette fonction améliorée uc_strtouper_fr() qui n'a pas fonctionné non plus (d'où ma tendance à penser mauvaise utilisation) :.
<?php
   //fonction stroupper en français
    //Pour appeler la fonction:    /*echo uc_strtouper_fr($variable);
	//par exemple   $variable="je suis indigné";   echo utf8_maj_fr($variable);   // renvoit : JE SUIS INDIGNÉ
    function uc_strtoupper_fr($chaine)    {    $chaine=strtoupper($chaine);$chaine=utf8_decode($chaine);$chaine=trim($chaine);
    $chaine = strtr($chaine, "äâàáåãéèëêòóôõöøìíîïùúûüýñçþÿæoeðø","ÄÂÀÁÅÃÉÈËÊÒÓÔÕÖØÌÍÎÏÙÚÛÜÝÑÇÞÝÆOEÐØ");
    $chaine=utf8_encode($chaine);
    return $chaine;
    }
	function RecupChaine ($chaine) {
		if (get_magic_quotes_gpc()) return stripslashes($chaine);
		return $chaine;
		}
?>
// et une utilisation des fonctions :
		<input id="nomadh" name="nomadh" type="text" required="required" size="30" value="<?php echo RecupChaine ((uc_strtoupper_fr($_POST['nomadh'])));?>" />


Je te transmets une image qui montre l'antislash resté en zone adresse (ad1) et la fonction et son utilisation.
[IMG]http://img857.imageshack.us/img857/4559/bd2812.jpg[/IMG]
Par ailleurs, tu peux voir que les caractères accentués ne passent pas en majuscules malgré la fonction améliorée... Pourtant, celle-ci est bien sollicitée puisque les autres minuscules sont modifiées (cf. image).

Merci, bon dimanche et @+ RJL2812
0
Utilisateur anonyme
12 août 2012 à 18:13
Pour le passage en majuscule, comme je te l'avais dit, il faut utiliser les fonction multioctet mb_...
Utiliser utf8_decode, puis faire un traitement, puis à nouveau utf8_encode risque de te donner des résultats décevants, puisque tu ramènes sur un codage à un octet (256 caractères possibles) un codage à plusieurs octets, qui admet des dzaines (centaines ?) de milliers de caractères différents.Par exemple, tu perds le € et le oe. Il FAUT utiliser mb_strtoupper() pour convertir en majuscules une chaîne utf8.
C'est normal que ta fonction uc_strtoupper_fr ne marche pas, l'explication est un peu longue, mais je pourrai te la donner si tu y tiens.

Quant à la fonction RecupChaine, tu ne l'utilises pas de la même manière dans le script ci-dessus et dans l'image jointe. Je t'ai dit de l'appliquer aux données récupérées par POST, c'est bien ce que tu fais dans l'image jointe, alors que dans le script ci-dessus tu l'appliques au résultat de la fonction uc_strtoupper_fr, ce qui n'est déjà plus la données récupérée par post.
N'empêche que ça aurait dû marcher quand même. On voit le problème sur le champ Adresse, et dans l'image on ne voit pas que tu appliques la fonction à l'adresse. Si tu es sûr de le faire, tu peux m'envoyer le code en MP ?
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
Modifié par rjl le 12/08/2012 à 23:18
Bonsoir le père,

Je vais enregistrer mes résultats avec les essais correspondants pour les commenter en parallèle, car, après 3 ou 4 essais, j'ai difficile à me souvenir de ce que j'ai modifié pour chaque essai plus encore à revenir à l'état initial si ça s'est détérioré !

Je commence par le test avec mb_strtoupper() sachant que j'ai maintenu (sauf pour $nomadh $ville et $ad1) la fonction RecupChaine () ; j'avais déjà fait ce test et l'ai repris toujours sans succès il y a 5mn ; je reprends maintenant exclusivement sur les résultats du $_POST :
<label for="nomadh">Nom *.................. : </label> 
<input id="nomadh" name="nomadh" type="text" required="required" size="30" value="<?php echo mb_strtoupper ($_POST['nomadh']);?>" />

J'ai pour mes 3 zones test :
$nomadh=Cédaïde ; $ad1=rue de l'Hôtel de l'Hôpital ; $ville=châteauroux ;
Après envoi du Formulaire, je récupère :
$nomadh=CéDAïDE ; $ad1=rue de l'Hôtel de l'Hôpital ; $ville=CHâTEAUROUX;

Première remarque : RecupChaine () a marché et, j'espère que ce ne sont pas les 2 apostrophes qui me valent cela ?
Pour mb_strtoupper(), j'aurai été surpris qu'au 4ème ou 5ème test ça fonctionne !

Pour autant, je vais faire un test supplémentaire avec quasiment les mêmes données (sauf $ad1) pour lever un doute.
$nomadh=Cédaïde ; $ad1=rue de l'Hôtel ; $ville=châteauroux ;
Le résultat est $nomadh=C?DA?DE ; $ad1=rue de l'Hôtel de l'Hôpital ; $ville=CH?TEAUROUX ;

Mon pré-sentiment n'est pas loin sauf que j'ai travaillé comme si j'envoyais mon enregistrement pour la BD ; je corrige pour un nouvel essai avec les mêmes données en entrée :
Nouveau résultat est $nomadh=CéDAïDE ; $ad1=rue de l'Hôpital ; $ville=CHâTEAUROUX ;
Cette fois, j'avais travaillé, non plus avec utf8_encode() mais avec utf8_encode() soit donc :
<input id="ville" name="ville" type="text" required="required" size="30" value="<?php echo mb_strtoupper(utf8_encode($_POST['ville']));?>" /><br />
C'est donc que le champ serait bien en utf8, ce qui n'améliore pas pour ma compréhension de l'enregistrement en BD.

Un nouvel essai devient donc nécessaire sans encode, ni decode mais en modifiant la fonction en mb_strtoupper_fr() :
Il fallait le faire mais le résultat reste le même !

Un dernier test... à tout hasard (toujours les mêmes entrées) ;
Un résultat inattendu, correct mais dont je te laisserai interpréter le pourquoi :
Au niveau appel, j'ai modifié comme annoncé la fonction :
<input id="nomadh" name="nomadh" type="text" required="required" size="30" value="<?php echo $nomadh= mb_strtoupper_fr($_POST['nomadh']);?>" />Elle a cependant fonctionné avec une fonction dont j'avais retiré les utf8_encode et decode :
//fonction mb_stroupper en français 
    //Pour appeler la fonction:    /*echo mb_strtouper_fr($variable); 
 //par exemple   $variable="je suis indigné";   echo mb_strtouper_fr($variable);   // renvoit : JE SUIS INDIGNÉ 
    function mb_strtoupper_fr($chaine)    { 
    $chaine= mb_strtoupper($chaine);/*$chaine=utf8_decode($chaine);*/$chaine=trim($chaine); 
    $chaine= strtr($chaine, "äâàáåãéèëêòóôõöøìíîïùúûüýñçþÿæoeðø","ÄÂÀÁÅÃÉÈËÊÒÓÔÕÖØÌÍÎÏÙÚÛÜÝÑÇÞÝÆOEÐØ"); 
    /*$chaine=utf8_encode($chaine);*/ 
    return $chaine; 
    }

Ce que j'ai retiré pour un résultat : $nomadh=CÉDAÏDE ; $ad1=rue de l'Hôpital ; $ville=CHÂTEAUROUX ;

Le GAG
: Tous les résultats enregistrés sur la BD... sont erronés : 1947 Mme Cédaïde Josée rue de l\'Hôpital 36000 Châteauroux 2012 0000 0 2012-08-12 521 (minuscules et antislash) !

Je n'analyserai le pourquoi que demain... mais simple question : est-ce que dans le <input id="nomadh" name="nomadh" type="text" required="required" size="30" value="<?php echo $nomadh= mb_strtoupper_fr($_POST['nomadh']);?>" />, le echo $nomadh= mb_strtoupper_fr($_POST['nomadh']); instruit bien le $nomadh ?
Ce qui est sûr c'est que par cette méthode, je ne repasse pas par les mêmes fonctionnalités pour enregistrer...
Reste une question cruciale...
Pourquoi me faut-il passer par utf8_decode() pour enregistrer correctement les caractères accentués ?

Une évolution intéressante mas pas sans poser question. Merci d'avance de tes avis RJL2812
0
Utilisateur anonyme
13 août 2012 à 09:31
Je t'ai répondu en MP.
0