Page 1 sur 1

correction de code souhaitée

Posté : 26 août 2012, 15:32
par Angela81
Bonjour à tous !

Je vous expose ma galère du jour :
J'ai une page avec un formulaire d'adhésion (qui équivaut à un formulaire pour enregistrer une nouvelle entrée dans ma table 'membres') : adhesion.php
J'ai une autre page qui traite les données postées par le biais de ce formulaire : form_adhesion_trait.php
Jusque là, tout va bien. :D

Là où ça ne va plus, c'est que la page form_adhesion_trait se comporte tout le temps comme si le champs 'pseudo' du formulaire est vide/inexistant, et ce même si je le remplis ! #-o
j'y comprends rien.
Surtout que le traitement du 'pseudo' est identique au traitement des autres champs, et que pour les autres, ça marche bien !

Je vous met les codes.
page adhesion :
 <?php
require("../tech/lang/decide-lang.php");
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<!-- "Test" est à changer à chaque fois qu'on crée une nouvelle page --> 
<title>ACCUEIL</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
<!-- ....................................-->
<!--[if lt IE 9]>
<script
src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <!-- ce commentaire est un commentaire spécial qui est lu par Internet explorer pour assurer la compatibilité avec les versions antérieures a IE9 
...............................-->
<link rel="stylesheet" href="../tech/style1.css" />
<!-- le lien contenu dans href=" " renvoi vers le fichier css utilisé sur la page. à modifier en fct° -->  
</head>
<body>

<div class="vertical_1_3">
	<?php include('../tech/header_gauche.php') ; ?>
	
	<section class="section_1_3">
	<?php include('../tech/menus/menu_gauche1.php') ; ?>
	</section>
</div>

<div class="vertical_2_3">
	<?php include('../tech/header_centre.php') ; ?>
	
	<section class="section_2_3">
				
	<!-- choix du menu à afficher -->
	<?php 
	if((isset($_SESSION['pseudo'])) AND (isset($_SESSION['mdp_hache']))) {
		include('../tech/menus/menu_top2.php'); }
	else {
		include('../tech/menus/menu_top1.php');}?>
	
	<!-- affichage du contenu de la section -->
	
		<h1><?php echo text_adhesion;?></h1>
	<p><?php echo text_choix_adhesion;?><a href="#adhesion_hors_ligne"><?php echo text_adhesion_h_l ;?></a><?php echo soit;?><a href="#adhesion_en_ligne"><?php echo text_adhesion_en_ligne ;?></a>
	<br />
	<?php echo condition_cotisation;?><br /><?php echo condition_statuts;?>
	<br /><br />
	<a href="../tech/fichiers/statuts.pdf"><?php echo telecharge_statuts;?></a>
	<br /></p>
	
		<h2 id="adhesion_en_ligne"><?php echo text_adh_en_ligne;?></h2>
		
		<p><?php echo procedure_adhesion_ligne;?></p>	
		
			<h3>Formulaire d'adhésion en ligne</h3>
	<form method="post" action="../tech/form/form_adhesion_trait.php">
	<table>
		<tr>
			<td><label for="pseudo"><?php echo text_pseudo_x; ?></label></td>
			<td><input type="text" name="pseudo" id="pseudo" maxlength="30" />
			<td><?php echo caracteristiques_pseudo ; ?></td>
		</tr>
		<!--............ -->
		<tr>
			<td><label for="mdp1"><?php echo text_mdp_x; ?></label></td>
			<td><input type="password" name="mdp1" id="mdp1" /></td>
			<td><?php echo caracteristiques_mdp; ?></td>
		</tr>
		<!--............ -->
		<tr>
			<td><label for="mdp2"><?php echo retapez_votre_mdp; ?></label></td>
			<td><input type="password" name="mdp2" id="mdp2" /></td>
		</tr>
		<!--............ -->
		<tr>
			<td><label for="email1"><?php echo email_x; ?></label></td>
			<td><input type="email" name="email1" id="email1" />
		</tr>
		<!--............ -->
		<tr>
			<td><label for="email2"><?php echo retapez_votre_email_x; ?></label></td>
			<td><input type="email" name="email2" id="email2" /></td>
		</tr>
		<!--.............-->
		<tr>
			<td><?php echo votre_genre_x;?></td> 
			<td><input type="radio" name="genre" value="homme" id="homme" checked="checked" /><label for="homme"><?php echo un_homme; ?></label></td>
			<td><input type="radio" name="genre" value="une femme" id="femme" /> <label for="femmme"><?php echo une_femme; ?></label></td>
		</tr>
		<!--..............-->
		<tr>
			<td><input type="submit" value="<?php echo TEXT_ENVOYER; ?>" /></td>
		</tr>
	</table>
	<br />
		<h1 id="adhesion_hors_ligne"><?php echo text_adh_h_l;?></h1>
			<p>Baratin a finir<br /></p>
	</section>
	<?php include('../tech/footer.php') ?>
