Page 1 sur 2

afficher Profil perso éditable

Posté : 09 mars 2012, 17:59
par Vince cotta
Bonjour à tous,
voici mon problème: J'essaye de mettre en place, sur mon site, un système de profil éditable. Je me retrouve devant plusieurs problèmes.
-Comment faire en sorte que lorsqu'une option n'est pas renseigné le formulaire s'envoi quand même?
-J'ai cette erreur qui apparait lors de l'execution du formulaire je ne comprendpas pourquoi.
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

et j'aimerais faire un système complexe que je n'arrive pas à mettre en place:
Lorsque je suis connecté à mon profil j'édite une textarea qui doit apparaitre une fois écrite juste en bas (jusque la sa va) mais une fois réecrite je voudrais qu'elle sois réedité, mais seulement pour ce membre ci. Et créer ainsi un textarea personnalisable pour chaque membre.

Re: afficher Profil perso éditable

Posté : 09 mars 2012, 21:18
par libertux
Salut,

Normalement le formulaire s’envoie dans tout les cas mais le problème c'est coté requête SQL, bon voila un aperçue sur comment ça marche en générale :

normalement vous avez un fichier (html ou php) qui contient le formulaire supposons que ce fichier est (index.php) il contient donc quelque chose comme :
<form id="contact" name="contact" action="enregistrer.php" method="post">
<p><label>Name: <input type="text" id="nom" name="nom" value="" /></label></p>
<p><label>Email: <input type="text" id="email" name="email" value="" /></label></p>
<p><input type="submit" id="enregistrer" name="enregistrer" value="enregistrer" /></p>
</form>
 
donc notre formulaire contient deux champs :
- le champ "nom" qui n'est pas obligatoire.
- le champ "email" qui sera obligatoire.

Donc l'utilisateur doit remplir le champ "email" mais il peut ignoré le champs "nom". Notre formulaire est donc envoyer au fichier "enregistrer.php" qui doit vérifier les informations envoyé (ici question sécurité que je ne vais pas abordé mais incontournable) puis enregistrer les informations dans la base de données.

Notre fichier "enregistrer.php" doit pouvoir se connecté a notre serveur MySQL donc il doit avoir quelque chose comme suit :
...
$hostname = "localhost";
$database = "db_contacts";
$username = "root";
$password = "back2skl";
$connection = mysql_connect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database, $connection);
...
puis il doit récupérer les informations du formulaire donc :
...
$nom = $_POST['nom'];
$email = $_POST['email'];
...
maintenant il faut construire notre requête SQL et l’exécuté pour enregistrer les informations dans la base de données:
$ma_requete = 'insert into matable(NOM,EMAIL) values ('.$nom.','.$email.')';
$resultat = mysql_query($ma_requete, $connection) or die(mysql_error());

if($resultat)
{
    header('Location: ok.php');
}else{
    header('Location: erreur.php');
}
Bon c'est un code générique pour comprendre le processus, de plus il est préférable de faire les vérifications des données introduites par l'utilisateur par un script JavaScript (JQuery) si un erreurs est détecté c'est avant l'envoi du formulaire qu'on informera l'utilisateur de la non conformité des données.

Bon travail,

Re: afficher Profil perso éditable

Posté : 11 mars 2012, 00:16
par Vince Cotta
Alors tout d'abord merci de s'intéresser à mon problème. Toutefois je pense qu'il est nécessaire de préciser que j'ai déja un code, qui d'ailleurs utilise PDO pour se connecter à la base de données et visiblement tout marche, sauf quand il ya insertion de données le nombre ne correspond visiblement pas, et apres vérification de l'orthogaphe et de la syntaxe je ne trouve rien. Ensuite, comment faire pour mon dernier probleme concernant les textarea?

Je fournis le code de la page concernant le Pb 1 et s'il faut je donnerais le 2nd. Merci encore.
<?php
session_start();

if(empty($_SESSION['membre']))
{
header('Location: terre.php');
}

try
{
$bdd= new PDO('mysql:host=localhost;dbname=croizad', 'root', '') or die(print_r($bdd->errorInfo()));
$bdd->exec('SET NAMES utf8');
}

catch(Exeption $e){
die('Erreur:'.$e->getMessage());
}

$req = $bdd->prepare('SELECT * FROM membre WHERE login=:login');
$req->execute(array('login'=>$_SESSION['membre']));
$data= $req->fetch();
$req->closeCursor();


if(!empty($_POST))
{
extract($_POST);
$valid = true;

	if($valid = true)
	{
$req = $bdd->prepare('INSERT INTO membre  (nom,prénom,age,sexe,adresse,site,profession) VALUES (:nom,:prénom,:age,:sexe,:adresse,:site,:profession');
$req->execute(array(
'nom'=>$nom,
'prénom'=>$prénom,
'age'=>$age,
'sexe'=>$sexe,
'adresse'=>$adresse,
'site'=>$site,
'profession'=>$profession));
$req->closeCursor();
$ok = 'Modification réussie. Reconnectez vous';
session_destroy();
}
}

