Bonjour à tous,

Je suis confronté à un problème pour récupérer les données dans ma base et les afficher.

Sur ma page : www.alexbass.net23.net/vosinformations.php, je propose à l'utilisateur, de s'identifier en indiquant son adresse email.
La je fais une recherche dans ma base et elle s'y trouve, l'utilisateur doit pouvoir visualiser son nom et son prénom et les modifier s'il le souhaite.
J'arrive bien à vérifier si l'adresse email se situe dans la base, mais je n'arrive pas à afficher les informations qui y correspondent.

<div id="bloc_page_données_personnelles">
	<?php
	if ((!isset($_POST['email']) OR $_POST['email'] == ""))
	{
	?>
		<form method="post" action="vosinformations.php"> 
			<p>Modifier vos informations</p>
			<p>Identifiez vous avec votre email :
			<input type="email" name="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']?>" id="email" placeholder="exemple@mail.fr" maxlength="51" required/>
			<input type="submit" name="envoi" value="Je m'identifie" title="Cliquez ici pour vous identifier"/></p>
		</form>
	<?php
	}
	else // L'adresse email est remplie, on peut la rechercher et afficher les infos correspondantes.
	{
	define('DB_SERVER', '*************'); 
	define('DB_SERVER_USERNAME', '**************'); 
	define('DB_SERVER_PASSWORD', '*************'); 
	define('DB_DATABASE', '*************');
	// Connexion au serveur mysql 
	$connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD); 
	// sélection de la base de données 
	mysql_select_db(DB_DATABASE,$connect);
	$email = $_POST['email'];
	//Trouver la ligne correspondant à la variable email
	$query = "SELECT * FROM newsletter WHERE email LIKE '".$email."%'";
	$result = mysql_query($query);
	// Recuperation des resultats
	if (!mysql_fetch_row($result)) {
		echo "Votre adresse email n'a pas été trouvé dans notre base.";
	}
	else { 
		while($row = mysql_fetch_row($result)){ 
		$nom = ($row[1]); 
		$prenom = ($row[2]);
	?> <p>Le nom : <?php echo $nom;?> et le prénom : <?php echo $prenom;?></p><?php
	}
					
	?>
	<form method="post" action="vosinformations.php">
		<p>Vous êtes identifiez sous l'adresse éléctronique : <?php echo "$email"?> </p>
		<p>Votre Nom :
		<input type="text" name="nom" value="<?php if(!empty($_POST['nom'])) echo $_POST['nom']?>" id="nom" placeholder="Nom" maxlength="31" required/>
		<br />
		Votre Prénom :
		<input type="text" name="prenom" value="<?php if(!empty($_POST['prenom'])) echo $_POST['prenom']?>" id="prenom" placeholder="Prénom" maxlength="31" required/>
		<br />
		<input name="action" type="radio" value="abo" 
		checked="checked" /> 
		S'abonner 
		<input type="radio" name="action" value="desabo" /> 
		Se désabonner 
						
		<input type="submit" name="valid" value="Valider" /> 
	</form>
	<?php
	mysql_close();
	}
	}
	?>
</div>


Merci d'avance de votre aide, caire je n'y vois plus claire...

Cordialement.
Modifié par Alexbass (25 Sep 2013 - 14:42)
Bonjour,

Pour visualiser le contenu de $row :
print_r($row);


Teste ta requête dans PHPMyAdmin (ou autre client MySQL).

Parcontre je trouve çà bizarre pour l'identification se fasse dans une table appelé "newsletters" et que dans cette table on retrouve les noms et prénoms des utilisateurs...
Bonjour mini-truc,
Dans cette table, il y a un ID autoincrémenté, l'adresse email de l'utilisateur, son nom et son prénom.
J'aurais pu appeler cette table "internautes_inscrits_à_la_newsletter".

Je n'arrive pas à faire la manipulation que tu m'as donnée.
Dans PHPMyAdmin, dois-je mettre le code PHP ? c'est à dire
$query = "SELECT * FROM newsletter WHERE email LIKE '".$email."%'";
	$result = mysql_query($query);
	// Recuperation des resultats
	if (!mysql_fetch_row($result)) {
		echo "Votre adresse email n'a pas été trouvé dans notre base.";
	}
	else { 
		while($row = mysql_fetch_row($result)){ 
        print_r($row);
        }
        }