</div>

<div class="vertical_3_3">
	<?php include('../tech/header_droite.php'); ?>
	
	<section class="section_3_3">
	<p>pubs</p>
	</section>
</div>

</body>
</html>  

et la page form_adhesion_trait :
 <?php 
// pour pouvoir écrire les $_SESSION //
session_start(); 
// pour changer la langue //
require("../lang/decide-lang.php");?>

<!--........... recupération des données du formulaire ............-->
<!-- actions si les $_POST existent et si ils ne sont pas vides -->
<?php // pseudo
if ((isset($_POST['pseudo'])) AND (!empty($_POST['pseudo']))) 
{
// On rend inoffensives les balises HTML que le visiteur a pu rentrer
$_POST['pseudo'] = htmlspecialchars($_POST['pseudo']);
// on transforme $_POST('xxx'] en $xxx
$pseudo= htmlspecialchars($_POST['pseudo']); 
echo pseudo_ok;}
else {
echo erreur_pseudo;
exit;} ?>
<?php // mdp1
if ((isset($_POST['mdp1'])) AND (!empty($_POST['mdp1'])))
{
// On rend inoffensives les balises HTML que le visiteur a pu rentrer
$_POST['mdp1'] = htmlspecialchars($_POST['mdp1']); 
// on transforme $_POST('xxx'] en $xxx

$mdp1=$_POST['mdp1']; 
echo mdp1_ok;}
else {
echo erreur_mdp1;
exit;} ?>
<?php // mdp2
if ((isset($_POST['mdp2'])) AND (!empty($_POST['mdp2'])))
{
// On rend inoffensives les balises HTML que le visiteur a pu rentrer
$_POST['mdp2'] = htmlspecialchars($_POST['mdp2']);
// on transforme $_POST('xxx'] en $xxx
$mdp2=$_POST['mdp2']; 
echo mdp2_ok;}
else {
echo erreur_mdp2;
exit;} ?>
<?php // email1
if ((isset($_POST['email1'])) AND (!empty($_POST['email1'])))
{
// On rend inoffensives les balises HTML que le visiteur a pu rentrer
$_POST['email1'] = htmlspecialchars($_POST['email1']);
// on transforme $_POST('xxx'] en $xxx
$email1=$_POST['email1']; 
echo email1_ok;}
else {
echo erreur_email1;
exit;} ?>
<?php // email2
if ((isset($_POST['email2'])) AND (!empty($_POST['email2'])))
{
// On rend inoffensives les balises HTML que le visiteur a pu rentrer
$_POST['email2'] = htmlspecialchars($_POST['email2']);
// on transforme $_POST('xxx'] en $xxx
$email2=$_POST['email2']; 
echo email2_ok;}
else {
echo erreur_email2;
exit;} ?>
<?php // genre
if ((isset($_POST['genre'])) AND (!empty($_POST['genre'])))
{$genre=$_POST['genre']; 
echo genre_ok;}
else {
echo erreur_genre;
exit;} ?>
<!-- validation des champs de vérification -->
<?php // mdp
if ($mdp1 === $mdp2) { //si les 2 $ créées à la ligne 15 et 22 sont identiques
$mdp = $_POST['mdp1'];
echo mdp_ok;}
else {
echo erreur_mdp;
exit; } ?>
<?php // mail
if ($email1 === $email2) { //si les 2 $ créées à la ligne 29 et 36 sont identiques
$email=$_POST['email1']; // creation de la variable $email qui a la même valeur que $_POST['email1'] 
echo email_ok;} // affichage du message de confirmation sur ma page test temporaire
else {
echo 'erreur_email - message erreur_mail de la ligne 85';
exit; } 
?>

