Colonne de table mysql non opérationnelle

Résolu/Fermé
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - 23 sept. 2014 à 21:55
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - 26 sept. 2014 à 08:31
Bonjour à toutes et à tous,
Je viens vers vous après plusieurs heures de galère... Voilà le problème:
J'ai une table MySQL "membres" qui contient plusieurs champs, dont un champ MotdePasse et un Champ Email. A l'origine, ce champ Email servait d'identifiant soit pour l'accès à la partie réservée du site, soit pour récupérer le mot de passe. Ce même champ est affiché dans l'annuaire des membres. Tout cela fonctionnait parfaitement.
Or, certains membres ont exprimé le désir de ne pas afficher leur adresse mail. Pour pallier à cette difficulté, j'ai créé une nouvelle colonne appelée identifiant contenant toutes les adresses mail, et supprimé dans la colonne Email ceux qui ne devaient pas s'afficher. J'ai donc remplacé dans la requête MySQL Email par Identifiant : et là, ça ne fonctionne plus! Je me suis donc résolu à solliciter votre aide.
Voici mon code permettant de récupérer le mot de passe (le même problème se retrouve pour l'accès à la partie privée) :


<?php
if(!empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['courriel']))
{
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$mail=$_POST['courriel'];<code>

echo '<p>'.$nom.' '. $prenom.' '. $mail.'</p>';

$req = $bdd->prepare('SELECT * FROM membres WHERE Nom = ? AND Prenoms = ? AND Identifiant = ?');
$req->execute(array($nom, $prenom, $mail));
$row = $req->fetch();

echo '<h3 class="centre1">Votre mot de passe est : '.$row['MotDePasse'].'</h3>';

$req->closeCursor();
}
?>
</code>

J'ajoute que je n'ai aucun message d'erreur. C'est comme si le champ ajouté était masqué, car si je remets Email à la place d'Identifiant dans la requête select, ça fonctionne à nouveau.
Le echo avant la requête permet simplement de vérifier que le $_POST fonctionne, ce qui est le cas.
Merci par avance de vos suggestions.
Christian

A voir également:

6 réponses

Utilisateur anonyme
23 sept. 2014 à 22:50
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 ^^
1
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
SELECT * FROM membres WHERE Identifiant=Email
d'une part, et un
SELECT Identifiant, LENGTH(Identifiant) FROM membres
d'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.
1
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 :
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.
1
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
25 sept. 2014 à 18:46
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
0
Utilisateur anonyme
25 sept. 2014 à 19:12
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).
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
24 sept. 2014 à 08:59
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
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
24 sept. 2014 à 11:57
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
0
Utilisateur anonyme
24 sept. 2014 à 12:04
De rien.
La deuxième requête t'envoie-t-elle bien le résultat attendu ? Sur tes deux champs Identifiant et Email ? Si tu détectes une anomalie de ce côté-là, fais afficher les codes ASCII de chacun des caractères du champ, ça devrait te donner une bonne indication.
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
24 sept. 2014 à 15:30
Elle me retourne l'erreur suivante :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM membres LIMIT 0, 30' at line 1
0
Utilisateur anonyme
24 sept. 2014 à 15:39
Je viens de vérifier, la requête semble correcte. Tu n'aurais pas oublié de refermer la parenthèse entre Identifiant et WHERE ?
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
24 sept. 2014 à 15:57
Je viens de refaire la requête : le nombre de caractères indiqué est supérieur de 2 à celui affiché !
Il faut vraiment que je revoie ma procédure!
Merci encore mille fois!
Christian
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
26 sept. 2014 à 08:31
Bonjour le père,
Ben ... je ne connaissais pas fgetcsv ....
Cette solution fonctionne.
Quand aux "null" je pensais que s'agissant d'une chaine de caractères, elle devait être entourée de ' ou de ".
Merci de tes bons conseils.
Christian
0