8796 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ai une page qui affiche les infos du membre:

<?php if (!session_id()) session_start();?>

<div id = "profils">
	<form action = "../formulaire/inscription/profil_maj.php" method = "post">
<fieldset>
       <legend>Mon profil sur Avenir-Acier</legend> <!-- Titre du fieldset -->

<fieldset><legend>MES INFORMATIONS PERSONNELLES</legend>

	<p> <label for="inscr_prenom">Mon prénom :</label><br />
	<input type="text" name="inscr_prenom" id="inscr_prenom" value="<?php echo $coordonnees['inscr_prenom'];?>"/>
	</p>

	<p> <label for="inscr_nom_famille">Mon nom :</label><br />
	<input type="text" name="inscr_nom_famille" id="inscr_nom_famille" value="<?php echo stripslashes($coordonnees['inscr_nom_famille']);?>"/> </p>

	<p> <label for="inscr_sexe">Je suis :</label><br />
       <select name="inscr_sexe" id="inscr_sexe" value="<?php echo stripslashes($coordonnees['inscr_sexe']);?>">
		   <option value="Homme">Un homme</option>
           <option value="Femme">Une femme</option>
       </select>
   </p>

	<p> <label for="inscr_lieu">J'habite :</label><br />
       <select name="inscr_lieu" id="inscr_lieu" value="<?php echo stripslashes($coordonnees['inscr_lieu']);?>">
			<optgroup label="Europe">
               <option value="allemagne">Allemagne</option>
			</optgroup>
       </select>
   </p>

<p> <label for="date_de_naissance">Ma date de naissance :</label><br />       
		<select name="jour_de_naissance" id="jour_de_naissance" value="<?php echo stripslashes($coordonnees['inscr_lieu']);?>">
               <option value="1">1</option>
			   </select>
		<select name="mois_de_naissance" id="mois_de_naissance" value="<?php echo stripslashes($coordonnees['inscr_lieu']);?>">
               <option value="1">Janvier</option>
			   </select>
		<select name="annee_de_naissance" id="annee_de_naissance" value="<?php echo stripslashes($coordonnees['inscr_lieu']);?>">
               <option value="1930">1930</option>
               <option value="1931">1931</option>
		</select>
</p>
</fieldset>

<fieldset><legend>MES INFORMATIONS DE CONNEXION</legend>

	<p> <label for="inscr_pass">Votre mot de passe actuel:</label><br />
	<input type="password" name="inscr_pass" id="inscr_pass" value="<?php echo stripslashes($coordonnees['inscr_pass']);?>" /> </p>
	
	<p> <label for="inscr_pass_new">Voici mon nouveau mot de passe :</label><br />
	<input type="password" name="inscr_pass_new" id="inscr_pass_new" /> </p>
	
	<p> <label for="inscr_pass_new_verif">Vérification du nouveau mot de passe :</label><br />
	<input type="password" name="inscr_pass_new_verif" id="inscr_pass_new_verif" /> </p>
</fieldset>

<fieldset><legend>MES INFORMATIONS VIRTUELLES</legend> <!-- Titre du fieldset -->

		<p> <label for="inscr_website">Site web ou blog :</label><br />
		<input type="text" name="inscr_website" id="inscr_website" value="<?php echo stripslashes($coordonnees['inscr_website']);?>"/> </p>

		<p> <label for="inscr_email">Email :</label><br />
		<input type="text" name="inscr_email" id="inscr_email" value="<?php echo stripslashes($coordonnees['inscr_email']);?>"/> </p>

		<p> <label for="inscr_email_2">Retapez votre email :</label><br />
		<input type="text" name="inscr_email_2" id="inscr_email_2"/> </p>
		
		<p> <label for="inscr_msn">MSN Messenger :</label><br />
		<input type="text" name="inscr_msn" id="inscr_msn" value="<?php echo stripslashes($coordonnees['inscr_msn']);?>"/> </p>

</fieldset>

	<p><input type="submit" value="Mettre à jour mon profil" id = "valider"></p>
	</form></p>
	</fieldset></p>
</fieldset>
<div id = "message">
</div>
</p>


Et puis j'ai cette page qui traite le formulaire d'avant:

<?php
//Cette fonction doit être appelée avant tout code html
error_reporting(E_ALL);
session_start();