<?php // format du pseudo
if (preg_match("#^[a-zA-Z0-9_-]{4,30}$#", $pseudo))
{
echo pseudo_valide;  
}
else
{
echo pseudo_non_valide;
exit;}
?>
<?php // format du mdp
if (preg_match("#^[a-zA-Z0-9]{4,16}$#", $mdp))
{
echo mdp_valide;  
}
else
{
echo mdp_non_valide;
exit;}
?>
<?php // format de l'email1 
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email))
{
echo email_valide;  
}
else
{
echo email_non_valide;
exit;} 
 ?>
 
<?php // connexion à la base
$db = mysql_connect('localhost', 'root', '')  or die('Erreur de connexion '.mysql_error());
// sélection de la base  
    mysql_select_db('gv2',$db)  or die('Erreur de selection '.mysql_error()); 
	
	// Hachage du mot de passe
$mdp_hache = sha1($_POST['mdp1']);

 // on regarde si le pseudo existe déjà 
    $sql = "SELECT id FROM membres WHERE pseudo='$pseudo'"; 
    $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());  

    // on compte le nombre de résultats 
    $res = mysql_num_rows($req); 

    if($res!=0)  // le pseudo existe déjà, on affiche un message d'erreur 
        { 
        echo pseudo_existant; 
		exit;
        } 
    else  {// le pseudo n'existe pas, on insère les informations du formulaire dans la table 

    // on écrit la requête sql  & on insère les informations du formulaire dans la table 
	$sql = "INSERT INTO membres(id, pseudo, mdp, date_enregistrement, sexe, email) VALUES('','$pseudo','$mdp_hache',NOW(),'$genre', '$email')"; 
	} 

    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
	
	
	?>
	
<?php 
session_start ();
$_SESSION['pseudo'] = $pseudo;	
$_SESSION['mdp_hache'] = $mdp_hache;

	header('Location: ../../pg/espace_membre.php'); 	
?>

  
Merci d'avance pour votre aide.

Re: correction de code souhaitée

Posté : 26 août 2012, 16:12
par schim59
Bonjour,

Pour commencer je mettrai addslashes($pseudo)...Dans form_adhesion_trait.php au niveau de la requete d'INSERT pour eviter les problèmes de carctères spé.

htmlspecialchars($_POST['pseudo']) le fait deja il me semble. Je continu a chercher

QUel est le pseudo que tu tentes d'enregistrer ?

"et ce même si je le remplis ! "
Si tu mets
INSERT iNTO tatable (pseudo) VALUES ('lepseudo');
Ca marche pas ?

Re: correction de code souhaitée

Posté : 26 août 2012, 17:47
par sirakawa
Pour commencer, il faudrait s'assurer des valeurs transmises:
<?PHP
var_dump ($_POST);die();
?>
Si le pseudo est là, le probleme est dans le script de traitement, sinon il est dans celui de saisie.

Re: correction de code souhaitée

Posté : 26 août 2012, 20:26
par Angela81
Rebonjour tout le monde

Désolée pour le temps de réponse mais j'ai la famille qui a débarqué à l'improviste...

Bon je refais le test en mettant dans le formulaire le pseudo bidule et j'ai mis la formule magique que Sirakawa m'a conseillé (et que je ne connaissais pas. Merci Sirakawa !)

et ça m'a donné ça :
array (size=7)
'pseudo' => string '' (length=0)
'mdp1' => string 'aaaa' (length=4)
'mdp2' => string 'aaaa' (length=4)
'email1' => string '[email protected]' (length=15)
'email2' => string '[email protected]' (length=15)
'genre' => string 'homme' (length=5)
'mdp' => string '' (length=0)

Donc effectivement, le pseudo est vide ! et oui, je suis fatiguée mais non pas au point de me tromper sur un truc comme ça : j'ai bien rempli la case en écrivant bidule dedans ! J'ai encore une fois examiné le code de mon formulaire... et je ne vois rien de special qui pourrais justifier que $pseudo soit envoyé vide.

