PHP & MySQL : erreur en PHP dans l'alimentati [Résolu/Fermé]

Signaler
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
-
 Utilisateur anonyme -
Bonjour,


J'ai créé un formulaire pour mettre à jour une base MySQL.
Lorsque je lance le traitement, en direct, je n'obtiens pas d'erreur mais le codage de mon module traitement PHP !
Je dois avoir ouvert (et même réouvert après erreur) le traitement de ma base de donnée MySQL pour que le traitement PHP soit lancé !

Jusqu'à maintenant, le formulaire était bien transmis (j'avais mis des print et echo du formulaire et de chaque zone et les erreurs étaient détectées).

J'ai fait un envoi "correct" mais, là, étant allé jusqu'à la MàJ de ma BD, j'ai eu quelques soucis !
Je n'avais pas adapté les champs de l'instruction $sql = "INSERT INTO formulaire VALUES
Je l'ai fait... mal... générant une erreur :
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /web/utlsudgoelo/www/pgUTL/traitformul.php on line 57

Quelle que soit les modifs essayées, je patine et n'en sort pas !
J'ai cru lire que toutes les zones de la BD MySQL devaient être citées, modifiées ou non dont ne particulier la colonne 16 en Primary et Auto incrementation ... C'est la raison pour laquelle je les ai toutes citées en INSERT INTO !

Merci d'excuser les bêtises que j'ai pu induire étant débutant en PHP te avec MySQL !
Merci plus encore des conseils que vous saurez me donner.
Compte tenu de mon niveau, des remarques ou conseils, même en dehors du problème spécifique seront appréciés.
Amicalement RJL2629

<?php  
// Parametres mysql à remplacer par les vôtres  
define('DB_SERVER', 'sql1');      // serveur mysql Nuxit 'localhost' (init)  
define('DB_SERVER_USERNAME', 'utlsudgoel********');   // mot de passe         motpasse (init)  
define('DB_DATABASE', 'utlsudgoelo');    // nom de la base       telechargement (init)  
// Connexion au serveur mysql  
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD)   
or die('Impossible de se connecter : ' . mysql_error());  

// controle valeurs transmises  

// sélection de la base de données  
mysql_select_db(DB_DATABASE, $connect);  
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis:  
<br/><br/>";  
$msg_ok = "Votre demande a bien été prise en compte.";  
$message = $msg_erreur;  
// vérification des champs  
print_r($_POST);   
$anais =($_POST['anais']);  
if (empty($anais))   
  $message .= "Votre année de naissance<br/>";  
  $ancour = date("Y");  
if  (($anais <$ancour - 100) or  
 ($annais > $ancour -25))   
 $message .= "Année naissance incorrecte<br/>";  
if (empty($_POST['civil']))   
  $message .= "Votre civilité<br/>";  
if (empty($_POST['nomadh']))   
  $message .= "Votre nom<br/>";  
if (empty($_POST['prenom']))   
  $message .= "Votre prénom<br/>";  
if (empty($_POST['ad1']))   
  $message .= "Votre adresse<br/>";   
$anais =($_POST['anais']);  
$cpost =($_POST['cpost']);  
if  ($cpost <1000)  
  $message .= "Code postal erroné<br/>";  
if ($cpost > 95999)  
  $message .= "Code postal erroné<br/>";  
if (empty($_POST['ville']))   
  $message .= "Votre ville<br/>";  
// si un champ est vide, on affiche le message d'erreur  
if (strlen($message) > strlen($msg_erreur)) {  
  echo $message;  

// sinon c'est ok   
} else {  
  foreach($_POST as $index => $valeur) {  
    $$index = mysql_real_escape_string(trim($valeur));  
  }  
   
  $sql = "INSERT INTO adh VALUES ('".cart."', '".anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob"', '".$admail."', '".$anadh."', '".$fonc."', '".anpaye"', '".$cle."', now())";  
  $res = mysql_query($sql);  
 
  if ($res) {  
    echo $msg_ok;  
  } else {  
    echo mysql_error();  
  }  

}  
?>  



Structure de la base MySQL
# Colonne Type Interclassement Attributs Null Défaut Extra
1 cart smallint(5) UNSIGNED Non Aucune
2 anais year(4) Non Aucune
3 civil char(3) latin1_general_ci Non Aucune
4 nomadh char(25) latin1_general_ci Non Aucune
5 prenom char(30) latin1_general_ci Non Aucune
6 ad1 char(30) latin1_general_ci Non Aucune
7 ad2 char(30) latin1_general_ci Non Aucune
8 cpost medium int(8) UNSIGNED Non Aucune
9 ville char(30) latin1_general_ci Non Aucune
10 tfixe char(15) latin1_general_ci Non Aucune
11 tmob char(15) latin1_general_ci Non Aucune
12 admail char(80) latin1_general_ci Non Aucune
13 anadh year(4) Non Aucune
14 fonc char(2) latin1_general_ci Non Aucune
15 anpaye year(4) Non Aucune
16 cle int(11) Non Aucune AUTO_INCREMENT



14 réponses

Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonsoir,
Une remarque m'a fait corriger dans l'instruction 57
   2 champs auxquels manquait le $ ! J'ai réessayé mais le message est le même sauf qu'il cible maintenant l'instruction 54 car j'ai retiré 3 lignes blanches !

Merci de vos avis @bientôt RJL2629

<?php
// Parametres mysql à remplacer par les vôtres
define('DB_SERVER', 'sql1'); 					// serveur mysql 'localhost' (init)
define('DB_SERVER_USERNAME', 'utlsudgoelo'); 	// nom d'utilisateur    root (init)
define('DB_SERVER_PASSWORD', '********'); 		// mot de passe         motpasse (init)
define('DB_DATABASE', 'utlsudgoelo'); 			// nom de la base       telechargement (init)
// Connexion au serveur mysql
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) 
or die('Impossible de se connecter : ' . mysql_error());