Je pense que ma volonté de résultat ressemble fortement à ça, mais j'ai essayer de refaire sans y parvenir et sans tout comprendre... http://www.phpdebutant.org/forum_msg265962.php
Modifié par Alexbass (25 Sep 2013 - 14:53)
Commence déjà par passer à mysqli_ (voir lien dans ma signature) ou à PDO. Le lot de fonction mysql_ est désuète depuis un certain temps et obsolète depuis le php 5.5. Il est temps de migrer vers une extension plus récente.

Ensuite :

1) var_dump($email) juste avant ta query (ça te permettra d'avoir l'orthographe exacte fournie par php).
2) teste ta requête sous un client mysql (tels phpmyadmin)
3) var_dump($row); (informations plus complètes que print_r)
4) au lieu d'utiliser fetch_row (qui sert à parcourir tes résultats), utilise plutôt un num_rows (qui te sert à savoir combien il y a de lignes dans le résultat. Si ça donne 0 c'est que le email n'a pas été trouvé).
5) le while n'a aucun intérêt ici pour parcourir les résultats. Comme la personne s'identifie par le email, ça signifie que 1 adresse mail = 1 compte et donc 1 adresse mail = 1 résultat. Tu n'as aucune raison d'avoir une boucle.
6) Au lieu d'un fetch_row, je préfère le fetch_assoc, mais c'est personnel. (n'empêche qu'un $result=mysqli_fetch_assoc($ressource); qui te sort un $prenom=$result['prenom']; est plus parlant que $prenom=$row[1] ^^)
Modifié par Lothindil (25 Sep 2013 - 15:02)
Bonjour Lothindil,