?>
<!DOCTYPE html>
<html>
	    <meta charset="utf-8" />
		<link href="style.css" rel="stylesheet"/>
	<head>
		<title>CROIZAD|chacun sa croix</title>
	</head>
	<body>
		<?php include("bann.php"); ?>
		<?php include("menu.php"); ?>
	<div class="titre">Profil de <?php echo $data['login'];?></div>
	<br/>
	<section>
<div id="contenu">
<ul class="profil">
<li><a href="profil.php">Informations</a></li>
<li><a href="profil1.php">Editer E-m@il|Mot de Passe</a></li>
<li><a href="manifeste.php">Manifeste</a></li>
<li><a href="ajout.php">Ajouter infos</a></li>
</ul>

<div class="profil2">
<?php if(isset($ok)) echo '<div class="ok">'.$ok.'<div>';?>
<p>Vous pouvez retrouvez toutes vos informations ici,</p>
<form method="post" action="ajout.php">
<fieldset><legend>Ajouter infos</legend>
	<label for="nom"><u><b>Nom:</u></b></label>
	<input type="text" name="nom" id="nom" value="<?php if(isset($data['nom'])) echo $data['nom'];?>">
	<div><?php if(isset($erreurnom)) echo $erreurnom;?></div>
	<br/>
	<label for="prénom"><u><b>Prénom:</u></b></label>
	<input type="text" name="prénom" id="prénom" value="<?php if(isset($data['prénom'])) echo $data['prénom'];?>">
	<div><?php if(isset($erreurprénom)) echo $erreurprénom;?></div>
<br/>
	<label for="age"><u><b>Date de Naissance:</label>
	       <select name="age" id="age">
		   <option value="<1940"><1940</option>
           <option value="1940-1950">1940-1950</option>
		   <option value="1950-1960">1950-1960</option>
		   <option value="1960-1970">1960-1970</option>
		   <option value="1970-1980">1970-1980</option>
		   <option value="1980-1990">1980-1990</option>
		   <option value="1990-2000">1990-2000</option>
		   <option value="2000-2010">2000-2010</option>
		   <option value=">2010">>2010</option>
       </select>
	<div><?php if(isset($erreurage)) echo $erreurage;?></div>
<br/>
<br/>
	<label for="sexe">Sexe</label>
		   <select name="sexe" id="sexe">
		   <option value="homme">Homme</option>
           <option value="femme">Femme</option>
       </select>

<br/>	
<br/>
	<label for="adresse"><u><b>Adresse:</u></b></label>
	<input type="text" name="adresse" id="adresse" value="<?php if(isset($data['adresse'])) echo $data['adresse'];?>">
	<div><?php if(isset($erreuradresse)) echo $erreuradresse;?></div>
<br/>
	<label for="site"><u><b>Site internet:</u></b></label>
	<input type="url" name="site" id="site" value="<?php if(isset($data['site'])) echo $data['site'];?>">
	<div><?php if(isset($erreursite)) echo $erreursite;?></div>
<br/>
	<label for="profession"><u><b>Profession:</u></b></label>
	<input type="text" name="profession" id="profession" value="<?php if(isset($data['profession'])) echo $data['profession'];?>">
	<div><?php if(isset($erreurprofession)) echo $erreurprofession;?></div>
<br/>
	<input type="submit" value="Envoyer">
</fieldset>
	<form>
</div>
	</section>
		<?php include("footer.php"); ?>
	</body>
</html>

Re: afficher Profil perso éditable

Posté : 11 mars 2012, 22:23
par libertux
Salut,

Avez vous le message d'erreur ? si non voulez vous vérifier ce qui suit :
...
'prénom'=>$prénom,
...
d'habitude les lettres accentués posent souvent problèmes!

Bon travail,

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 18:24
par Vince COTTA
J'en suis à présent à un point ou aucun message d'erreur n'apparait mais rien ne s’insère dans la BDD. Pour plus de sécurité j'ai toutefois remplacé tous les champs prénom par prenom également dans la BDD

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 18:30
par Vince COTTA
A savoir, ce problème m'arrive également lorsque j’utilise mon autre fichier php cité précédemment.

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 18:50
par Vince COTTA
Bon ca marche maintenant sauf que cela à pour effet de remplir toute mes lignes c'est à dire que si un membre change ses infos tous les membres auront les mêmes infos que ce dernier. J'ai essayé un UPDATE WHERE mais sans succes ^^

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 18:52
par xTG
WHERE quoi ?

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 19:31
par Vince COTTA
Bah j'essaye plusieurs trucs, mais le plus judicieux serait de mettre l'id cependant comment peut on implanter un id dans un WHERE style $_SESSION['id'] est-ce possible?

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 19:33
par xTG
Une requête SQL ce n'est qu'une chaîne de caractère, donc on y concatène ce que l'on veut.
$mot = 'test';
$phrase = 'Ceci est un ' . $mot . ' de concaténation.';
La question serait plutôt, d'où peut provenir l'identifiant unique à insérer dans la requête.
Et là on ne peut répondre à ta place car cela dépend de ton système de connexion.

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 20:28
par Vince COTTA
Tout à fait oui après avoir revu mes sources j'ai résolu le problème et malgré quelques obstacles j'ai enfin réussi sans toutefois pouvoir vérifier si le pseudo existait mais qu'importe je ferais sa plus tard. Toutefois je suis sur un autre soucis. J'ai une text area qui ne veut pas s’insérer dans ma bdd voyez vous pourquoi?
<?php
session_start();