// controle valeurs transmises

// sélection de la base de données
mysql_select_db(DB_DATABASE, $connect);
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis:
<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
// vérification des champs
print_r($_POST); 
$anais =($_POST['anais']);
if (empty($anais)) 
  $message .= "Votre année de naissance<br/>";
  $ancour = date("Y");
if  (($anais <$ancour - 100) or
	($annais > $ancour -25)) 
	$message .= "Année naissance incorrecte<br/>";
if (empty($_POST['civil'])) 
  $message .= "Votre civilité<br/>";
if (empty($_POST['nomadh'])) 
  $message .= "Votre nom<br/>";
if (empty($_POST['prenom'])) 
  $message .= "Votre prénom<br/>";
if (empty($_POST['ad1'])) 
  $message .= "Votre adresse<br/>"; 
$anais =($_POST['anais']);
$cpost =($_POST['cpost']);
if  ($cpost <1000)
  $message .= "Code postal erroné<br/>";
if	($cpost > 95999)
  $message .= "Code postal erroné<br/>";
if (empty($_POST['ville'])) 
  $message .= "Votre ville<br/>";
// si un champ est vide, on affiche le message d'erreur
if (strlen($message) > strlen($msg_erreur)) {
  echo $message;

// sinon c'est ok 
} else {
  foreach($_POST as $index => $valeur) {
    $$index = mysql_real_escape_string(trim($valeur));
  }
 
  $sql = "INSERT INTO adh VALUES ('".$cart."', '".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob"', '".$admail."', '".$anadh."', '".$fonc."', '".$anpaye"', '".$cle."', now())";
  $res = mysql_query($sql);

  if ($res) {
    echo $msg_ok;
  } else {
    echo mysql_error();
  }

}
?>

Bonjour


Il y avait en fait 3 variables, pas 2 : $cart, $anais et $anpaye

Il te manque un point après $tmob et après $anpaye
Messages postés
321
Date d'inscription
mardi 1 mai 2012
Statut
Membre
Dernière intervention
1 juillet 2016
62
Les int et smallint ne doivent pas être entouré de ' '
essai et dis nous si c'est bon.

A+
Utilisateur anonyme
Les ' ne sont pas obligatoires autour des nombres, mais pas interdits.
De plus, il provoqueraient éventuellement une erreur mysql, pas une erreur PHP.
Donc aucun rapport, essai inutile.
Messages postés
321
Date d'inscription
mardi 1 mai 2012
Statut
Membre
Dernière intervention
1 juillet 2016
62
Je pense alors que tu as un champ qui doit manquer ou un champ en trop.
Je pense alors que : Ce n'est pas une question d'opinion, c'est une question de syntaxe php.
Un champ manquant ou en trop provoquerait aussi une erreur mysql, pas une Parse error PHP.
Non, il lui manque 2 points comme je l'ai déjà dit.
En ajoutant des remarques à côté de la plaque, tu fais remonter mon message qui contient la solution, et rjl risque de ne plus le voir.
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonjour,
Merci à webdesignentrprise et le pere (dont j'ai apprécié la précision) observations et conseils.
J'ai modifié le code en ce sens : ajout points et $ ; j'ai ajouté les noms des champs mais supprimé en Value la clé pour éviter un double comptage et l'ai aussi omise des noms de champs.

Mais me restent quelques questions avant lesquelles je dois m'expliquer :
J'oeuvre en bénévolat associatif et veux abonder une BD existante à partir de formulaires remplis par les usagers. Je ne dois pas modifier d'enregistrement existant mais peux simplement en créer (pré-inscriptions).
J'ai commencé le site Web il y a 2 ou 3 semaines mais ne connait rien ni en PHP, ni pour MySQL (j'ai déjà un site qui fonctionne depuis plus de 3 ans avec 24000 visites et ai pratiqué Access). J'ai donc la "prétention" d'apprendre ainsi (livres + tutos... + forum !).
C'est à partir d'un tuto que j'ai adapté mon formulaire et préparé son traitement en PHP.
Quand je lis le NOW() à la fin n'a pas de sens...
Qu'est ce que tu voulais faire ?
Réaction initiale : si je savais...
Réaction après examen de la fonction NOW : ça peut m'être utile mais sans l'heure donc en CURDATE() ! Encore faut-il, sans doute définir le champs concerné... pour l'utiliser par ailleurs ?

Dans l'immédiat pour le test, je crée un champ MaJ et le déclare en champ (type date) et Value juste devant la clé, regrettant de n'avoir pu lui donner par défaut la valeur CURRENT_TIMESTAMP pour une initialisation automatique par la création d'un nouvel enregistrement !
Dans ma vue (simpliste ?) des choses, Now (), transformé en CURDATE (), devrait maintenant instruire $MaJ ?

J'ai d'abord fait un essai ainsi... tout s'est déroulé mais... pas d'enregistrement ajouté ni de message d'erreur !
J'ai alors ajouté des print ou écho en différents points pour y voir clair... crois-ai-je !

Mais mauvais positionnement autre : je bloque avec des parse en 49 ou 51 alternativement pour des ; ou { selon mes essais !
Pour corser le tout, j'ai été incapable de restaurer malgré des annulations multiples (j'ai dû pourtant forcer les possibilités à 50) !

Désolé, bien des questions et problèmes en un même envoi.
Je suis absent 48 heures.
Merci cependant de vos réponses et conseils précieux dès que vous le pourrez.
Amicalement RJL2629