J'ai déjà utiliser PDO, donc je vais faire ainsi.
Par contre j'essai mais sans succès.
Voici le code que j'ai :
//tentative de connection à la base
try { $bdd = new PDO('mysql:host=server20.000webhost.com;dbname=a1056217_alex', 'a1056217_bddmail', '**********');}
//gestion des erreurs
catch(Exception $e){die('Erreur : '.$e->getMessage());}
Voici l'erreur générée :
Erreur : SQLSTATE[HY000] [1130] Host '31.170.160.84' is not allowed to connect to this MySQL server
Ok, j'avance doucement mais surement, j'en suis là :
else // L'adresse email est remplie, on peut la rechercher et afficher les infos correspondantes.
{
//tentative de connection à la base
try { $bdd = new PDO('mysql:host=mysql4.000webhost.com;dbname=a1056217_bddmail', 'a1056217_alex', '**********');}
//gestion des erreurs
catch(Exception $e){die('Erreur : '.$e->getMessage());}
$email = $_POST['email'];
$reponse = $bdd->query("SELECT * FROM newsletter WHERE email LIKE '".$email."%'");
$donnees = $reponse->fetch();
?> <p>Le nom : <?php echo $donnees['nom'];?> et le prénom : <?php echo $donnees['prenom'];?></p><?php
}
Cela affiche bien le prénom et le nom, mais je voudrais que le deuxième formulaire ne s'affiche qu'après avoir vérifié l'existence de l'adresse dans la base. Merci de votre aide.
Je sent que je progresse :
else // L'adresse email est remplie, on peut la rechercher et afficher les infos correspondantes.
{
//tentative de connection à la base
try { $bdd = new PDO('mysql:host=mysql4.000webhost.com;dbname=a1056217_bddmail', 'a1056217_alex', '**********');}
//gestion des erreurs
catch(Exception $e){die('Erreur : '.$e->getMessage());}
$email = $_POST['email'];
var_dump($email);
$reponse = $bdd->query("SELECT * FROM newsletter WHERE email LIKE '".$email."%'");
$donnees = $reponse->fetch();
$row_cnt = $donnees->num_rows;
if ($num_cnt <= 0) {
	echo "Votre adresse email n'a pas été trouvé dans notre base.";
}
else { 
?> <p>Le nom : <?php echo $donnees['nom'];?> et le prénom : <?php echo $donnees['prenom'];?></p><?php
}
Suis pas accroc au PDO, mais en mysqli je ferais ainsi :


if(0==$ressource->num_rows)
{
   //Ici tout ce que tu mets si y a pas l'adresse mail dans la table
}
else
{
 //Tout ce qui doit être fait si le mail est dans la fiche.
}


en PDO, ça doit être cette fonction : http://php.net/manual/fr/pdostatement.rowcount.php

(au passage, faudra absolument vérifier $_POST['email'], on sait jamais qu'un petit malin s'amuse à y mettre un "insert chais pas quoi" dedans ^^)


edit : tu peux tester directement ta fonction, pas besoin d'ajouter une variable ^^ (donc if(...) au lieu de $num=...; if($num==0) )


edit 2 : tente aussi le yoda style. Ca évite les erreurs stupides ^^ donc :
if(3==$var) et pas if($var==3)
Comme ça, si tu oublies un =, php râle direct Smiley lol
Modifié par Lothindil (25 Sep 2013 - 16:35)
J'ai beau retourner le problème dans tous les sens, j'ai pas l'impression que l'adresse email soit trouvée dans la base :
<div id="bloc_page_données_personnelles">
	<?php
		if ((!isset($_POST['email']) OR $_POST['email'] == ""))
		{
	?>
		<form method="post" action="vosinformations.php"> 
			<p>Modifier vos informations</p>
			<p>Identifiez vous avec votre email :
			<input type="email" name="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']?>" id="email" placeholder="exemple@mail.fr" maxlength="51" required/>
			<input type="submit" name="envoi" value="Je m'identifie" title="Cliquez ici pour vous identifier"/></p>
		</form>
	<?php
		}
		else // L'adresse email est remplie, on peut la rechercher et afficher les infos correspondantes.
		{
                //tentative de connection à la base
                try { $bdd = new PDO('mysql:host=mysql4.000webhost.com;dbname=a1056217_bddmail', 'a1056217_alex', '**********');}
                //gestion des erreurs
                catch(Exception $e){die('Erreur : '.$e->getMessage());}
                $email = $_POST['email'];
                var_dump($email);
                $reponse = $bdd->query("SELECT * FROM newsletter WHERE email LIKE '".$email."%'");
                $donnees = $reponse->fetch();
                $row_cnt = $donnees->num_rows;
                if ($num_cnt <= 0) { //[b][#red]<-LA J'AI UN SOUCI PARCE QUE num_cnt EXISTE PAS IL FAUT QUE JE METTE row_cnt[/#][/b]
	              echo "Votre adresse email n'a pas été trouvé dans notre base.";
                }
               else { 
                      ?> <p>Le nom : <?php echo $donnees['nom'];?> et le prénom : <?php echo $donnees['prenom'];?></p><?php
               }
       ?>
		<form method="post" action="vosinformations.php">
			<p>Vous êtes identifiez sous l'adresse éléctronique : <?php echo "$email"?> </p>
			<p>Votre Nom :
			<input type="text" name="nom" value="<?php if(!empty($_POST['nom'])) echo $_POST['nom']?>" id="nom" placeholder="Nom" maxlength="31" required/>
			<br />
			Votre Prénom :
			<input type="text" name="prenom" value="<?php if(!empty($_POST['prenom'])) echo $_POST['prenom']?>" id="prenom" placeholder="Prénom" maxlength="31" required/>
		        <br />
		        <input name="action" type="radio" value="abo" 
			checked="checked" /> 
			S'abonner 
			<input type="radio" name="action" value="desabo" /> 
			Se désabonner 
						
			<input type="submit" name="valid" value="Valider" /> 
		</form>
	<?php
		}
		}
               $reponse->closeCursor(); // Termine le traitement de la requête [#red][b]<- CA JE NE SAIS PAS TROP OU LE PLACER[/b][/#]
	?>
</div>

J'arrive pas vraiment à appliquer ta méthode à mon cas précis. Par exemple c'est quoi $ressource?
Voilà, mon objectif étant de récupérer dans le deuxième formulaire, les noms et prénoms associés à l'adresse mail renseignée et de pouvoir mettre à jour la base si les informations sont complétées ou modifiées ou supprimées.
Modifié par Alexbass (25 Sep 2013 - 17:43)
On va faire ça proprement. Je te donne le principe global et tu complètes ^^ :

/*Partie "test" */
/*on initialise une variable drapeau et un drapeau d'erreur*/
$testOK=0; /*A 0 elle indique que les test n'ont pas été passé*/
$erreur=0; /*A 1, elle signifie que le mail rentré était faux*/
if(/*test pour savoir si le mail a été rentré est positif*/) 
{
   //connexion à la base de données (1)
   //sécurisation de $_POST['mail'] (2)
   //requête pour rechercher le nom et le prénom à partir du mail (3)
   if(/*Nombre de ligne dans la requête <=0 (4)*/)
   {
       $erreur=1;
   }
  else /*si le email est bien dans la base*/
  {
       //On récupère les données (5) et on fixe les variables $prenom et $nom
       $testOK=1; //on signale que le email est là et qu'il existe
       
  }
  /*tu clos ta connexion*/
}