// On se prépare à se connecter à la BDD
$hostname = "";
$database = "";
$username = "";
$password = "";
 
$connection = mysql_connect($hostname, $username, $password) or die(mysql_error());

if (!$connection) { die('Connexion impossible : ' . mysql_error());}
//echo 'Connexion réussie';

// Connexion à la base
mysql_select_db($database, $connection);
?>

<?php
//On récupère les infos du membre
       $requete1 = mysql_query("SELECT * FROM membre WHERE id='".$_SESSION['id']."'");
	   if ($data1 = mysql_fetch_assoc($requete1))
       {
       //On affiche rien (c'est juste pour la suite des operations)
}
       echo $data1; //Test d'affichage des variables

//Récupération des variables du formulaire envoyé en POST

$i = 0;
$id=intval($_SESSION['id']);
$prenom = mysql_real_escape_string($_POST['inscr_prenom']);
$nom_famille = mysql_real_escape_string($_POST['inscr_nom_famille']);
$sexe = mysql_real_escape_string($_POST['inscr_sexe']);
$lieu = mysql_real_escape_string($_POST['inscr_lieu']);
$pass = mysql_real_escape_string($_POST['inscr_pass_new']);
$pass_confirm = mysql_real_escape_string($_POST['inscr_pass_new_verif']);
$website = mysql_real_escape_string($_POST['inscr_website']);
$email = mysql_real_escape_string($_POST['inscr_email']);
$msn = mysql_real_escape_string($_POST['inscr_msn']);

//Vérification du mdp
if ($pass != $pass_confirm || empty($pass_confirm) || empty($pass))
{
$mdp_erreur = "Votre mot de passe et votre confirmation diffèrent ou sont vides";
$i++;
}

//Vérification de l'adresse email