Je donne à nouveau le code :
<?php
// Parametres mysql à remplacer par les vôtres
define('DB_SERVER', 'sql1'); 					// serveur mysql 'localhost' (init)
define('DB_SERVER_USERNAME', 'utlsudgoelo'); 	// nom d'utilisateur    root (init)
define('DB_SERVER_PASSWORD', '********'); 		// mot de passe         motpasse (init)
define('DB_DATABASE', 'utlsudgoelo'); 			// nom de la base       telechargement (init)
// Connexion au serveur mysql
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) 
or die('Impossible de se connecter : ' . mysql_error());

// controle valeurs transmises

// sélection de la base de données
mysql_select_db(DB_DATABASE, $connect);
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis:
<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
// vérification des champs

print_r($_POST);     // contrôle données traitées
$anais =($_POST['anais']);
if (empty($anais)) 
  $message .= "Votre année de naissance<br/>";
  $ancour = date("Y");
if  (($anais <$ancour - 100) or
	($annais > $ancour -25)) 
	$message .= "Année naissance incorrecte<br/>";
if (empty($_POST['civil'])) 
  $message .= "Votre civilité<br/>";
if (empty($_POST['nomadh'])) 
  $message .= "Votre nom<br/>";
if (empty($_POST['prenom'])) 
  $message .= "Votre prénom<br/>";
if (empty($_POST['ad1'])) 
  $message .= "Votre adresse<br/>"; 
$anais =($_POST['anais']);
$cpost =($_POST['cpost']);
if  ($cpost <1000)
  $message .= "Code postal erroné<br/>";
if	($cpost > 95999)
  $message .= "Code postal erroné<br/>";
if (empty($_POST['ville'])) 
  $message .= "Votre ville<br/>";
// si un champ est vide, on affiche le message d'erreur

