heliconius
Messages postés539Date d'inscriptionmardi 1 juillet 2008StatutMembreDernière intervention23 juin 2023
-
Modifié par heliconius le 3/04/2013 à 15:07
heliconius
Messages postés539Date d'inscriptionmardi 1 juillet 2008StatutMembreDernière intervention23 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 :
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 :
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.
jee pee
Messages postés40559Date d'inscriptionmercredi 2 mai 2007StatutModérateurDernière intervention17 décembre 20249 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é.
heliconius
Messages postés539Date d'inscriptionmardi 1 juillet 2008StatutMembreDernière intervention23 juin 2023139 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.
3 avril 2013 à 17:15
En fait, le même script fait aussi les modifications où la requête est :
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.