Là où ça m'a aussi fait tilt! c'est pour le dernier : 'mdp' => string '' (length=0)
Le souci c'est que ce mdp est sensé contenir quelque chose...
Par contre, cette $mdp n'est pas une variable transmise par le formulaire mais une variable que je crée plus loin dans mon code (ligne 77). Alors j'ai rien contre sur le fait que var_dump ($_POST) me donne aussi les variables qui ne sont pas des $_POST mais alors dans ce cas là, il m'en manque !!!

j'y comprends rien...

Re: correction de code souhaitée

Posté : 26 août 2012, 20:33
par Angela81
Pour commencer je mettrai addslashes($pseudo)...Dans form_adhesion_trait.php au niveau de la requete d'INSERT pour eviter les problèmes de carctères spé.

htmlspecialchars($_POST['pseudo']) le fait deja il me semble. Je continu a chercher
C'est bien pour cela que j'ai mis ces htmlspecialchars.
QUel est le pseudo que tu tentes d'enregistrer ?
j'ai tout essayé ! officiellement c'est soit bidule , soit test1 (mais j'en ai même essayé d'autres beaucoup moins poli et ce ne serait pas correct si je les ecrivais ici ! :mrgreen: )
"et ce même si je le remplis ! "
Si tu mets
INSERT iNTO tatable (pseudo) VALUES ('lepseudo');
si je remplis "manuellement" le VALUES ('le pseudo'], je ne sais pas recharger la page de traitement sans qu'elle rebloque sur le $pseudo soit disant vide.
Ca marche pas ?

Re: [RESOLU] correction de code souhaitée

Posté : 26 août 2012, 23:40
par Angela81
Vous savez quoi ? Ne cherchez plus.
j'en ai raz-le-bol (et encore je suis polie !) donc je repasse à mon ancienne version de formulaire qui était peut-être moins sécurisée mais qui au moins fonctionnait.
Pour la sécurité, je verrais ça plus tard (ou pas, on verra a ce moment là !) .

Merci encore à ceux qui ont pris la peine de me répondre et toutes mes excuses pour le dérangement inutile.

Re: [RESOLU] correction de code souhaitée

Posté : 27 août 2012, 07:57
par Invité
Bonjour,
Pour la sécurité, je verrais ça plus tard (ou pas, on verra a ce moment là !) .
Tu devrais au moins passer les données qui viennent du formulaire par la commande mysql_real_escape_string() pour éviter les "injections sql".
Genre : $pseudo = mysql_real_escape_string($_POST['pseudo']);

Bon, je suis un amateur en php et je vois dans le manuel que cette fonction est obsolète et qu'on devrait plutôt utiliser l'extension MySQLi ou PDO_MySQL.
C'est juste pour prévenir.
Je laisse les pros prendre la main pour les vraies solutions :wink:

Re: [RESOLU] correction de code souhaitée

Posté : 27 août 2012, 13:00
par sirakawa
il faut mettre le var_dump juste après le <?PHP initial de adhsesion_trait.PHP
et ajoute
</form>
après :
<tr>
<td><input type="submit" value="<?php echo TEXT_ENVOYER; ?>" /></td>
</tr>
</table>

Re: [RESOLU] correction de code souhaitée

Posté : 27 août 2012, 17:04
par Angela81
Bonjour,
Pour la sécurité, je verrais ça plus tard (ou pas, on verra a ce moment là !) .
Tu devrais au moins passer les données qui viennent du formulaire par la commande mysql_real_escape_string() pour éviter les "injections sql".
Genre : $pseudo = mysql_real_escape_string($_POST['pseudo']);

Bon, je suis un amateur en php et je vois dans le manuel que cette fonction est obsolète et qu'on devrait plutôt utiliser l'extension MySQLi ou PDO_MySQL.
C'est juste pour prévenir.
Je laisse les pros prendre la main pour les vraies solutions :wink:
Pas d'inquietude quand même en ce qui concerne la sécurité de mon futur site (et la protection des données "sensibles" de mes futurs visiteurs), la sécurité sera faite, quitte a ce qu'un professionnel de l'informatique passe après moi (et avant la mise en ligne du site). De toute façon, l'intervention du "pro" est prévue car il y aura une partie boutique avec paiement securisé. Et à ce niveau là, je laisse les grands jouer tranquillement. Et moi, je retourne avec ma pelle et mon seau faire des pâtés dans le bac à sable. J'ai pas envie qu'un client me fasse un procès pour defaut de securité du site !!!