echo $message;    // contrôle message
if (strlen($message) > strlen($msg_erreur)) {
  echo (strlen($message)            //    ;  
// sinon c'est ok 
} else     {        // {  était appliqué  jusqu'en 70 !
  foreach($_POST as $index => $valeur) {
    $index = mysql_real_escape_string(trim($valeur));
  }
 
 echo affichage avant $sql en ligne 56;
 print_r($sql);     // contrôle données traitées
  $sql = "INSERT INTO adh ($cart, $anais, $civil, $nomadh, $prenom, ad1, ad2, $cpost, $ville, $tfixe, $tmob, $admail, $anadh, $fonc, $anpaye,$MaJ,$cle)
			VALUES ('".$cart."', '".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."', '".$anadh."', '".$fonc."', '".$anpaye."', CURDATE () )";
 echo affichage avant $res en ligne 60;
 print_r($res);     // contrôle données traitées
			$res = mysql_query($sql);

  if ($res) {
    echo $msg_ok;
  } else {
    echo mysql_error();
  }

   } //      était en relation avec 51      }
?>

Pour le parse en 49, l'erreur semble évidente, il manque une parenthèse :
 echo (strlen($message) )           //    ;



Gros problèmes avec la requête :
1 - INSERT INTO adh ($cart, $anais,...
ici, il doit y avoir les noms des champs donc cart, anais.. pas $cart,$anais...
2 - Dans la liste des champs, tu mets le champ 'cle', mais il n'y a pas de valeur correspondante dans VALUES. Il faut mettre exactement autant de VALUES que de champs; puisque ta clé est un auto_increment, le mieux est encore de ne pas la mettre dans la liste des champs.
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonjour le père,
et un grand merci pour une parenthèse qui était loin d'être évidente pour moi ! J'ai aussi corrigé les champs cités en INSERT INTO adh
Bien sûr, j'ai patiné un peu plus loin (mais mieux contrôlé mes parenthèses) !
J'en profite pour donner la suite du film :

J'ai disposé d'un peu de temps avant de partir ce matin et donc j' ai repris les essais.
La situation a changé grâce aux réponses reçues et j'ai éliminé les parses bloquants !
Je traverse l'ensemble de mon traitement... sans messages d'erreurs (à l'exception de quelques messages pour voir où je passe avec d'ailleurs des passages à la ligne non maîtrisés et ici finis main) !


Array ( [anais] => 1942 [civil] => M. [nomadh] => RJL [prenom] => rj [ad1] => 19 rue du Grand Léjon [ad2] => [cpost] => 22680 [ville] => ETABLES SUR MER [tfixe] => 0296766573 [tmob] => [admail] => rjl22@wanadoo.fr [envoi] => Envoi du Formulaire ) affichage avant en ligne 60
FUNCTION utlsudgoelo.
CURDATE does not exist


Ne voyant pas comment initialiser ce CURRENT DATE utilisé en zone MaJ (ça reste à définir,
J'ai éliminé ce champ et relancé ma transaction et j'obtiens alors le message attendu "Votre demande a bien été prise en compte."
Array ( [anais] => 1942 [civil] => M. [nomadh] => RJL [prenom] => rj [ad1] => 19 rue du Grand Léjon [ad2] => [cpost] => 22680 [ville] => ETABLES SUR MER [tfixe] => 0296766573 [tmob] => [admail] => rjl22@wanadoo.fr [envoi] => Envoi du Formulaire ) Votre demande a bien été prise en compte.

Sauf... qu'il n'y a pas d'enregistrement nouveau créé !
Merci de vos éclairages et bon week end à tous.
RJL2630

<?php 
// Parametres mysql à remplacer par les vôtres 
define('DB_SERVER', 'sql1');      // serveur mysql 'localhost' (init) 
define('DB_SERVER_USERNAME', 'utlsudgoelo');  // nom d'utilisateur    root (init) 
define('DB_SERVER_PASSWORD', '********');   // mot de passe         motpasse (init) 
define('DB_DATABASE', 'utlsudgoelo');    // nom de la base       telechargement (init) 
// Connexion au serveur mysql 
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD)  
or die('Impossible de se connecter : ' . mysql_error()); 

// controle valeurs transmises 

// sélection de la base de données 
mysql_select_db(DB_DATABASE, $connect); 
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis: 
<br/><br/>"; 
$msg_ok = "Votre demande a bien été prise en compte."; 
$message = $msg_erreur; 
// vérification des champs 

print_r($_POST);  echo "\n";  // contrôle données traitées 
$anais =($_POST['anais']); 
if (empty($anais))  
  $message .= "Votre année de naissance<br/>"; 
  $ancour = date("Y"); 
if  (($anais <$ancour - 100) or 
 ($annais > $ancour -25))  
 $message .= "Année naissance incorrecte<br/>"; 
if (empty($_POST['civil']))  
  $message .= "Votre civilité<br/>"; 
if (empty($_POST['nomadh']))  
  $message .= "Votre nom<br/>"; 
if (empty($_POST['prenom']))  
  $message .= "Votre prénom<br/>"; 
if (empty($_POST['ad1']))  
  $message .= "Votre adresse<br/>";  
$anais =($_POST['anais']); 
$cpost =($_POST['cpost']); 
if  (($cpost <1000) or 
 ($cpost > 95999)) 
  $message .= "Code postal erroné<br/>"; 
if (empty($_POST['ville']))  
  $message .= "Votre ville<br/>"; 
// si un champ est vide, on affiche le message d'erreur 

if (strlen($message) > strlen($msg_erreur)) { 
  echo strlen($message);  
// sinon c'est ok  
} else     
 {  
  foreach($_POST as $index => $valeur)   
    $index = mysql_real_escape_string(trim($valeur));    
   
// echo "affichage avant $sql en ligne 56"; 
 print_r($sql); echo "\n";    // contrôle données traitées 
  $sql = "INSERT INTO adh (cart, anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail)    
   VALUES ('".$cart."', '".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."' )";//, CURDATE ()    //ligne INSERT ,MaJ  
 //echo "affichage avant $res en ligne 60";echo "\n"; 
 print_r($res);echo "\n";     // contrôle données traitées 
   $res = mysql_query($sql); 
echo mysql_error(); 
  if ($res) { 
    echo $msg_ok; 
  } else { 
    echo mysql_error(); 
  } 

   } //      était en relation avec 51      } 
?> 

Ton code
foreach($_POST as $index => $valeur)   
    $index = mysql_real_escape_string(trim($valeur));

Ne fait pas ce que tu crois.
Pour extraire les variables du POST en échappant en même temps, les caractères spéciaux pour mysql, il fallait faire
$$index = mysql_real_escape_string(trim($valeur));

Mais c'est très dangereux comme méthode, car un petit malin peut créer les variables qu'il veut dans ton script avec cette méthode.
Il vaut mieux n'extraire que les champs dont tu as besoin, soit en mettant leurs noms dans un tableau et en faisant une boucle, soit en les prenant un par un :
$cart=mysql_real_escape_string($_POST['cart']);
$anais=mysql_real_escape_string($_POST['anais']);


Tu dis qu'il n'y a pas de nouvelle ligne d'insérée, regarde bien : je parie qu'il y en a en fait, mais qu'elles sont presque vides.

Fais aussi attention : tu écris annais avec 2 'n' dans tes tests
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonjour le père,
Merci de ta réponse toujours aussi importante.
J'ai corrigé le $$ mais juste pour bien mémoriser la nécessité de doubler les caractères particuliers dont j'avais bien lu qu'ils devaient être doublés pour un traitement correct... mais confusion fatale dans mon esprit avec une variable donc j'avais, de moi-même supprimé à tort le second $ !
J'ai donc récupéré une à une les variables.
Cependant, après ces rectifications, comme avant, je ne créé pas de nouvel enregistrement !
Venant d'un formulaire et de par sa conception, je ne peux que traiter un enregistrement à chaque passage !
De plus, ce sont obligatoirement de nouveaux enregistrements donc pas de télescopages avec d'autres.
Enfin, je regarde la BD et même si je reçois un enregistrement avec "Votre demande a bien été prise en compte". dans le message édité (... sans saut à la ligne) : Array ( [anais] => 1942 [civil] => M. [nomadh] => RJL [prenom] => rj [ad1] => 19 r du Gd Léjon [ad2] => [cpost] => 22680 [ville] => ETABLES SUR MER [tfixe] => [tmob] => [admail] => [envoi] => Envoi du Formulaire ) Votre demande a bien été prise en compte.

Dans l'immédiat, j'ai dans un premier temps supprimé la Currentdate que je ne savais pas déclarer dans ma BD !
Merci aussi pour le nom incorrect anais (ou, par erreur annais).
Voilà la dernière situation (y compris pour le code).
Grand merci de ton appui
RJL2701

<?php
// Parametres mysql à remplacer par les vôtres
define('DB_SERVER', 'sql1'); 					// serveur mysql 'localhost' (init)
define('DB_SERVER_USERNAME', 'utlsudgoelo'); 	// nom d'utilisateur    root (init)
define('DB_SERVER_PASSWORD', '********'); 		// mot de passe         motpasse (init)
define('DB_DATABASE', 'utlsudgoelo'); 			// nom de la base       telechargement (init)
// Connexion au serveur mysql
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) 
or die('Impossible de se connecter : ' . mysql_error());

// controle valeurs transmises
 
// sélection de la base de données
mysql_select_db(DB_DATABASE, $connect);
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis:
<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
// vérification des champs

print_r($_POST);  echo "\n";  // contrôle données traitées
$anais =($_POST['anais']);
if (empty($anais)) 
  $message .= "Votre année de naissance<br/>";
  $ancour = date("Y");
if  (($anais <$ancour - 100) or
	($anais > $ancour -25)) 
	$message .= "Année naissance incorrecte<br/>";
if (empty($_POST['civil'])) 
  $message .= "Votre civilité<br/>";
if (empty($_POST['nomadh'])) 
  $message .= "Votre nom<br/>";
if (empty($_POST['prenom'])) 
  $message .= "Votre prénom<br/>";
if (empty($_POST['ad1'])) 
  $message .= "Votre adresse<br/>"; 
$cpost =($_POST['cpost']);
if  (($cpost <1000) or
	($cpost > 95999))
  $message .= "Code postal erroné<br/>";
if (empty($_POST['ville'])) 
  $message .= "Votre ville<br/>";
// si un champ est vide, on affiche le message d'erreur

if (strlen($message) > strlen($msg_erreur)) {
  echo strlen($message); 
// sinon c'est ok 
} else    
 { 
	$civil=($_POST['civil']); 
	$nomadh=($_POST['nomadh']);
	$prenom=($_POST['prenom']);
	$ad1=($_POST['ad1']);
	$ad2=($_POST['ad2']);
	$ville=($_POST['ville']);
	$tfixe=($_POST['tfixe']);
	$tmob=($_POST['tmob']);
	$admail=($_POST['admail']);
//  foreach($_POST as $index => $valeur)  $$index = mysql_real_escape_string(trim($valeur));   
  
// echo "affichage avant $sql en ligne 56";
 print_r($sql); echo "\n";    // contrôle données traitées
  $sql = "INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail)   
			VALUES ('".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."' )"; 
//, CURDATE ()    //ligne INSERT ,MaJ 
//echo "affichage avant $res en ligne 60";echo "\n";
 print_r($res);     // contrôle données traitées
			$res = mysql_query($sql);
// echo mysql_error();
  if ($res) {
    echo $msg_ok;
  } else {
    echo mysql_error();
  }

   } //      était en relation avec 51      }
?>

De plus en plus étrange...
Au passage, tu as oublié les mysql_real_escape_string et le trim :
  $civil=mysql_real_escape_string(trim($_POST['civil'])); 
  $nomadh=mysql_real_escape_string(trim($_POST['nomadh']));
  ...

Il me semble aussi que tu devrais faire echo $message; plutôt que echo strlen($message); en cas d'erreur.
Il me semble aussi qu'il existe en France des code postaux supérieurs à 95999, à moins que ton site n'intéresse pas les DOM.

Mais pour en revenir au vrai problème...
Comme je ne vois plus trop ou regarder, je te propose quelques vérifications. D'abord sur la sélection de la base :
mysql_select_db(DB_DATABASE, $connect) or die (mysql_error());

Et aussi la requête réellement exécutée, ainsi que l'erreur après la requête même s'il ne semble pas y en avoir :

echo '<br />',$sql,'<br />';
$res = mysql_query($sql);
echo mysql_error();

Re- au passage, tu peux supprimer ton print_r ($sql) qui ne sert à rien avant l'initialisation de $sql et idem pour $res
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonjour le père,

Effectivement, j'avais raté les $civil=mysql_real_escape_string(trim($_POST['civil']); et compagnie dont j'en avais mal vu l'intérêt ! Peut-être à tort, je n'en ai pas mis pour les zones numériques qu'elles soient en type year, int, small ou mediumint.
Pour autant, n'auraient-elles pas été traitées par le foreach ?
J'ai essayé de masser en MySQLi, MySQL semblant maintennt déconseillé pour de nouveaux sites mais n'ai pas réussi car MySLSQi ne semble pas prôné par mon hébergeur (NUXIT).

Array ( [anais] => 1942 [civil] => M. [nomadh] => RJL [prenom] => rj [ad1] => 19 r du Gd Léjon [ad2] => [cpost] => 22680 [ville] => ETABLES [tfixe] => [tmob] => [admail] => [envoi] => Envoi du Formulaire )

Query was empty 1Votre demande a bien été prise en compte.
Le Query was empty m'intrigue !
Par ailleurs, comme j'accède bien à la base via Php MyAdmin, les paramètres sont bons à ce stade (j'y ai d'ailleurs copié toute la base issue d'un fichier Excel en .csv) !
Pour essayer d'en avoir le coeur net, j'ai tenté de modifier le mot de passe... en remettant le même (par copie) !
Première surprise, il ne demande pas l'ancien mot de passe pour cette opération mais me rejette le nouveau avec le message ci-dessous !
ERREUR
Requête SQL
SET PASSWORD - PASSWORD('***')
MySQL a répondu
$1044 - Access denied for user
'utlsudgoelo'@' 'to database 'mysql'
J'aurais aimé y voir database 'utlsudgoelo' (le user et le nom de la base sont identiques) !


