[RESOLU] Formulaire modification db

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Formulaire modification db

Re: Formulaire modification db

par Une Minute » 31 janv. 2017, 13:53

Je ne sais pas quoi dire si ce n'est merci.. merci.. merci mille fois ! Tu as résolu un problème (nécessitant apparemment juste de la logique et évidemment des connaissances que je n'ai pas..) et qui durait depuis deux semaines...
Je vais pouvoir intégrer tout ça au reste... Tu es au top !!
J'arrête de t'embêter et je te souhaite une excellente après-midi !

Re: Formulaire modification db

par Spols » 31 janv. 2017, 08:59

en effet tu as 2 paramètres dans cette requète, il te faut donc lui attribuer 2 valeur.
de plus, cette méthode de préparer tes requète et d'utiliser bindValue te permet de définir chaque valeur de manière très claire. donc il est facile de voir que dans ton exemple, tu attribue news à username étrange !! j'ai donc corrigé en conséquence
if (!empty($_POST['sent'])) 
  { 

        echo'<h1>Modification terminée</h1>';

        echo'<p>Votre profil a été modifié avec succès !</p>';

        $query=$db->prepare('UPDATE partenaires SET news = :news WHERE username=:username');

        $query->bindValue(':news',$_POST['news'],PDO::PARAM_INT);

        $query->bindValue(':username',$_SESSION['username'],PDO::PARAM_INT);

        $query->execute();        => LIGNE 57 (devenu 59)

        $query->CloseCursor();

    }

Re: Formulaire modification db

par Une Minute » 30 janv. 2017, 20:59