if(empty($_SESSION['membre']))
{
header('Location: terre.php');
}

try
{
$bdd= new PDO('mysql:host=localhost;dbname=croizad', 'root', '') or die(print_r($bdd->errorInfo()));
$bdd->exec('SET NAMES utf8');
}

catch(Exeption $e){
die('Erreur:'.$e->getMessage());
}

if(!empty($_POST))
{
extract($_POST);
$valid = true;
}

else
{
$valid=false;
}

if($valid)
{
$req = $bdd->prepare('UPDATE membre SET (text=:text)');
$req->execute(array('text'=>$text));
$req->closeCursor();
}
?>
<!DOCTYPE html>
<html>
	<head>
	    <meta charset="utf-8" />
		<link href="style.css" rel="stylesheet"/>
		<title> CROIZAD - Chacun sa croix</title>
		<?php include("bann.php"); ?>
		<?php include("menu.php"); ?>
	</head>
	<body>
		<div class="titre">Profil de <?php echo $_SESSION['membre'];?></div>
	<br/>
<section>
	<br/>
		<div id="contenu">
<ul class="profil">
<li><a href="profil.php">Informations</a></li>
<li><a href="profil1.php">Editer E-m@il|Mot de Passe</a></li>
<li><a href="manifeste.php">Manifeste</a></li>
<li><a href="ajout.php">Ajouter infos</a></li>
</ul>
<div class="profil2">
	<form action="manifeste.php" method="post">
	<fieldset>
	<label for="text">Manifeste</label><br/>
	<textarea name="text" id="text" rows=10 cols=40></textarea><br/>
	<br/>
	<input type="submit" value="Ecrire">
	<br/>
	</fieldset>
	</form>
	</div>
</div>
<br/>
<br/>
<?php 
$req = $bdd->prepare('SELECT * FROM membre WHERE login = '.$_SESSION['membre'].'')->fetchColumn();?>
<div class="manifeste">
<?php echo $req ?>
 <h3><?php if(isset($_SESSION['membre'])) {echo $_SESSION['membre'];} ?></h3>
 <br/>
 <p><?php if(isset($data['text'])) {echo $_SESSION['text'];} ?></p>
</div>
	<br/>
	</div>
	</section>
             <?php include("footer.php"); ?>
	</body>
</html>			 

Re: afficher Profil perso éditable

Posté : 13 mars 2012, 20:36
par xTG
text est un mot réservé en SQL, cela provient sans doute de là.

Re: afficher Profil perso éditable

Posté : 14 mars 2012, 18:38
par libertux
Salut,

évitez les mots réservés (text)!

dans ton code il y a :
...
if($valid)
{
$req = $bdd->prepare('UPDATE membre SET (text=:text)');
$req->execute(array('text'=>$text));
$req->closeCursor();
}
...
alors ce code vas mettre ajour toutes les lignes de la table "membre" car il n y a pas la close "where" je n'utilise pas PDO mais il faut avoir un truck comme :
...
if($valid)
{
$req = $bdd->prepare('UPDATE membre SET (text=:text) where id='.$_SESSION['id']);
$req->execute(array('text'=>$text));
$req->closeCursor();
}
...
si vous enregistrer l'id du membre dans une variable session ça devra marché.

Bon Travail,

Re: afficher Profil perso éditable

Posté : 14 mars 2012, 18:56
par Vince COTTA
Merci pour vos réponses,
J''avais toutefois réglé pas mal de ces problèmes tout seul au final (C'est bien la peine de demander crétin :evil: ) Mais bon m'en voulez pas j'ai toujours besoin de vos précieux commentaires car mes deux pages ne sont pas terminé :D Par exemple pour la page d'ajout d'info j'aimerai donner la possibilité de changer également le pseudo et faire donc une vérification si celui ci n'existe pas. Alors je copie colle le "if reqcount>0 $erreur pseudo déja pris. En sélectionnant l'ID" (formule simplifié est il nécessaire de le préciser :wink: ) qui marche très bien lors de l'inscription et la non fin bref. Existe-t'il une autre solution? Et en ce qui concerne ma deuxième page carnage totale rien ne s'affiche plus. #-o Mais bon je vais suivre vos conseils à propos de "$text" et tenter par moi même, de résoudre tout ça sinon je reviens et je $_POST le code ^^.

Re: afficher Profil perso éditable

Posté : 14 mars 2012, 20:34
par libertux
Salut,

Pour vérifier l'existence du pseudo dans la base, je te conseille d'utilisé Ajax c'est plus pratique, professionnel et évite a l'utilisateur de rechargé la page inutilement juste pour luis dire que le pseudo qu'il a choisi existe déjà.

Bon, c'est mon point de vue :)

si tu a des soucies pour le faire fait signe te je vais voir pour planifier un peut de temps pour vous préparer un exemple fonctionnel ;)

Bon Travail