J'ai noté un choix (initial) avec Hachage du mot de passe: MySQL 4.1+ ?

Autre aspect intriguant : lorsque je regarde la base, je note "Aucun privilège" :
Bases de données
Créer une base de données:
Aucun privilège
Base de données
utlsudgoelo
Total:

J'avais ouvert les privilèges pour permettre de modifier le fichier config de php ; y a-t'il une action possible (et nécessaire) pour la BD ? Comment ?

Pour autant, j'ai des access denied lorsque je me connecte par le module en ayant omis de corriger le PassWord après l'avoir modifié en ******** pour publier le code ; ils disparaissent lorsque je corrige le PassWord !

Merci de ton appui et de ton oeil expert pour suivre dans ce qui est encore pour moi une jungle .
@ bientôt RJL2702

<?php
// Parametres mysql 
define('DB_SERVER', 'sql1'); 				 // serveur mysql     localhost
define('DB_SERVER_USERNAME', 'utlsudgoelo'); // nom d'utilisateur root
define('DB_SERVER_PASSWORD', '********'); 	 // mot de passe      motpasse
define('DB_DATABASE', 'utlsudgoelo'); 		 // nom de la base    telechargement
// Connexion au serveur mysql
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) 
or die('Impossible de se connecter : ' . mysql_error());