Merci encore Spols, c'est vraiment sympa !
J'arrive bien à récupérer mes données mais pas moyen de les modifier.. Il doit y avoir quelque chose que je ne comprends pas dans cette requête...

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens on line 57
if (!empty($_POST['sent'])) 
  { 

        echo'<h1>Modification terminée</h1>';

        echo'<p>Votre profil a été modifié avec succès !</p>';

        $query=$db->prepare('UPDATE partenaires SET news = :news WHERE username=:username');

        $query->bindValue(':username',$_POST['news'],PDO::PARAM_INT);

        $query->execute();       [color=#FF0000][b] => LIGNE 57[/b][/color]

        $query->CloseCursor();

    }

Re: Formulaire modification db

par Spols » 30 janv. 2017, 11:11

remontre nous c le bout de code autour de la ligne 57, (avec un repère de numéro de ligne)

mais as tu bien fait la même modif que plus haut ?

Re: Formulaire modification db

par Une Minute » 28 janv. 2017, 19:39

Oh wow ! Ca avance.. Merci beaucoup ! Je vais peut-être abuser mais j'ai désormais comme message :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens on line 57
Sauf que j'ai l'impression de bien avoir mes deux variables... Auriez-vous une idée du problème ?
Merci d'avance, en espérant ne pas vous rendre fou avec mes questions qui n'en finissent plus...

Re: Formulaire modification db

par Spols » 28 janv. 2017, 12:43

d'après la doc http://php.net/manual/fr/pdostatement.bindvalue.php

tu peux faire soit
$query=$db->prepare('SELECT news FROM partenaires WHERE username=?');
$query->bindValue(1,$_SESSION['username'],PDO::PARAM_INT);

soit (ma préférence)
$query=$db->prepare('SELECT news FROM partenaires WHERE username=:username');
$query->bindValue(':username',$_SESSION['username'],PDO::PARAM_INT);

mais pas un mélange des 2

PS à condition que ton username est bien un entier, sinon supprime le dernier paramètre de bindValue

Re: Formulaire modification db

par Une Minute » 27 janv. 2017, 21:58

EDIT: J'ai résolument simplifié le script pour comprendre ce qui bloque.. peut-être trop (et fait les modifications concernant la suppression de la variable $username) et j'ai l'impression que c'est encore pire..
J'ai comme message d'erreur :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined on line 28

Je n'y comprends plus rien.. Dois-je essayer de refaire un code depuis le début une énième fois ?
Vos conseils me seraient vraiment très précieux à ce niveau d'incompétence.
<?php
session_start();

try
{
$db = new PDO('mysql:host=localhost;dbname=vsp', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?>
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link href="style_accueil.css" rel="stylesheet" title="Style" />
        <title>Val Socio-Pro</title>
    </head>
<body>
<?php

    if (isset($_SESSION['username']))

  { $query=$db->prepare('SELECT news FROM partenaires WHERE username=:?');

        $query->bindValue(':username',$_SESSION['username'],PDO::PARAM_INT);

        $query->execute();

        $data=$query->fetch();

        echo '<form method="post" action="" enctype="multipart/form-data">

        <label for="news">Vos News :</label>

        <input type="text" name="news" id="news"

        value="'.stripslashes($data['news']).'" /><br />

        <input type="submit" value="Modifier son profil" />

        <input type="hidden" id="sent" name="sent" value="1" /></form>';

        $query->CloseCursor();

	if (!empty($_POST['sent'])) 
	{ 

        echo'<h1>Modification terminée</h1>';

        echo'<p>Votre profil a été modifié avec succès !</p>';

        $query=$db->prepare('UPDATE partenaires SET  news = :news WHERE username=:?');

        $query->bindValue(':username',$_POST['news'],PDO::PARAM_INT);

        $query->execute();

        $query->CloseCursor();

    }

    else

    {

        echo'<h1>Modification interrompue</h1>';

        echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';

    }


?>
</body>
</html>
<?php
}
else
{
//Sinon, on lui donne un lien pour se connecter
	include('probleme_connexion.php');
?>

<?php
}
?>

Re: Formulaire modification db

par Une Minute » 27 janv. 2017, 16:59

Merci encore ! J'inclue tout ça en rentrant du boulot et je vois ce que ça donne.

Je me permets une autre question.. Est ce que mon script de connexion paraît complet et permet bien le transfert de données ? (désolée pour mes formulations de débutante, j'espère que c'est comprehensible !)
Merci

Re: Formulaire modification db

par Spols » 27 janv. 2017, 16:39

$query->bindValue(':username',$username,PDO::PARAM_INT);
a cette ligne là, tu cherche à récupèrer le username. mais cette variable n'est jamais définie.
tu devrais remplacer par
$query->bindValue(':username',$_SESSION['username'],PDO::PARAM_INT);

et pour la ligne
$query->bindValue(':username',$news,PDO::PARAM_INT);
$query->bindValue(':username',$_POST['news'],PDO::PARAM_INT);

Register globals était une fausse bonne idée des version précédente de php. l'idée était de faciliter la vie des devellopeur en attribuant automatiquement en début de script les variables globale comme $_POST, $_GET, $_SESSION, ... mais cela peut amener toute une série de problème de sécurité.

Re: Formulaire modification db

par Une Minute » 27 janv. 2017, 16:03

Merci beaucoup !!

Pour être tout à fait honnête, le dernier script de modifications des données, je l'ai récupéré sur OpenClassrooms car les miens ne fonctionnaient pas non plus (et dans un élan de "ras-le-bol", je les ai tous supprimés... donc il me reste celui-ci..
Je ne vois pas ce que tu veux dire par register globals (je ne maitrise pas du tout les appellations.. désolée) ?

Et je stock volontairement les mdp en clair car c'est moi qui vais inscrire les membres et gérer leur mot de passe.

Je note, je supprime le champs caché (je me demandais justement s'il était vraiment utile) et je change l'ordre du script, ce sera plus simple en plus.

Re: Formulaire modification db

par Spols » 27 janv. 2017, 15:48

Alors soit tu travail avec register globals à ON et c'est une très mauvaise idée. soit tu pense le faire mais ce n'est pas le cas et donc tes variables ne sont pas instancié.

Le mot de passe semble être stocké en claire en bdd, c'est aussi quelmque chose à éviter à tout prix.

Dans ta page de modification, il faut que tu récupère les valuer de $username dans ta session et $news dans $_POST

Ton champs caché est inutile, si tu met un name="..." à ton bouton d'envoi, tu peux utilisé cette variable là pour détecter l'envoi de ton formulaire.

lors de la modification, je te conseille de faire la modif en base et d'ensuite afficher le message que c'est fait mais c'est un détail

Formulaire modification db

par Une Minute » 27 janv. 2017, 11:32

Bonjour,
Après 2 semaines de recherches en tout sens, je fais appel à vous en dernier secours.

J'essaye en effet de créer un espace de connexion (pas d'inscription car je vais devoir rentrer les membres moi même dans la bdd) et un espace de modification de données pour chaque membre, entre autres.
Malheureusement je n'arrive pas à créer le formulaire de modifications de données, soit il m'affiche bien les données actuelles mais ne les modifie pas dans la bdd, soit il ne me récupère rien.
J'ai même fini par me demander si ce n'est pas mon formulaire de connexion et donc les données transférées d'une page à l'autre qui posent problème.. mais à priori je n'ai pas de souci pour me connecter.

Juste au cas où, voici les codes des deux pages.. il est possible que la page de modification soit étrange, à force de modifications, j'ai du sacrément m'embrouiller..

Merci beaucoup pour vos précieux conseils !

PAGE DE MODIFICATION DE DONNÉES
<?php
try
{
$db = new PDO('mysql:host=localhost;dbname=vsp', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}

if(isset($_SESSION['username']))
{
?>
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link href="style_accueil.css" rel="stylesheet" title="Style" />
        <title>TITRE</title>
    </head>
<body>
<?php

    if (empty($_POST['sent'])) 

    {

        $query=$db->prepare('SELECT news FROM partenaires WHERE username=:?');

        $query->bindValue(':username',$username,PDO::PARAM_INT);

        $query->execute();

        $data=$query->fetch();

        echo '<form method="post" action="" enctype="multipart/form-data">

        <label for="news">Vos News :</label>

        <input type="text" name="news" id="news"

        value="'.stripslashes($data['news']).'" /><br />

        <input type="submit" value="Modifier son profil" />

        <input type="hidden" id="sent" name="sent" value="1" /></form>';

        $query->CloseCursor();   

    }   

    else

    {

        echo'<h1>Modification terminée</h1>';

        echo'<p>Votre profil a été modifié avec succès !</p>';

        $query=$db->prepare('UPDATE partenaires SET  news = :news WHERE username=:?');

        $query->bindValue(':news',$news,PDO::PARAM_INT);

        $query->execute();

        $query->CloseCursor();

    }

    else

    {

        echo'<h1>Modification interrompue</h1>';

        echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';

    }

} 

    break;

 

default; 

echo'<p>Cette action est impossible</p>';

 

}

?>
</body>
</html>
<?php
}
else
{
//Sinon, on lui donne un lien pour se connecter
    include('probleme_connexion.php');
?>
<?php
}
?>
PAGE DE CONNEXION
<?php
session_start();

try
{
$db = new PDO('mysql:host=localhost;dbname=vsp', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}

?>

<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link href="style.css" rel="stylesheet" title="Style" />
        <title>Val Socio-Pro - Connection</title>
    </head>
    <body>
         
<?php
if(isset($_SESSION['username']))
{
	//On le deconecte en supprimant simplement les sessions username et userid
	unset($_SESSION['username'], $_SESSION['userid']);
?>
<div class="content">Vous avez bien été déconnecté.<br />
<a href="connexion.php">Se reconnecter</a></div>
<?php
}
else
{ 
if (!isset($_POST['username']))
{
	echo '<div>
<form method="post" action="connexion.php" >
<table class="content" align="center" border="0">
  <tr>
    <td>N° de prestataire :</td>
    <td><input type="text" name="username" id="username" maxlength="250"></td>
  </tr>
  <tr>
    <td>Mot de passe :</td>
    <td><input type="password" name="password" id="password" maxlength="10"></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><input type="submit" value="Connection"></td>
  </tr>
</table>
</form>     
</div>
	</body>
</html>';
}

else

{

    $message='';

    if (empty($_POST['username']) || empty($_POST['password']) )

    {

        $message = '<p>une erreur s\'est produite pendant votre identification.

    Vous devez remplir tous les champs</p>

    <p>Cliquez <a href="./connexion.php">ici</a> pour revenir</p>';

    }

    else

    {

        $query=$db->prepare('SELECT username, password

        FROM partenaires WHERE username = :username');

        $query->bindValue(':username',$_POST['username'], PDO::PARAM_STR);

        $query->execute();

        $data=$query->fetch();

    if ($data['password'] == ($_POST['password'])) // Acces OK !

    {

        $_SESSION['username'] = $data['username'];
?>
<?php
header("Location: page_accueil.php"); /* Redirection du navigateur */
exit;
?>

<?php

    }

    else

    {

        $message = '<p>Une erreur s\'est produite 

        pendant votre identification.<br /> Le mot de passe ou le pseudo 

            entré n\'est pas correcte.</p><p>Cliquez <a href="./connexion.php">ici</a> 

        pour revenir à la page précédente

        <br /><br />Cliquez <a href="./index.php">ici</a> 

        pour revenir à la page d accueil</p>';

    }

    $query->CloseCursor();

    }

    echo $message.'</div></body></html>';


}
}

?>