8791 sujets

Développement web côté serveur, CMS

Bonjour,

Donc j'essaye de faire un update d'un formulaire avec plusieurs champs. Pour le mot de passe, ça fonctionne, pour le reste non, or la syntaxe est correct, je n'ai aucunes erreur de bdd, connexion, SQL...

 $sql = mysql_query(" UPDATE membres SET pass = '".sha1($_POST['emdp'])."' WHERE ID = '$_COOKIE[ID]' ") or die(mysql_error());

Ca ça fonctionne.

 $sql = mysql_query(" UPDATE membres SET profession = '".$_POST['profession']."' WHERE ID = '$_COOKIE[ID]' ") or die(mysql_error());


Ca ça fonctionne pas....

Je ne vois pas le problème, et vous ?

Merci
Modifié par ichigo92 (13 Sep 2010 - 12:53)
Salut,

hem... tu as (doublement) mal compris ce que je te disais dans ton dernier sujet :

* puisque ta question est toujours en rapport il ne fallait pas créer un nouveau sujet (c'est vrai que ma formulation n'était as très claire).

* il est inutile de faire un UPDATE par champ !

D'autre part il ne faut pas utiliser les valeur de $_POST directement dans les requêtes mais les protéger des injections SQL.

Pour finir si tu donnes la possibilité de modifier un mot de passe c'est particulier puisque tu ne le sauvegardes pas en clair dans ta base (ce qui est une bonne chose) et donc tu ne peux pas le réafficher tel quel dans le formulaire : il faut donc afficher un champ vide (Nouveau mot de passe) et mieux encore un autre champ de confirmation (Confirmer le nouveau mot de passe). Donc tu ne feras l'UPDATE du mot de passe que si un nouveau a été saisi (et qu'il correspond à la confirmation).

Au final tu pourrais avoir quelque chose comme :
// Initialisation ou récupération des variables
$nom = !empty($_POST['nom']) ? trim($_POST['nom']) : '';
$prenom = !empty($_POST['prenom']) ? trim($_POST['prenom']) : '';
$profession = !empty($_POST['profession']) ? trim($_POST['profession']) : '';
$new_password = !empty($_POST['new_password']) ? trim($_POST['new_password']) : '';
$confirm_password = !empty($_POST['confirm_password']) ? trim($_POST['confirm_password']) : '';

$erreurs = array();

if($_SERVER['REQUEST_METHOD']=='POST') {
	// nom obligatoire
	if(empty($nom)) {
		$erreurs[] = 'Le nom est obligatoire.';
	}
	// prénom obligatoire
	if(empty($prenom)) {
		$erreurs[] = 'Le prénom est obligatoire.';
	}
	// profession obligatoire (à supprimer si ce n'est pas le cas)
	if(empty($profession)) {
		$erreurs[] = 'La profession est obligatoire.';
	}
	
	// Nouveau mot de passe et confirmation
	if(!empty($new_password) || !empty($confirm_password)) {
		// Confirmation obligatoire
		if(empty($confirm_password) || ($new_password <> $confirm_password)) {
			$erreurs[] = 'Vous devez confirmer le nouveau mot de passe';
		}
		// Confirmation différente du mot de passe
		if($new_password && $confirm_password && ($new_password <> $confirm_password)) {
			$erreurs[] = 'Le mot de passe est différent de la confirmation';
		}
	}
	
	// Aucune erreur...
	if(empty($erreurs)) {
		$update_sql = "UPDATE membres SET nom = '". mysql_real_escape_string($nom)."', prenom = '". mysql_real_escape_string($prenom)."', profession = '". mysql_real_escape_string($profession)."'";
		if(!empty $new_password) {
			$update_sql .= ", pass = '". mysql_real_escape_string(sha1($new_password))."'";
		}
		$update_sql .= " WHERE id = ".intval($_COOKIE[ID]);
		// ici tu peux faire echo $update_sql pour voir le contenu final de la requête si elle ne fonctionne pas
		mysql_query($sql);
		//  Redirection vers la page de confirmation
		header('Location: confirmation.php');
	}
}

Modifié par Heyoan (13 Sep 2010 - 13:30)
Heyoan a écrit :
Salut,

hem... tu as (doublement) mal compris ce que je te disais dans ton dernier sujet :



* il est inutile de faire un UPDATE par champ !

[/code]


Non non, ne t'inquiète pas, je ne l'ai pas fait par champ, c'était juste pour montrer.

Donc j'ai essayé ton code et rien (même pas un petit message d'erreur).

Ce qui est bizarre, c'est que lorsque je ne mets aucune contrainte pour la profession, il veut bien la mettre à jour....

Donc ça donne :




 //Connexion à la base de données
    mysql_connect("host","name","pwd") or die("Problème de connexion au serveur! Si le problème persiste, veuillez contactez l'administrateur.");
	mysql_select_db("bdd") or die("Problème de connexion à la base de donnée! Si le problème persiste, veuillez contactez l'administrateur.");
	mysql_query("SET NAME utf-8");
	
	
if(isset($_POST['GO'])) {
 
			if(preg_match("#[a-zA-Z]{,50}$#",$_POST['profession']) ) {	 
									        
				                $sql = mysql_query(" UPDATE membres SET profession = '".$_POST['profession']."' WHERE ID = '$_COOKIE[ID]' ") or die(mysql_error());
								
						if($sql == 1) { $message = "Votre profil a bien été mis à jour"; }
								}
								             
				}
		 
	 

Désolé pour le $_POST dans la requête.
Modifié par ichigo92 (13 Sep 2010 - 14:33)
ichigo92 a écrit :
Donc j'ai essayé ton code et rien (même pas un petit message d'erreur).
Ce qui est plutôt normal puisque mon code ne contient pas de or die(mysql_error()). Tu as fait comme je le préconisais un echo $update_sql; ?

ichigo92 a écrit :
Ce qui est bizarre, c'est que lorsque je ne mets aucune contrainte pour la profession, il veut bien la mettre à jour...
On pourrait logiquement en conclure que ton test renvoie false.
Heyoan a écrit :
Tu as fait comme je le préconisais un echo $update_sql; ?


Fait mais aucun résultat.

Heyoan a écrit :
On pourrait logiquement en conclure que ton test renvoie false.


Oui, c'est le if qui pose problème...