// controle valeurs transmises
 
// sélection de la base de données

mysql_select_db(DB_DATABASE, $connect) or die (mysql_error());

$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis:
<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
// vérification des champs

print_r($_POST);  echo "\n";  // contrôle données traitées

$anais =($_POST['anais']);
if (empty($anais)) 
  $message .= "Votre année de naissance<br/>";
  $ancour = date("Y");
if  (($anais <$ancour - 100) or
	($anais > $ancour -25)) 
	$message .= "Année naissance incorrecte<br/>";
if (empty($_POST['civil'])) 
    $message .= "Votre civilité<br/>"; 
if (empty($_POST['nomadh'])) 
	$message .= "Votre nom<br/>";
if (empty($_POST['prenom'])) 
	$message .= "Votre prénom<br/>";
if (empty($_POST['ad1'])) 
	$message .= "Votre adresse<br/>"; 
$cpost =($_POST['cpost']);
if  (($cpost <1000) or
	($cpost > 95999))
	$message .= "Code postal erroné<br/>";
if (empty($_POST['ville'])) 
	$message .= "Votre ville<br/>";
// si un champ est vide, on affiche le message d'erreur

if (strlen($message) > strlen($msg_erreur)) {
	echo $message; } 
// sinon c'est ok 
else   { 
	$civil=mysql_real_escape_string(trim($_POST['civil']));
	$nomadh=mysql_real_escape_string(trim($_POST['nomadh'])); 
	$prenom=mysql_real_escape_string(trim($_POST['prenom']));
	$ad1=mysql_real_escape_string(trim($_POST['ad1'])); 
	$ad2=mysql_real_escape_string(trim($_POST['ad2'])); 
	$ville=mysql_real_escape_string(trim($_POST['ville'])); 
	$tfixe=mysql_real_escape_string(trim($_POST['tfixe'])); 
	$tmob=mysql_real_escape_string(trim($_POST['tmob'])); 
	$admail=mysql_real_escape_string(trim($_POST['admail'])); 	
//  foreach($_POST as $index => $valeur)  $$index = mysql_real_escape_string(trim($valeur));   
  

echo '<br />',$sql,'<br />';
$res = mysql_query($sql);
echo mysql_error();

  
//  print_r($sql); echo "\n";    // contrôle données traitées
  $sql = "INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail)   
			VALUES ('".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."' )"; 
//, CURDATE ()    //ligne INSERT ,MaJ 


			$res = mysql_query($sql); 
			print_r($res);     // contrôle données traitées
			
// echo mysql_error();
  if ($res) {
    echo $msg_ok;
  } else {
    echo mysql_error();
  }

   } //      était en relation avec 51      }
?>
Messages postés
14
Date d'inscription
lundi 27 février 2012
Statut
Membre
Dernière intervention
2 juillet 2012
4
essaie de remplacer
$res = mysql_query($sql);
par
mysql_query($sql);
Utilisateur anonyme
Pour quoi faire ? Ça ne change strictement rien à la validité de la requête, en en plus, tu perds le résultat. Alors c'est une mauvaise idée.

je n'en ai pas mis pour les zones numériques qu'elles soient en type year, int, small ou mediumint. D'accord, tu as défini des champs numériques, mais si l'opérateur saisit un texte avec des apostrophes, ça va provoquer des erreurs à coup sûr.
As-tu bien vérifié les type des données saisies avant de dire que ce sont bien des nombres, des dates ?
n'auraient-elles pas été traitées par le foreach ? Pas dans le script que tu donnes, car le foreach est en commentaire... Sinon, oui c'est faisable bien sûr.
J'ai essayé de passer en MySQLi j'oublie, car tu sembles revenu en mysql d'après ton script.
Query was empty 1Votre demande a bien été prise en compte.
Le Query was empty m'intrigue !
. C'est normal. Tu as ajouté un $res = mysql_query($sql); AVANT d'avoir défini $sql. Ta requête, c'est $sql, et elle est bien vide avant d'avoir été définie.
C'est moi qui t'avais demandé de mettre le echo mysql_error();, mais il me semblait évident que ce n'était qu'APRES avoir exécuté la requête.
De même qu'il ne faut faire echo '<br />',$sql,'<br />'; que APRES avoir mis quelque chose dans $sql.
  
  $sql = "INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail)   
  VALUES ('".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."' )"; 
  $res = mysql_query($sql); 
  echo '<br />',htmlspecialchars($sql),'<br />';
  echo ($res?'ok':'ko'),'<br />', mysql_error();


Mais d'après ce que je vois, plus ça va et plus je me dis que les données sont bien insérées, et que tu dois mal vérifier le contenu. Je n'ai jamais vu de requête qui rendait OK après s'être mal passée. Rafraîchis-tu bien l'affichage de phpmyadmin à chaque essai ?
Messages postés
584
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
48
Bonjour le père,

