8711 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ai un soucis avec mon UPDATE qui ne met rien du tout à jour.

Voici le code.
if (isset($_POST['modif_profil'])) {
//fonction verification des champs
$erreur = checkForm();
	// pas d'erreur
	if (empty($erreur)) {
									//Protection par captcha
									//if($_POST['captcha'] == $_SESSION['captcha']){
									
	$req = Cnx::connectCnx()->prepare('UPDATE  responsable SET resp_societe=:societe, resp_nom=:nom, resp_prenom=:prenom, resp_adresse=:adresse, resp_cp=:cp, resp_ville=:ville, resp_tel1=:tel1, resp_tel2=:tel2, resp_mail=:mail, resp_niveau=:niveau, resp_activate=:activate WHERE resp_id=:id');
	$req -> bindParam(':societe', $_POST['societe']);
        $req -> bindParam(':nom', $_POST['nom']);
        $req -> bindParam(':prenom', $_POST['prenom']);
        $req -> bindParam(':adresse', $_POST['adresse']);
        $req -> bindParam(':cp', $_POST['cp']);
        $req -> bindParam(':ville', $_POST['ville']);
        $req -> bindParam(':tel1', $_POST['tel1']);
        $req -> bindParam(':tel2', $_POST['tel2']); 
        $req -> bindParam(':mail', $_POST['mail']);
	 $req -> bindParam(':niveau', $_POST['niveau']);
	 $req -> bindParam(':activate', $_POST['activate']);
	 $req -> bindParam(':id', $_POST['id'], PDO: [langue]ARAM_INT, 11);
	 $req -> execute(); 

		/*}else{echo "Veuillez calculer le code de sécurité";}*/
		
								echo '<pre>';
								print_r($_POST);
								echo '</pre>';
								print_r($_SESSION);
	
	} else {
        echo '<div class="error">';
        foreach ($erreur as $e) {
            echo $e, '<br />';
        }
        echo '</div>';
    }
}
?>
<?php
$req = Cnx::connectCnx()->prepare('SELECT * FROM responsable WHERE resp_id=:id');
$req -> execute(array(
    'id' => $Auth->user('resp_id')                   
)); 
$user = $req->fetch();
?>
<form enctype="multipart/form-data" action="modif_profil.php" method="post">

<input id="societe" name="societe"	type="text" maxlength="30"	size="30" value="<?php echo $user->resp_societe ?>" placeholder="Société"/> <br />
<input id="nom" 	name="nom"		type="text" maxlength="30"	size="30" value="<?php echo $user->resp_nom?>" placeholder="Nom *"/> <br />
<input id="prenom"  name="prenom"	type="text" maxlength="30"	size="30" value="<?php echo $user->resp_prenom?>" placeholder="Prénom *"/> <br />
<input id="adresse" name="adresse"	type="text" maxlength="200"	size="30" value="<?php echo $user->resp_adresse?>" placeholder="Adresse *"/> <br />
<input id="cp" 	 	name="cp" 		type="text"	maxlength="10"	size="30" value="<?php echo $user->resp_cp?>" placeholder="Code Postal *"/> <br />
<input id="ville" 	name="ville" 	type="text" maxlength="20"	size="30" value="<?php echo $user->resp_ville?>" placeholder="Ville *"/>	<br />
<input id="tel1" 	name="tel1" 	type="text" maxlength="20"	size="30" value="<?php echo $user->resp_tel1?>" placeholder="Tél Port *"/> <br />
<input id="tel2" 	name="tel2"  	type="text" maxlength="20" 	size="30" value="<?php echo $user->resp_tel2?>" placeholder="Tél Fixe"/> <br />	
<input id="mail" 	name="mail"  	type="text" maxlength="100"	size="30" value="<?php echo $user->resp_mail?>" placeholder="Email *"/>	<br />
<input id="mail2" 	name="mail2"  	type="text" maxlength="100"	size="30" value="<?php echo $user->resp_mail?>" placeholder="Confirmez votre Email *"/>	<br />