/*Partie affichage*/
if($testOK==0) //si les tests sont échoués, on va devoir afficher le premier formulaire
{
      if($erreur==1) //si y avait bien un mail d'encoder, mais qu'il est pas dans ta table
      {
            //Tu affiches le message d'erreur.
       }
       //tu affiches le premier formulaire
}
else //si le test a bien marché et donc que le mail était juste
{
      ////Tu affiches le 2ème formulaire.
}


(1) via PDO
(2) avec une fonction type Filter_var
(3) ton select suivi de l'envoi de la requête.
(4) à tester en PDO avec la fonction rowCount
(5) utilisation d'un fetch de ton choix


Voilà, j'ai fait ma part de boulot, le reste tu devrais t'en sortir je pense ^^


Ah oui, j'ai séparé la partie "test" de la partie "affichage" parce que ça rend le code plus clair et plus facilement lisible, à condition de commenter les variables "drapeau" ($testOK et $erreur dans notre cas) idée de savoir à quoi ça correspond.
Bonsoir,
Et oui le temps passe, il est déjà le soir Smiley decu
J'ai pas forcément tout compris dans ce que tu m'as expliqué, mais j'ai quand même grace à toi, réussi une première partie de mon taff. Voici le code.
Pour ce qui est de la sécurisation de l'email, j'ai pas bien compris les explications du PHP.
Par contre je crois qu'il faut que je rajoute quelque chose du genre htmlspecialchars ou addslashes?
Voici mon code qui fonctionne pour le moment :
<div id="bloc_formulaire">
	<?php
		if ((!isset($_POST['email']) OR $_POST['email'] == ""))
		{
	?>
		<form method="post" action="vosinformations.php">
			<p>Pour acceder à vos informations</p>
			<p>Identifiez vous avec votre email :
			<input type="email" name="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']?>" id="email" placeholder="exemple@mail.fr" maxlength="51" required/>
			<input type="submit" name="envoi" value="Je m'identifie" title="Cliquez ici pour vous identifier"/></p>
		        </form>
	<?php
		}
		else // L'adresse email est remplie, on peut la rechercher et afficher les infos correspondantes.
		{
		//tentative de connection à la base
		try { $bdd = new PDO('mysql:host=mysql4.000webhost.com;dbname=a1056217_bddmail', 'a1056217_alex', '************');}
		//gestion des erreurs
		catch(Exception $e){die('Erreur : '.$e->getMessage());}
		$email = $_POST['email'];

		//cherche la variable email dans la table
		$reponse = $bdd->query("SELECT * FROM newsletter WHERE email LIKE '".$email."%'");
		$donnees = $reponse->fetch();

		// Recuperation des resultats
		$row_cnt = $reponse->rowCount();
		       if ($row_cnt == 0) {
		                echo "Votre adresse email n'a pas été trouvé dans notre base.";
			}
			else { 
					
				$reponse->closeCursor(); // Termine le traitement de la requête
	?>
		<form id="formulaire" method="post" action="vosinformations.php">
			<p>Vous êtes identifié sous l'adresse éléctronique : <?php echo "$email"?> </p>
			<p class="floatstop">
			<label for="nom">Nom : </label>
			<input type="text" name="nom" value="<?php echo $donnees['nom'];?>" id="nom" placeholder="Nom" maxlength="31" required/>
			<br />
			<label for="prenom">Prénom : </label>
			<input type="text" name="prenom" value="<?php echo $donnees['prenom'];?>" id="prenom" placeholder="Prénom" maxlength="31" required/>
			<br />
			<div id="bouton_centré">
				<input type="submit" name="valid" value="Valider" title="Cliquez ici pour enregistrer vos informations"/>
			</div>
		</form>
	<?php
			}
			//A partir de là, je peux enregistrer les nouvelles informations rentrées dans la base si je ne me trompe pas.			
		}				
	?>
</div>

Je ferais un nouveau post pour l'enregistrement des infos.
La fonction filter_var permet (en fonction du filtre choisis) de :

validation
nettoyage

(ainsi que d'autres choses mais je les utilise moins)


Dans notre cas, 2 possibilités :
1) FILTER_VALIDATE_EMAIL > permet de savoir si le email est valide ou non
2) FILTER_SANITIZE_EMAIL > permet de nettoyer le email.