OK pour les zones non contrôlées mais, dans un premier temps, je vais les différer pour plus tard cherchant déjà à résoudre ce qui paraît une énigme : la non-écriture des enregistrements !
Par ailleurs, félicitations pour ta patience et ta disponibilité et, plus ça va, plus j'ai de complexes !
Il est vrai qu'aborder PHP et MySQL simultanément est un véritable challenge pour mettre chaque chose à sa place et qui plus est, tenter de comprendre les instructions nombreuses semble-t'il et très variées à travers diverses manières de traiter les BD (ordre directs en MySQL ou sous d'autres formes comme MyISAM ou INNO DB, ordres SQL ou PDO,...)

J'ai une méthode de travail parfois bizarre et, là, il m'est arrivé une fois encore, entre 2 réflexions écrites de modifier mon code pour refaire un essai... et l'attention est de rigueur entre les modifs de mon mot de passe, la mise à jour des modifs et leur remontées chez mon hébergeur (puisque je travaille en direct...), il vaut mieux contrôler 2 fois chaque chose...
Mais miracle encourageant, l'ensemble modifié comme tu le demandais a été efficace :
echo '<br />',$sql,'<br />'; 
$res = mysql_query($sql); 
echo mysql_error(); 
print_r($res);     // contrôle données traitées 
  if ($res) { 
    echo $msg_ok; 
  } else { 
    echo mysql_error();


Array ( [anais] => 1942 [civil] => M. [nomadh] => RJL [prenom] => rj [ad1] => 19 r du Gd Léjon [ad2] => [cpost] => 22680 [ville] => Etables [tfixe] => [tmob] => [admail] => [envoi] => Envoi du Formulaire )
INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail) VALUES ('1942', 'M.', 'RJL', 'rj', '19 r du Gd Léjon', '', '22680', 'Etables', '', '', '' )
1Votre demande a bien été prise en compte.

Ce qui validait tes dires : "plus ça va et plus je me dis que les données sont bien insérées, et que tu dois mal vérifier le contenu. Je n'ai jamais vu de requête qui rendait OK après s'être mal passée. Rafraîchis-tu bien l'affichage de phpmyadmin à chaque essai ?"
D'un coup (mais pas à la première actualisation), j'ai vu apparaître 7 nouveaux enregistrements... Ceux qui "étaient restés coincés" !
Et, les codes en auto-incrémentation toujours, à mes yeux, bloqués à 402 avaient bien progressé passant via 403,... jusqu'à 409
cart anais N° carte UTL civil M. ou Mme nomadh prenom ad1 ad2 cpost ville tfixe tmob admail anadh >2002 fonc anpaye MaJ cle 0 1942 M. RJL rj 19 r du Gd Léjon 22680 Etables 0000 0000 0000-00-00 409
0 1942 M. RJL rj 19 r du Gd Léjon 22680 Etables 0000 0000 0000-00-00 408
0 1942 M. RJL rj 19 r du Gd Léjon 22680 Etables 0000 0000 0000-00-00 407
0 1942 M. RJL rj 19 r du Gd Léjon 22680 ETABLES 0000 0000 0000-00-00 406
0 1942 M. RJL rj 19 r du Gd Léjon 22680 ETABLES 0000 0000 0000-00-00 405
0 1942 M. RJL rj 19 r du Gd Léjon 22680 ETABLES SUR MER 0000 0000 0000-00-00 404
0 1942 M. RJL rj 19 rue du Grand Léjon 22680 ETABLES SUR MER 0296766573 rjl22@wanadoo.fr 0000 0000 0000-00-00 403 1 1940 M. VIDENT André 13 bd du Littoral 22520 BINIC 0296708554 0686731937 andre.vident@gmail.com 2011 VP 0000 0000-
00-0 271

Un détail au passage, je suis choqué, une nouvelle fois d'avoir à me battre avec des caractères (é au lieu de é) alors que je tente de tout déclarer en utf-8 ! Toute la base est correcte... sauf les caractères accentués que je viens d'entrer en formulaire, lequel comporte pourtant...
<!DOCTYPE html>
<html lang="fr"><head>
<meta charset="utf-8"> c'est un détail !

Autre chose qui me laisse perplexe mes 7 nouveaux enregistrements sont rentrés sur 4 ou 5 jours donc au moins autant d'arrêt complet du micro et bien plus de réouverture, réinitialisations de la BD ; n'est-ce pas suffisant pour que l'actualisation se fasse ?
Est-il alors possible de rafraîchir automatiquement le site en fonctionnement normal ?

J'ai failli tenter un essai de suppression d'un enregistrement existant pour voir si la cible choisie était trouvée... J'ai arrêté à temps car c'est moins simple de recréer des enregistrements réels ! Néanmoins, j'ai laissé les instructions repassées en commentaires et les aurai utilisées si ce dénouement n'était pas intervenu !

Je vais maintenant tenter de régler les remarques que tu as formulées.
"Tu as défini des champs numériques, mais si l'opérateur saisit un texte avec des apostrophes, ça va provoquer des erreurs à coup sûr.
As-tu bien vérifié les types des données saisies avant de dire que ce sont bien des nombres, des dates ? "

Ultime question : "Comment intégrer aux enregistrements une colonne (un champ) en CURDATE () ?"

Je tenterai de faire appel à minima mais resterai sur ce fil pour éviter de repartir à zéro dans les explications.
Un très grand Merci de tout ce que tu as fait mais, comme tu as vu, rien n'est évident lorsqu'on débute !

Si tu as encore quelques instants merci de tes observations sur ce que j'ai indiqué cette fois et @ bientôt... sans doute sur d'autres thèmes où je risque de ne pas être beaucoup plus brillant !

RJL2703

<?php 
// Parametres mysql  
define('DB_SERVER', 'sql1');      // serveur mysql     localhost 
define('DB_SERVER_USERNAME', 'utlsudgoelo'); // nom d'utilisateur root 
define('DB_SERVER_PASSWORD', '********');   // mot de passe      motpasse 
define('DB_DATABASE', 'utlsudgoelo');    // nom de la base    telechargement 
// Connexion au serveur mysql 
$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD)  
or die('Impossible de se connecter : ' . mysql_error()); 

