Enregistrement incompréhensible MySQL

Résolu/Fermé
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - Modifié par heliconius le 3/04/2013 à 15:07
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 3 avril 2013 à 17:15
Bonjour tout le monde,

Qui pourrait m'aider dans un problème MySQL qui me laisse perplexe ?

Je bâtis une application de gestion.
L'analyse de la gestion à effectuer a été faite à l'aide de Merise.
Parmi les tables, une table gia_Clients ainsi structurée :

mysql> desc gia_Clients;      
+------------+---------------+------+-----+---------+----------------+      
| Field      | Type          | Null | Key | Default | Extra          |      
+------------+---------------+------+-----+---------+----------------+      
| idcli      | int(11)       | NO   | PRI | NULL    | auto_increment |      
| nom        | varchar(30)   | NO   |     |         |                |      
| prenom     | varchar(30)   | NO   |     |         |                |      
| sexe       | enum('F','M') | YES  |     | F       |                |      
| adresse    | varchar(50)   | NO   |     |         |                |      
| idcom      | int(11)       | NO   |     | 0       |                |      
| tel        | varchar(15)   | NO   |     |         |                |      
| mob        | varchar(15)   | NO   |     |         |                |      
| mail       | varchar(50)   | NO   |     |         |                |      
| jnais      | int(11)       | NO   |     | 0       |                |      
| mnais      | int(11)       | NO   |     | 0       |                |      
| anais      | int(11)       | NO   |     | 0       |                |      
| sfam       | varchar(5)    | NO   |     |         |                |      
| prof       | varchar(50)   | NO   |     |         |                |      
| sante      | text          | NO   |     |         |                |      
| traitement | text          | NO   |     |         |                |      
| obscli     | varchar(128)  | NO   |     |         |                |      
| idmed      | int(11)       | NO   |     | 0       |                |      
+------------+---------------+------+-----+---------+----------------+      
18 rows in set (0.00 sec)

# NB:
# idcom = identifiant de la commune (choisi dans une liste)
# idmed = identifiant du médecin traitant (choisi dans une liste)


Un script client.php a été écrit pour saisir et enregistrer un client.
D'ordinaire un tel script ne pose pas de problème. Son pseudo code :

initialisations      
si rappel du script après validation      
    enregistrer client dans la base      
fin si      
afficher formulaire de saisie      
(la validation rappelle le script avec PHP_SELF)      

Le dernier ID client est 48 et la valeur de l'auto_increment est à 49.
Une saisie a été effectuée avec les valeurs suivantes:

idcli      :            (auto_increment)      
nom        : MARTIN      
prenom     : Henri      
sexe       : M      
adresse    : 10 rue de la gare      
idcom      : 217      
tel        : 01 02 03 04 05      
mob        : 06 07 08 09 10      
mail       : henri.martin@monfai.fr      
jnais      :       
mnais      : 10      
anais      : 1990      
sfam       : C      
prof       : Représentant      
idmed      : 15      
sante      : Bon état général      
traitement :      
obscli     : Très souvent en déplacement.

après validation, la consultation de la table gia_Clients donne l'enregistrement suivant :

idcli      = 49      
nom        = 0      
prenom     = 0      
sexe       =      
adresse    = 0      
idcom      = 0      
tel        = 0      
mob        = 0      
mail       = 0      
jnais      = 1      
mnais      = 0      
anais      = 0      
sfam       = 0      
prof       = 0      
sante      = 0      
traitement = 1      
obscli     = 0

Plusieurs essais donnent des résultats identiques. (...°£!!?$*§!!*...)

Il y a au début du fichier client.php :

require("init.php");
Dans ce fichier init.php se trouve la fonction de connexion à la base de données ainsi qu'une fonction ExecRequete() à qui l'on passe comme argument la requête à exécuter et l'identifiant de connexion à la base de données. Cette fonction renvoie le résultat de la commande exécutée ou un message d'erreur :

function ExecRequete($requete,$connexion) {      
   $resultat = mysql_query($requete,$connexion);      
   if($resultat) { return $resultat; } else { showError(3,$requete); }      
}

Pour traquer le problème, j'ai inséré dans ce fichier init.php une fonction d'envoi par mail de ce qui est fait :

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      
// Envoi de messages pour debuggage (en l'occurence les requêtes MySQL)      
// $_debug = 0 ou 1 (être ou ne pas être en mode debug)      
// $_dmail = adresse mail à qui envoyer le debuggage      
function sendRequests($message,$compsujet="") {
	global $_debug, $_dmail, $connexion, $REMOTE_ADDR;
	if($_debug) {
		if($connexion) { $cnx = "\nConnexion MySQL: $connexion";    }
		else           { $cnx = "\nConnexion MySQL: non constatée"; }
		$to      = $_dmail;
		$subject = "Debuggage. ".$compsujet;
		$headers = "From: debug@mondomaine.com";
		$foot    = "\r\n---\r\nExp: $REMOTE_ADDR, le ".date("d/m/Y H:i:s").$cnx;
		mail($to,$subject,$message.$foot,$headers);
	}
}

