[RESOLU] Formulaire modification db

Eléphanteau du PHP | 14 Messages

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>';


}
}

?>

Mammouth du PHP | 1967 Messages

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

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.

Mammouth du PHP | 1967 Messages

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é.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

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

Eléphanteau du PHP | 14 Messages

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
}
?>

Mammouth du PHP | 1967 Messages

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

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...

Mammouth du PHP | 1967 Messages

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 ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

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();

    }

Mammouth du PHP | 1967 Messages

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();

    }
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

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 !