// controle valeurs transmises 
  
// sélection de la base de données 

mysql_select_db(DB_DATABASE, $connect) or die (mysql_error()); 

$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis: 
<br/><br/>"; 
$msg_ok = "Votre demande a bien été prise en compte."; 
$message = $msg_erreur; 
// vérification des champs 

print_r($_POST);  echo "\n";  // contrôle données traitées 

$anais =($_POST['anais']); 
if (empty($anais))  
  $message .= "Votre année de naissance<br/>"; 
  $ancour = date("Y"); 
if  (($anais <$ancour - 100) or 
 ($anais > $ancour -25))  
 $message .= "Année naissance incorrecte<br/>"; 
if (empty($_POST['civil']))  
    $message .= "Votre civilité<br/>";  
if (empty($_POST['nomadh']))  
 $message .= "Votre nom<br/>"; 
if (empty($_POST['prenom']))  
 $message .= "Votre prénom<br/>"; 
if (empty($_POST['ad1']))  
 $message .= "Votre adresse<br/>";  
$cpost =($_POST['cpost']); 
if  (($cpost <1000) or 
 ($cpost > 95999)) 
 $message .= "Code postal erroné<br/>"; 
if (empty($_POST['ville']))  
 $message .= "Votre ville<br/>"; 
// si un champ est vide, on affiche le message d'erreur 

if (strlen($message) > strlen($msg_erreur)) { 
 echo $message; }  
// sinon c'est ok  
else   {  
 $civil=mysql_real_escape_string(trim($_POST['civil'])); 
 $nomadh=mysql_real_escape_string(trim($_POST['nomadh']));  
 $prenom=mysql_real_escape_string(trim($_POST['prenom'])); 
 $ad1=mysql_real_escape_string(trim($_POST['ad1']));  
 $ad2=mysql_real_escape_string(trim($_POST['ad2']));  
 $ville=mysql_real_escape_string(trim($_POST['ville']));  
 $tfixe=mysql_real_escape_string(trim($_POST['tfixe']));  
 $tmob=mysql_real_escape_string(trim($_POST['tmob']));  
 $admail=mysql_real_escape_string(trim($_POST['admail']));   
//  foreach($_POST as $index => $valeur)  $$index = mysql_real_escape_string(trim($valeur));    
   
$sql = "INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail)    
   VALUES ('".$anais."', '".$civil."', '".$nomadh."', '".$prenom."', '".$ad1."', '".$ad2."', '".$cpost."', '".$ville."', '".$tfixe."', '".$tmob."', '".$admail."' )";  
echo '<br />',$sql,'<br />'; 
$res = mysql_query($sql); 
echo mysql_error(); 
print_r($res);     // contrôle données traitées 
  if ($res) { 
    echo $msg_ok; 
  } else { 
    echo mysql_error(); 
  } 
   
//$sql = "DELETE FROM adh WHERE prenom = 'René-Jacques'" 
// $req = @mysql_query($sql); 
// $res = @mysql_affected_rows($req); 

//if (empty($res)) 
// { 
// echo "Cible non trouvée"; 
// } 
//else 
// { 
// echo "Enregistrement supprimé"; 
// } 

//, CURDATE ()    //ligne INSERT ,MaJ  
// echo mysql_error(); 
//  if ($res) { 
//    echo $msg_ok; 
//  } else { 
//    echo mysql_error(); 
//  } 

   } //      était en relation avec 51      } 
?>

1 - pour tes problèmes d'encodage, il te manque une instruction :
mysql_query("SET NAMES utf8"); aussitôt après la sélection de la base de données mysql_select_db(DB_DATABASE, $connect) or die (mysql_error());

2 - En ce qui concerne les mises à jour que tu ne voyais pas, c'est sans doute à cause du cache de ton navigateur, ou d'un proxy, ou d'un serveur qui ne se rend pas compte que la page a changé, et qui la renvoie donc telle quelle.
Pour limiter les dégâts, j'ajoute quelques balise meta dans la partie <head> de mes pages :
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache, must-revalidate" />

Le résultat n'est pas satisfaisant à 100%, je ne maîtrise pas le sujet et je ne l'ai jamais vraiment creusé. Mais dans ton cas, la page qui pose un problème, c'est phpmyadmin, et tu ne vas pas le modifier. La meilleuremanip est alors de forcer le rafraîchissement (shift ou ctrl F5, je ne sais plus), voire de vider le cache de ton navigateur.

3 - Pour ajouter un champ en CURDATE(), il suffit de l'ajouter à la requête. Attention, il faut l'ajouter sans apostrophes autour, sinon, c'est une chaîne de caractères 'CURDATE()', pas l'appel à une fonction...
En supposant que tu as appelé ton champ date toto:
$sql = "INSERT INTO adh (anais, civil, nomadh, prenom, ad1, ad2, cpost, ville, tfixe, tmob, admail, toto)    
   VALUES ('$anais', '$civil', '$nomadh', '$prenom', '$ad1', '$ad2', '$cpost', '$ville', '$tfixe', '$tmob', '$admail',CURDATE() )";

Au passage j'ai supprimé un paquet de " et de . qui compliquaient inutilement la ligne.