//Il faut que l'adresse email n'ait jamais été utilisée (sauf si elle n'a pas été modifiée)
if (strtolower($data1['inscr_email']) != strtolower($email))
{
        $nombremail = mysql_result(mysql_query("SELECT count(*) FROM membre WHERE inscr_email = '".$email."' AND id = $id"), 0);

        if ($nombremail!= 0)
        {
        $email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
        $i++;
        }

        //On vérifie la forme maintenant
        if (!preg_match("#^[a-z0-9A-Z._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
        {
        $email_erreur2 = "Votre nouvelle adresse E-Mail n'a pas un format valide";
        $i++;
        }
}
//Vérification de l'adrese msn
if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
{
$msn_erreur = "Votre nouvelle adresse MSN n'a pas un format valide";
$i++;
}

if ($i == 0) // Si $i est vide, il n'y a pas d'erreur
{
        //On modifie la table
 
        mysql_query("UPDATE membre SET
		inscr_prenom='$prenom',
		inscr_nom_famille='$nom_famille',
		inscr_sexe='$sexe',
		inscr_lieu='$lieu',
		inscr_pass='$pass',
		inscr_website='$website',
		inscr_email='$email',
		inscr_msn='$msn'
		WHERE id=$id") or die (mysql_error());
}
else
{
        echo'<h1>Modification interrompue</h1>';
        echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';
        echo'<p>'.$mdp_erreur.'</p>';
        echo'<p>'.$email_erreur1.'</p>';
        echo'<p>'.$email_erreur2.'</p>';
        echo'<p>'.$msn_erreur.'</p>';
}
?>


Quand je clique sur mettre à jour le profil il m'affiche ces deux erreurs:

Notice: Undefined index: id in /mnt/web2/htdocs/formulaire/inscription/profil_maj.php on line 23

Notice: Undefined index: id in /mnt/web2/htdocs/formulaire/inscription/profil_maj.php on line 33


Voici les lignes 23 et 33:

//On récupère les infos du membre
       $requete1 = mysql_query("SELECT * FROM membre WHERE id='".$_SESSION['id']."'");


$id=intval($_SESSION['id']);


Donc si vous avez une idée sur le problème ...

J'ai passé l'après-midi dessus alors là j'en peux plus ....

D'avance merci beaucoup.
Modifié par Jackisback (01 Feb 2009 - 21:35)
Je ne suis pas sur à 300%, mais ...

session_start(); doit toujours être présent en haut de ton code sur les pages utilisant les session.

Or je vois

if (!session_id()) session_start();


Je mettrais directement :

session_start();
J'aurais dit la même chose : session_start() débute la session et la récupère si elle a déjà été créée sur une page précédente.
J'ai modifié le code de cette façon mais pour l'instant ça ne modifie tjs pas la BDD:

<?php
//Cette fonction doit être appelée avant tout code html
error_reporting(E_ALL);
session_start();
$_SESSION['id'] = 0;

// On se connecte à la BDD
mysql_connect("", "", "");
mysql_select_db("");

// On fait la requête pour afficher la liste des news
$requete_membre = mysql_query("SELECT * FROM membre WHERE inscr_pseudo='".$_SESSION['inscr_pseudo']."'") or die(mysql_error());  # debug;

//Puis on boucle le tout pour tout afficher
while($liste_membre = mysql_fetch_array($requete_membre)) 
{ 
    echo $liste_membre['id'];
}
?>

<?php
//On récupère les infos du membre
$requete1 = mysql_query("SELECT id FROM membre WHERE inscr_pseudo='".$_SESSION['inscr_pseudo']."'") or die(mysql_error());  # debug;

//Puis on boucle le tout pour tout afficher
while($row = mysql_fetch_row($requete1)) {

//var_dump($row);  # debug


	   if ($data1 = mysql_fetch_assoc($requete1))
       {
	   }

//Test d'affichage des variables
echo 'coucou1';
var_dump($row);  # debug
echo 'coucou2';
}
//Récupération des variables du formulaire envoyé en POST

$i = 0;
$id=intval($_SESSION['id']);
$prenom = mysql_real_escape_string($_POST['inscr_prenom']);
$nom_famille = mysql_real_escape_string($_POST['inscr_nom_famille']);
$sexe = mysql_real_escape_string($_POST['inscr_sexe']);
$lieu = mysql_real_escape_string($_POST['inscr_lieu']);
$pass = mysql_real_escape_string($_POST['inscr_pass_new']);
$pass_confirm = mysql_real_escape_string($_POST['inscr_pass_new_verif']);
$website = mysql_real_escape_string($_POST['inscr_website']);
$email = mysql_real_escape_string($_POST['inscr_email']);
$msn = mysql_real_escape_string($_POST['inscr_msn']);

//Vérification du mdp
if ($pass != $pass_confirm || empty($pass_confirm) || empty($pass))
{
$mdp_erreur = "Votre mot de passe et votre confirmation diffèrent ou sont vides";
$i++;
}

//Vérification de l'adresse email

//Il faut que l'adresse email n'ait jamais été utilisée (sauf si elle n'a pas été modifiée)
if (strtolower($data1['inscr_email']) != strtolower($email))
{
        $nombremail = mysql_result(mysql_query("SELECT count(*) FROM membre WHERE inscr_email = '".$email."' AND id = $id"), 0);

        if ($nombremail!= 0)
        {
        $email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
        $i++;
        }

        //On vérifie la forme maintenant
        if (!preg_match("#^[a-z0-9A-Z._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
        {
        $email_erreur2 = "Votre nouvelle adresse E-Mail n'a pas un format valide";
        $i++;
        }
}
//Vérification de l'adrese msn
if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
{
$msn_erreur = "Votre nouvelle adresse MSN n'a pas un format valide";
$i++;
}

if ($i == 0) // Si $i est vide, il n'y a pas d'erreur
{
        //On modifie la table
 
        mysql_query("UPDATE membre SET
		inscr_prenom='$prenom',
		inscr_nom_famille='$nom_famille',
		inscr_sexe='$sexe',
		inscr_lieu='$lieu',
		inscr_pass='$pass',
		inscr_website='$website',
		inscr_email='$email',
		inscr_msn='$msn'
		WHERE id=$id") or die (mysql_error());
}
else
{
        echo'<h1>Modification interrompue</h1>';
        echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';
        echo'<p>'.$mdp_erreur.'</p>';
        echo'<p>'.$email_erreur1.'</p>';
        echo'<p>'.$email_erreur2.'</p>';
        echo'<p>'.$msn_erreur.'</p>';
}
?>


Je vais creuser encore un peu ...
Modifié par Jackisback (02 Feb 2009 - 12:45)
Le problème semble être de savoir si la table membre contient un champ dénommé id ? Or les autres champs de cette table sont apparemment préfixés par inscr_ d'où l'idée !
Modifié par Julien de Prabere (02 Feb 2009 - 19:16)
D'où l'idée ... l'id ... tu piges ... ok je sors ...

J'ai modifié le champ en inscr_id ...

Que me conseilles-tu de faire alors maintenant ?
Il ne s'agit pas de modifier la table, si celle-ci est adaptée, mais simplement de vérifier qu'il n'y a pas de confusion. Autrement dit que les requêtes se réfèrent bien à un champ existant.
Modifié par Julien de Prabere (02 Feb 2009 - 20:22)
salut, j'ai regarder ton script un peux et je croit bien que ton probleme se trouve que tu n'a aucun identifiant de session. généralement tu doit avoir un mécanisme de vérification d'utilisateur (login) qui lui ensuite assigne un id a ta session...

pour l'instant c'est simplement ca ton problème ton message d'erreur

Notice: Undefined index: [b]id[/b] in ...

dit bien que ta variable $_SESSION['id'] n'est pas définit.

Et je suis d'acord avec Julien de Prabere, tu devrais renommer ton premier champ de ta table membre "id" par "inscr_id" pour éviter les confusions Smiley cligne
Bonjour,

Hier soir vers minuit, j'ai réussi à faire fonctionner le script et la bdd à été modifié ...

Voici le script:

<?php
//Cette fonction doit être appelée avant tout code html
session_start();

// On se connecte à la BDD
mysql_connect("", "", "");
mysql_select_db("");

// On fait la requête pour afficher la liste des news
$requete = "SELECT * FROM membre WHERE inscr_pseudo='".$_SESSION['inscr_pseudo']."'";

// Exécution de la requête
$req_exec = mysql_query($requete);

// Création du tableau associatif du résultat
$resultat = mysql_fetch_assoc($req_exec);

//Test d'affichage des variables
//var_dump($resultat); # debug
//echo 'Salut titou'; # debug

//Récupération des variables du formulaire envoyé en POST
$i = 0;
$id=intval($resultat['inscr_id']);
$prenom = mysql_real_escape_string($_POST['inscr_prenom']);
$nom_famille = mysql_real_escape_string($_POST['inscr_nom_famille']);
$sexe = mysql_real_escape_string($_POST['inscr_sexe']);
$lieu = mysql_real_escape_string($_POST['inscr_lieu']);
$pass = mysql_real_escape_string($_POST['inscr_pass_new']);
$pass_confirm = mysql_real_escape_string($_POST['inscr_pass_new_verif']);
$website = mysql_real_escape_string($_POST['inscr_website']);
$email = mysql_real_escape_string($_POST['inscr_email']);
$msn = mysql_real_escape_string($_POST['inscr_msn']);

//Vérification de l'adresse email

//Il faut que l'adresse email n'ait jamais été utilisée (sauf si elle n'a pas été modifiée)
if (strtolower($resultat['inscr_email']) != strtolower($email))
{
        $nombremail = mysql_result(mysql_query("SELECT count(*) FROM membre WHERE inscr_email = '".$email."' AND inscr_id = $id"), 0);

        if ($nombremail!= 0)
        {
        $email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
        $i++;
        }

        //On vérifie la forme maintenant
        if (!preg_match("#^[a-z0-9A-Z._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
        {
        $email_erreur2 = "Votre nouvelle adresse E-Mail n'a pas un format valide";
        $i++;
        }
?>
<a href="javascript:window.history.go(-1)">Retour à la page précédente</a>
<?php
}
//Vérification de l'adrese msn
if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
{
$msn_erreur = "Votre adresse MSN n'a pas un format valide";
$i++;
?>
<a href="javascript:window.history.go(-1)">Retour à la page précédente</a>
<?php
}

//Vérification du mdp
if ($pass != $pass_confirm || empty($pass_confirm) || empty($pass))
{
$mdp_erreur = "Votre mot de passe et votre confirmation diffèrent ou sont vides";
$i++;
?>
<a href="javascript:window.history.go(-1)">Retour à la page précédente</a>
<?php
}

if ($i == 0) // Si $i est vide, il n'y a pas d'erreur
{
        //On modifie la table
 
        mysql_query("UPDATE membre SET
		inscr_prenom='$prenom',
		inscr_nom_famille='$nom_famille',
		inscr_sexe='$sexe',
		inscr_lieu='$lieu',
		inscr_pass='$pass',
		inscr_website='$website',
		inscr_email='$email',
		inscr_msn='$msn'
		WHERE inscr_id=$id");

//Après modification du profil, on retourne à la page d'accueil
?>
<meta http-equiv="Refresh" content="2;URL=../../index.php">
Mise à jour du profil réalisée avec succès.
<?php
}
else
{
        echo'<h1>Modification interrompue</h1>';
        echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';
        echo'<p>'.$mdp_erreur.'</p>';
        echo'<p>'.$email_erreur1.'</p>';
        echo'<p>'.$email_erreur2.'</p>';
        echo'<p>'.$msn_erreur.'</p>';
}
?>


Maintenant, svp, j'aimerais que vous m'aidiez à l'optimiser et à le sécuriser au maximum ... ça m'aidera pour tout mes autres scripts ...

Je vous remercie en tout cas de vous être creuser la tête .... c'est vraiment sympa à vous.....

@ tout

------------EDIT------------

Pourquoi dis-tu cela ??? ce n'était pas juste ??
Modifié par Jackisback (03 Feb 2009 - 11:13)
J'ai fait quelques chose, sans testé, dis moi ce que t'en penses :

<?php
session_start();

mysql_connect("", "", "");
mysql_select_db("");

$requete = "SELECT inscr_id, inscr_email FROM membre WHERE inscr_pseudo='".$_SESSION['inscr_pseudo']."'";
$req_exec = mysql_query($requete);
$resultat = mysql_fetch_assoc($req_exec);

$i = 0;
$id=intval($resultat['inscr_id']);
$prenom = mysql_real_escape_string($_POST['inscr_prenom']);
$nom_famille = mysql_real_escape_string($_POST['inscr_nom_famille']);
$sexe = mysql_real_escape_string($_POST['inscr_sexe']);
$lieu = mysql_real_escape_string($_POST['inscr_lieu']);
$pass = mysql_real_escape_string($_POST['inscr_pass_new']);
$pass_confirm = mysql_real_escape_string($_POST['inscr_pass_new_verif']);
$website = mysql_real_escape_string($_POST['inscr_website']);
$email = mysql_real_escape_string($_POST['inscr_email']);
$msn = mysql_real_escape_string($_POST['inscr_msn']);

$retour_page = '<a href="javascript:window.history.go(-1)">Retour à la page précédente</a>';

if (strtolower($resultat['inscr_email']) != strtolower($email))
	{
	$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membre WHERE inscr_email='".$email."' AND inscr_id='".$id."'"), 0);

		if ($nombremail!= 0)
			{
			$erreur.= "Votre adresse email est déjà utilisée par un membre< br/>";
			$i++;
			}

		if (!preg_match("#^[a-z0-9A-Z._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
			{
			$erreur.= "Votre nouvelle adresse E-Mail n'a pas un format valide< br/>";
			$i++;
			}

	echo $retour_page;
	}

if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
	{
	$erreur.= "Votre adresse MSN n'a pas un format valide< br/>";
	$i++;
	echo $retour_page;
	}

if ($pass != $pass_confirm || empty($pass_confirm) || empty($pass))
	{
	$erreur.= "Votre mot de passe et votre confirmation diffèrent ou sont vides< br/>";
	$i++;
	echo $retour_page;
	}

if ($i == 0)
	{
	mysql_query("UPDATE membre SET
	inscr_prenom='".$prenom."',
	inscr_nom_famille='".$nom_famille."',
	inscr_sexe='".$sexe."',
	inscr_lieu='".$lieu."',
	inscr_pass='".$pass."',
	inscr_website='".$website."',
	inscr_email='".$email."',
	inscr_msn='".$msn."'
	WHERE inscr_id='".$id."'");

	echo '<p>Mise à jour du profil réalisée avec succès.</p>';
	sleep(2);
	header("Location:  http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']),  '/\\')."/index.php");
	exit();
	}
	else
		{
		echo'<h1>Modification interrompue</h1>';
		echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';
		echo'<p>'.$erreur.'</p>';
		}
?>