A partir de là, le script client.php construit la requete correctement et l'exécute mais l'exécution produit l'enregistrement erroné cité plus haut. La partie de code du script client.php est la suivante:

client.php :

... construction requete...      
sendRequests($requete."\n\$resultat: ".$resultat, "avt ExecRequete");      
$resultat = ExecRequete($requete, $connexion);      
sendRequests($requete."\n\$resultat: ".$resultat, "apr ExecRequete");      
...suite du script...

Mail envoyé AVANT exécution de la requête (est correcte) :

Subject: Debuggage: avt ExecRequete      
From: debug@mondomaine.com      
Date: 3 Apr 2013 11:27:22 +0000      
To: xxxx@yyyyyyyy      

insert into gia_Clients (nom,prenom,sexe,adresse,idcom,tel,mob,mail,jnais,mnais,anais,sfam,prof,sante,traitement,obscli,idmed) values (nom='MARTIN', prenom='Henri', sexe='M', adresse='10 rue de la gare', idcom='217', tel='01 02 03 04 05', mob='06 07 08 09 10', mail='henri.martin@monfai.fr', jnais='', mnais='10', anais='1990', sfam='C', prof='Représentant', sante='Bon état général', traitement='', obscli='Très souvent endéplacement', idmed='15');      
$resultat:       
---      
Exp: 92.123.52.13, le 03/04/2013 11:27:22      
Connexion MySQL: Resource id #3

Mail envoyé APRES exécution de la requête (toujours correcte) :

Subject: Debuggage: apr ExecRequete      
From: debug@mondomaine.com      
Date: 3 Apr 2013 11:27:22 +0000      
To: xxxx@yyyyyyyy      

insert into gia_Clients (nom,prenom,sexe,adresse,idcom,tel,mob,mail,jnais,mnais,anais,sfam,prof,sante,traitement,obscli,idmed) values (nom='MARTIN', prenom='Henri', sexe='M', adresse='10 rue de la gare', idcom='217', tel='01 02 03 04 05', mob='06 07 08 09 10', mail='henri.martin@monfai.fr', jnais='', mnais='10', anais='1990', sfam='C', prof='Représentant', sante='Bon état général', traitement='', obscli='Très souvent endéplacement', idmed='15');      
$resultat: 1      
---      
Exp: 92.123.59.13, le 03/04/2013 11:27:22      
Connexion MySQL: Resource id #3

Problème:

La requête est bonne (bien construite) AVANT et (toujours bonne) APRES exécution.
Une insertion se fait mais pas avec les valeurs précisées. Et à première vue, les textes ont été remplacés par des nombres. En revanche, dans un autre script, la lecture d'un catalogue de prestations dans une autre table de la même base de données s'effectue correctement.

Je n'arrive pas à cerner le problème. MySQL ? PHP ? Je ne penche pas pour un problème PHP, puisque PHP envoie par mail les données correctes. Problème de droits d'écriture dans la base ? J'ai ré-attribué tous les droits à l'utilisateur :
GRANT ALL PRIVILEGES on LABASE.* to 'xxxxx'@'%' IDENTIFIED BY 'yyyyyyy';
C'est toujours pareil.

Quelqu'un a-t-il une solution ou une piste de recherche ?

Merci beaucoup pour votre aide.

PS: J'ai accès à la machine en tant que root (et admin MySQL) par SSH.

A voir également:

1 réponse

jee pee Messages postés 40559 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 décembre 2024 9 459
Modifié par jee pee le 3/04/2013 à 16:55
Bonjour,

Juste une observation, si je dis une bêtise je supprimerai mon message ;-)

Ça existe comme syntaxe values (nom='MARTIN', prenom='Henri', ... c'est à dire donner le nom de la colonne alors quelle est déjà dans la liste avant values ??

Généralement on met values ('MARTIN', 'Henri',

Cdlt


Un étranger, c'est un ami qu'on n'a pas encore rencontré.
1
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 139
3 avril 2013 à 17:15
Punaise de Sang du Diable !!!! C'est le genre de connerie sur laquelle tu vas passer 100 fois sans la voir jusqu'au moment où elle te saute aux yeux !

En fait, le même script fait aussi les modifications où la requête est :
update gia_Clients set nom='MARTIN', prenom='Henri', etc...

C'est probablement à cause de ça que j'ai été aveugle :o) En tout cas, 1000 merci à toi de l'avoir vu de suite... ça fait 2 jours que je suis dessus, mdrrrr
Merci.
0