Donc soit tu testes que le email est bien un email :

if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{
   //mail valide
}
else
{
   //mail invalide
}


Ou alors, tu t'en sers pour nettoyer le email :

$email=filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
Merci lothindil. Du coup je n'utilise ni htmlspecialchars ni addslashes...
J'ai choisit de nettoyer l'adresse email. C’était plus simple à intégrer.
Est ce que c'est bien là où j'ai mis mon commentaire, que je vais pouvoir ajouter ou modifier les nom et prenom correspondant à l'email en cours d'utilisation?
Tu devrais vraiment séparer le business (traitement des données) et l'affichage, tu y verrais plus clair.

La fermeture de base de données :
- si tu sépares pas les 2 parties, tu fermes juste avant le body et tu ouvres au début du body
- si tu sépares les 2 parties, tu ouvres au début de la partie de business et tu fermes à la fin.

Le mieux, vu que tu veux avoir un 2ème formulaire qui renvoie toujours sur la même page, c'est de séparer, sinon tu vas pas t'en sortir.
Ceci va te forcer à utiliser les drapeaux (ou flag).

Un drapeau, c'est une variable que tu vas initialiser et que tu vas modifier au fur et à mesure de tes conditions. Elle va te permettre de savoir ce que tu dois afficher dans ton cas.

Dans ton cas, tu as besoin de 2 "drapeaux" :
le premier $formulaire, il va permettre à ta partie "affichage" de savoir s'il doit mettre le formulaire 1 ou 2 ou remercier simplement la personne.
le second $erreur va être un tableau te permettant de savoir quels erreurs afficher.

Le principe :

- au début de ton fichier :
1) tu ne sais pas quel formulaire tu dois afficher, mais tu choisis de mettre le formulaire 1 (celui d'authentification) par défaut. Donc $formulaire=1;
2) pas d'erreurs prévues donc $erreur=array(); (c'est un tableau vide)

Ensuite, partie "business" (partie traitant les données, les nettoyant, les analysant et les envoyant dans les tables), la logique c'est :

Je me connecte à la base de données (ça coûte rien et ça peut servir)
si il y a un email :
alors
1) je nettoie le email
2) je teste si le email est dans le base de données (select puis rowCount)
si le email n'est pas dans la base de données
alors
$formulaire=1; (je dois remettre le formulaire 1)
$erreur[0]=1; (je dois afficher l'erreur n°1 - "l'adresse email mentionnée n'apparaît pas dans notre base de données")
si le email est dans la base de données
alors
$formulaire=2; (je dois mettre le formulaire n°2)
si il y a des données du formulaire 2 (pour savoir si ça a été rempli)
alors
1) je teste si chaque variable devant être pleine l'est.
sinon : $formulaire=2; (faudra le réafficher) $erreur[0]=2; (je dois afficher l'erreur n°2 "les champs avec une * doivent être rempli")
2) si $erreur[0]!=2 (en gros si y a pas d'erreur)
je teste/nettoie toutes les variables envoyées ($_POST en gros)
Si y a des erreurs, j'utilise le flag $erreur pour ajouter des erreurs avec un code pour chacune.
si y en a pas, j'utilise une requête préparée pour insérer ça dans les tables.
au choix : $formulaire=2 (si tu veux remettre le formulaire n°2) ou $formulaire=0 (si t'en veux pas)

Je ferme la base de données.



Partie "Affichage" :

doctype, html, head, ouverture du body, html qui va avant la partie "formulaire"
<?php si y a une erreur
alors ?>
J'affiche les erreurs en fonction de leur code.
<?php si ($formulaire==1)
alors ?>
j'affiche le formulaire n°1
<?php si ($formulaire==2)
alors ?>
j'affiche le formulaire n°2

tu continues ton html hors de ta partie formulaire
fermeture body et html.


Voilà, c'est plus clair ? Smiley langue
Merci pour tout Lothindil.
Je regarderais cela de plus près demain. Je crois effectivement avoir vu beaucoup trop de code dans la journée pour essayer cette méthode ce soir.
Je pense réellement essayer de l'appliquer pour que le code soit plus clair, et que je puisse également l'adapter à d'autres fonctionnalités.
Bonne soirée et à demain. Et encore merci.
Bonjour;
Pour infos : J'ai pas avancé.
J'ai pas eu le temps. Dès que j'y retouche, je reviens ici pour finaliser mon dossier "newsletter" Smiley smile
A très vite.