Colonne de table mysql non opérationnelle
Résolu
christian82000
Messages postés
47
Date d'inscription
Statut
Membre
Dernière intervention
-
christian82000 Messages postés 47 Date d'inscription Statut Membre Dernière intervention -
christian82000 Messages postés 47 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Colonne de table mysql non opérationnelle
- Table ascii - Guide
- Déplacer colonne excel - Guide
- Table des matières word - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
6 réponses
Bonjour
Tout d'abord, je trouve très compliqué ton principe de dupliquer l'adresse mail dans une autre colonne et de la supprimer par endroits. La duplication d'informations est une source d'incohérences dans une base de données et est à proscrire. Pourquoi ne pas avoir simplement ajouté une colonne "aAfficher" qui contient 0 ou 1 selon que l'adresse est à afficher ou non ?
Ceci étant dit, ça devrait quand même marcher.
Quelques remarques :
Ton champ Prenoms s'appelle bien Prenoms avec un "s" comme on le voit dans ta requête ? Bizarre.
Tu fais un $req->fetch(); sans avoir vérifié que ta requête avait au moins une réponse ? C'est gonflé !
Comment as-tu dupliqué ta colonne email pour créer Identifiant ? Tu es sûr de ta duplication, tu n'as pas par exemple introduit des espaces en début ou en fin d'adresse ?
Et pour finir, on ne pallie pas "à" cette difficulté, on pallie cette difficulté. Mais ça non plus ça n'empêche pas ton script de marcher ^^
Tout d'abord, je trouve très compliqué ton principe de dupliquer l'adresse mail dans une autre colonne et de la supprimer par endroits. La duplication d'informations est une source d'incohérences dans une base de données et est à proscrire. Pourquoi ne pas avoir simplement ajouté une colonne "aAfficher" qui contient 0 ou 1 selon que l'adresse est à afficher ou non ?
Ceci étant dit, ça devrait quand même marcher.
Quelques remarques :
Ton champ Prenoms s'appelle bien Prenoms avec un "s" comme on le voit dans ta requête ? Bizarre.
Tu fais un $req->fetch(); sans avoir vérifié que ta requête avait au moins une réponse ? C'est gonflé !
Comment as-tu dupliqué ta colonne email pour créer Identifiant ? Tu es sûr de ta duplication, tu n'as pas par exemple introduit des espaces en début ou en fin d'adresse ?
Et pour finir, on ne pallie pas "à" cette difficulté, on pallie cette difficulté. Mais ça non plus ça n'empêche pas ton script de marcher ^^
Je maintiens que c'est une mauvaise idée de dupliquer un champ, mais c'est ton choix et ça devrait pouvoir marcher comme ça.
Tu parles ici d'une application MS Access qui gère tous les adhérents : es-tu en train de me dire que tu ne te contentes pas de dupliquer les champs, tu dupliques carrément les bases ? Je n'en dis pas plus, ce n'est pas le problème.
Par contre, avec toutes ces manipulations, je pense encore plus qu'avant qu'il est possible que tes données soient altérées. Un bon moyen de t'en assurer est de faire directement dans PHPmyadmin un
La première requête pour s'assurer que la duplication est correcte, la seconde pour vérifier que le champ ne comporte pas d'autres caractères que ceux que tu vois.
Tu parles ici d'une application MS Access qui gère tous les adhérents : es-tu en train de me dire que tu ne te contentes pas de dupliquer les champs, tu dupliques carrément les bases ? Je n'en dis pas plus, ce n'est pas le problème.
Par contre, avec toutes ces manipulations, je pense encore plus qu'avant qu'il est possible que tes données soient altérées. Un bon moyen de t'en assurer est de faire directement dans PHPmyadmin un
SELECT * FROM membres WHERE Identifiant=Emaild'une part, et un
SELECT Identifiant, LENGTH(Identifiant) FROM membresd'autre part.
La première requête pour s'assurer que la duplication est correcte, la seconde pour vérifier que le champ ne comporte pas d'autres caractères que ceux que tu vois.
J'avais mal interprété le fonctionnement de TRIM, je pensais qu'il retirait chacun des caractères du premier paramètre, alors qu'il retire la chaîne en bloc.
La requête correcte doit donc être :
Le plus propre serait évidemment d'attaquer le mal à sa source, de voir qui ajoute ces \r\n et d'intervenir à ce niveau.
La requête correcte doit donc être :
UPDATE membres SET Identifiant=TRIM('\r\n' FROM Identifiant),SANS espaces entre \n et l'apostrophe.
Le plus propre serait évidemment d'attaquer le mal à sa source, de voir qui ajoute ces \r\n et d'intervenir à ce niveau.
Le problème est cette fois bien résolu.
En effet, il faut voir d'ù viennent ces \r et \n. Je soupçonne le formulaire access qui permet la gestion des adhérents, le champ identifiant étant placé en fin de table ... ou alors, le script qui permet l'exportation au format texte ... Mais c'est un autre sujet dans une autre catégorie!
Merci en tout cas pour le temps passé sur mon problème.
Tiens, à tout hasard, je te joins le code qui alimente la table, si tu as encore 5 mn ...
<?php
$file=$_POST["membres"]; //Récupère le fichier texte "Membres.txt"
if (file_exists($file)) //Vérifie si le fichier membres existe
{
$lecture = fopen($file,"r"); //Ouvre le fichier $file
$ligne=fgets($lecture); //Lit la première ligne quiu contioent les noms de champs afin de ne pas l'exporter
while (!feof($lecture)) //boucle permettant la lecture du fichier ligne par ligne
{
$ligne=fgets($lecture); //isole une ligne
$champ=explode("\t",$ligne); //décompose la ligne en champs
//extrait les données champ par champ
if($champ[0]!="null")
{$Nom=$champ[0];}
else {$Nom=" ";}
if($champ[1]!="null")
{$Prenoms=$champ[1];}
else {$Prenoms=" ";}
----------------------------
if($champ[13]!="null")
{$MotDePasse=$champ[13];}
else {$MotDePasse=" ";}
if($champ[14]!="null")
{$Identifiant=$champ[14];}
else {$Identifiant=" ";}
//Insertion des données dans la table membres
$stmt= $bdd->prepare('INSERT INTO membres(
Nom,
Prenoms,
-----------------------
MotDePasse,
Identifiant
)
VALUES(
:Nom,
:Prenoms,
----------------------------
:MotDePasse,
:Identifiant
)');
$stmt->execute(array(
'Nom' => $Nom,
'Prenoms' => $Prenoms,
--------------------------------------
'MotDePasse' => $MotDePasse,
'Identifiant' => $Identifiant
));
} //fin du while
} //fin du if initial d'insertion des membres
$bdd="null";
Très cordialement avec tous mes remerciements.
Christian
En effet, il faut voir d'ù viennent ces \r et \n. Je soupçonne le formulaire access qui permet la gestion des adhérents, le champ identifiant étant placé en fin de table ... ou alors, le script qui permet l'exportation au format texte ... Mais c'est un autre sujet dans une autre catégorie!
Merci en tout cas pour le temps passé sur mon problème.
Tiens, à tout hasard, je te joins le code qui alimente la table, si tu as encore 5 mn ...
<?php
$file=$_POST["membres"]; //Récupère le fichier texte "Membres.txt"
if (file_exists($file)) //Vérifie si le fichier membres existe
{
$lecture = fopen($file,"r"); //Ouvre le fichier $file
$ligne=fgets($lecture); //Lit la première ligne quiu contioent les noms de champs afin de ne pas l'exporter
while (!feof($lecture)) //boucle permettant la lecture du fichier ligne par ligne
{
$ligne=fgets($lecture); //isole une ligne
$champ=explode("\t",$ligne); //décompose la ligne en champs
//extrait les données champ par champ
if($champ[0]!="null")
{$Nom=$champ[0];}
else {$Nom=" ";}
if($champ[1]!="null")
{$Prenoms=$champ[1];}
else {$Prenoms=" ";}
----------------------------
if($champ[13]!="null")
{$MotDePasse=$champ[13];}
else {$MotDePasse=" ";}
if($champ[14]!="null")
{$Identifiant=$champ[14];}
else {$Identifiant=" ";}
//Insertion des données dans la table membres
$stmt= $bdd->prepare('INSERT INTO membres(
Nom,
Prenoms,
-----------------------
MotDePasse,
Identifiant
)
VALUES(
:Nom,
:Prenoms,
----------------------------
:MotDePasse,
:Identifiant
)');
$stmt->execute(array(
'Nom' => $Nom,
'Prenoms' => $Prenoms,
--------------------------------------
'MotDePasse' => $MotDePasse,
'Identifiant' => $Identifiant
));
} //fin du while
} //fin du if initial d'insertion des membres
$bdd="null";
Très cordialement avec tous mes remerciements.
Christian
Le "fgets" lit la ligne courante jusqu'à la fin de ligne incluse, c'est la doc qui le dit. Un fichier texte classique créé sous Windows se termine par CR LF (\r\n si tu préfères).
Si tu ne fais aucun traitement particulier, il est normal de retrouver ces caractères dans tes variables. Pourquoi n'utilises-tu pas l'export de excell en csv, et la lecture avec fgetcsv, qui t'éviterait ce genre de problème ?
Au passage, je te vois écrire à plusieurs reprises "null" dans ton script. Je ne sais pas si tu en es conscient, mais "null" est une chaîne de 4 caractères, ce qui n'est pas la même chose que la valeur spéciale null (sans guillemets).
Si tu ne fais aucun traitement particulier, il est normal de retrouver ces caractères dans tes variables. Pourquoi n'utilises-tu pas l'export de excell en csv, et la lecture avec fgetcsv, qui t'éviterait ce genre de problème ?
Au passage, je te vois écrire à plusieurs reprises "null" dans ton script. Je ne sais pas si tu en es conscient, mais "null" est une chaîne de 4 caractères, ce qui n'est pas la même chose que la valeur spéciale null (sans guillemets).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour Le Père,
D'abord, merci pour ta réponse rapide.
Quelques précisions supplémentaires : la table contient d'autres colonnes telles que Adresse1, ReferencePhoto, Telephone ... qui sont aussi à afficher, ou non, sans qu'il y ait nécessairement correspondance entre-elles. Je m'explique : Untel permet l'affichage de sa photo, mais pas de son téléphone, Tel autre permet l'adresse mail mais pas sa photo, etc. J'ai donc trouvé plus simple d'adopter la méthode de duplication de la colonne mail. Pour ce faire, j'ai créé la colonne dans phpMyAdmin (que ce soit dans wamp ou chez OVH qui héberge le site) puis j'ai fais la duplication dans une application MS access qui gère tous les adhérents, par un copier collé de la colonne, exportation au format texte et injection dans la base de données MySQL par un insert into précédé d'un truncate table. De ce fait, il n'y a pas de risque de mauvaise duplication ou de blanc avant ou après la chaîne de caractères.
Enfin, la vérification de l'existence d'une réponse à la requête est effectivement à ajouter, mais cela n'explique pas pourquoi mon truc ne fonctionne pas.
Et puis merci pour le cours de français!
Je continue à chercher!
Christian
D'abord, merci pour ta réponse rapide.
Quelques précisions supplémentaires : la table contient d'autres colonnes telles que Adresse1, ReferencePhoto, Telephone ... qui sont aussi à afficher, ou non, sans qu'il y ait nécessairement correspondance entre-elles. Je m'explique : Untel permet l'affichage de sa photo, mais pas de son téléphone, Tel autre permet l'adresse mail mais pas sa photo, etc. J'ai donc trouvé plus simple d'adopter la méthode de duplication de la colonne mail. Pour ce faire, j'ai créé la colonne dans phpMyAdmin (que ce soit dans wamp ou chez OVH qui héberge le site) puis j'ai fais la duplication dans une application MS access qui gère tous les adhérents, par un copier collé de la colonne, exportation au format texte et injection dans la base de données MySQL par un insert into précédé d'un truncate table. De ce fait, il n'y a pas de risque de mauvaise duplication ou de blanc avant ou après la chaîne de caractères.
Enfin, la vérification de l'existence d'une réponse à la requête est effectivement à ajouter, mais cela n'explique pas pourquoi mon truc ne fonctionne pas.
Et puis merci pour le cours de français!
Je continue à chercher!
Christian
En fait, je ne duplique pas la base depuis access vers MySQL. La table MySQL est alimentée classiquement par un script php qui lit un fichier texte, séparateurs tabulation, puis qui alimente la table par un into. C'est ce fichier texte qui est généré par access.
En fait, il y a bien un problème de correspondance des données, puisque la première requête renvoi un résultat vide..... Il faut donc que je vérifie la procédure d'alimentation de la table, la création du fichier texte, etc!
D'un point de vue php, je considère donc le sujet résolu.
Merci encore pour le temps que tu a pris pour examiner mon problème et pour tes conseils toujours avisés
Christian
En fait, il y a bien un problème de correspondance des données, puisque la première requête renvoi un résultat vide..... Il faut donc que je vérifie la procédure d'alimentation de la table, la création du fichier texte, etc!
D'un point de vue php, je considère donc le sujet résolu.
Merci encore pour le temps que tu a pris pour examiner mon problème et pour tes conseils toujours avisés
Christian