<input id="activate" 	name="activate"  	type="text" maxlength="100"	size="30" value="<?php echo $user->resp_activate?>" placeholder="Actif=1 Banni=0 *"/>	<br />
<input id="niveau" 	 name="niveau" 	type="hidden" value="<?php echo $user->resp_niveau ?>"/> <br />
<input id="captcha" name="captcha" type="text" size="30" placeholder="<?php echo captcha(); ?> = "/><br />

<small style="color: #CFCFCF;"><i> * Obligatoire</i></small> <br />
<input type="submit" name="modif_profil" value="Valider les modifications" />		<br />
</form>


Par contre si je rajoute dans mon FORM un input value=id alors la l'insertion se fait bien.. Mais ça me semble un peu étrange tout de même.
Une idée quelqu'un? depuis hier je suis dessus et j'en peux plus Smiley eek
Donc tu dit que rien ne marche pas quand tu n'envoi pas d'id a ta page de traitement ?

Si c'est bien cela, comment veux-tu que cela mette à jour ta base si tu lui dit pas "qui" modifier ? Ta condition n'est pas valide.
En ajoutant cette ligne le code fonctionne
<input name="resp_id " type="hidden"  value="<?php echo $user->resp_id ?>" "/>

Mais cette façon de faire ma parait étrange.
S'il n'y a aucun soucis a faire de cette façon alors tout est bon.
Solution 1 : Tu ouvres opera, clic droit "code source", tu modifies le code source du hidden, tu appliques le code source.

Solution 2 : Tu crées un formulaire chez toi sur ton serveur; avec comme action l'URL complète en absolue vers le site qui va traiter le formulaire... et tu peux passer n'importe quoi et modifier n'importe quoi.

Et je suis prête à parier qu'il existe bien plein d'autres solutions.

Règle n°1 en sécurité web : ne jamais faire confiance aux données des utilisateurs et aux protections javascript. Smiley sweatdrop
Je trouvais ça aussi étrange.. mais alors que proposes tu? changer radicalement le code?
1) pour arriver sur cette page il faut être connecté je suppose. donc il doit y avoir une session; donc on a un ID protégé. (c'est pas fait à 100%, mais dans le cadre d'un service de base et pas d'une application sensible, on peut considérer que c'est fiable).
ID mis en session lors de la connexion avec le binôme nom/password (crypté le password, md5 ou sha1 minimum + salt)

2) Je suppose que l'utilisateur ne peut modifier que sa page à lui et pas celle de quelqu'un d'autre. A la limite que l'admin peut modifier les pages de quelqu'un d'autres.

3) à partir de là, principe simple :
- test mysql à partir de l'id de la personne pour savoir si c'est l'admin. Si c'est l'admin, on peut se servir d'une données du formulaires pour modifier un compte.
- si c'est pas l'admin, les seules modifications possibles, sont celles sur le compte où il y a une session; donc le where porte sur l'id de la session.

Et non, ça demande pas de changer le code complet, juste de récupérer l'id autrement.


Et au passage, il est une bonne habitude de ne faire confiance en aucune donnée utilisateurs donc tester toutes les variables (que des chiffres soient bien des chiffres; qu'un champs avec un email soit bien un email,.... l'utilisation pour ça de filter_var est un bon début ^^) + protection lors de la mise en mysql (fonction mysqli_real_escape_string au minimum, idéalement les requêtes préparées)
Merci de vous pencher sur mon problème.
J'ai déjà une fonction qui gère les niveaux (admin, membre).
L'admin peut voir et modifier les infos des membres. et les membres ne peuvent que voir leur profil.
Par contre, il faut savoir que plusieurs comptes peuvent être créer.
C'est à dire qu'un compte peut être créé et le créateur du compte devient automatiquement admin et il va créer ensuite ses membres.
Et bien entendu, il est hors de question qu'un admin puisse voir les infos d'un membre qui n'est pas raccroché à lui.Je suis un peu perdu la