Mais là, j'avais trop envie d'avancer un peu sur le reste des pages et comme je ne pouvais pas faire grand chose tant que le visiteur ne pouvait pas rentrer ses infos dans la base... fallait bien que je trouve le moyen de les y rentrer !

Quant à ma progression personnelle en php, j'ai toujours vos réponses que je pourrais étudier tranquillement, à tête reposée et à yeux ouverts, quand je n'aurais plus la pression du délai pour la confection du site. (ben voui, j'ai un tic tac qui tourne et ça me stresse un peu !)
il faut mettre le var_dump juste après le <?PHP initial de adhsesion_trait.PHP
et ajoute
</form>
après :
<tr>
<td><input type="submit" value="<?php echo TEXT_ENVOYER; ?>" /></td>
</tr>
</table>
Ah !... donc à la ligne 2 du form_adhesion.php.
Et on le laisse tout le temps après ? ou c'est juste le temps de comprendre d'où vient l'erreur ?

Quant aux balises non refermées dans mon formulaire, j'en ai vu tout plein après avoir mis mes codes ici (y'avait bien le </form> mais y'en avait aussi d'autres des </tr> et </td>,) mais même après correction minutieuse, ça ne marchais toujours pas. d'où mon retour à l'ancienne version...

En tout cas, un grand merci à vous pour votre aide. Vous êtes des chefs ! =D>

et maintenant, je vais continuer à vous "casser les pieds" avec mes autres questions du jour :mrgreen: mais celles là seront "gentilles" et simples à résoudre. (enfin j'espère !!! )

Re: [RESOLU] correction de code souhaitée

Posté : 27 août 2012, 18:50
par sirakawa
J'ai écrit un bout de code de saisie du pseudo à partir du tien, en me débarassant des appels à des fonctions ou des constantes que je n'ai pas:
<?PHP
$texte ="<h1>Vous allez adhérer en ligne suivant les conditions suivantes";
$texte .= "<h2>Adhésion en ligne</h2>";
$texte .= "<h3>Formulaire d'adhésion en ligne</h3>";
$texte .= "<form method='post' action='adhesion_trait.php'>";
$texte .= "<table>
       <table>
                <tr>
                        <td><label for='pseudo'>text_pseudo_x</label></td>
                        <td><input type='text' name='pseudo' id='pseudo' maxlength='30' />
                        <td>caracteristiques_pseudo</td>
                </tr>
                <button>OK</button>
                </form>";
print "$texte";
?>
qui est vérifié par celui-ci:
<?php
/* Soit on commente ainsi
sur plusieurs lignes si besoin*/
// soit on commente ainsi le commentaire cessant en fin de ligne
// pour pouvoir écrire les $_SESSION
session_start();
/* print_r en dit un peu moins que var_dump*/
print "arrivée";
var_dump ($_POST);
print "<br> avec print_r";
print_r($_POST);
// pour changer la langue; commenté pour les tests chez moi
//require("../lang/decide-lang.php");
// fin de php inutile mise des commentaires en forme php
/* recupération des données du formulaire ............
-- actions si les $_POST existent et si ils ne sont pas vides */
// début de php inutile  et supprimé
// <?php 
// pseudo
 print_r($_POST);
if ((isset($_POST['pseudo'])) AND (!empty($_POST['pseudo'])))
{
	print "on est dans le if";
	// On rend inoffensives les balises HTML que le visiteur a pu rentrer
		$_POST['pseudo'] = htmlspecialchars($_POST['pseudo']);
 	// on transforme $_POST('xxx'] en $xxx: deuxième appel à htmlspecialcharsinutile...
		$pseudo= htmlspecialchars($_POST['pseudo']);
	echo "pseudo_ok $pseudo";
}
else 
{
	echo "erreur_pseudo";
	exit;
} ?> // supprimer cette fin de php et le début de php qui suit
et ça fonctionne...