aide pour Script de Modification de données d'un base avec formulaire

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 17:36

Bonjour a tous apres des heures de recherche et je viens vers vous pour soliciter votre aide, je suis debutant,

je remercie d'avance les utilisateurs qui prendront le temps de lire mon sujet et d'y répondre

je suis entraint de faire un espace membre pour mon site
mon but est de lister tout mes membres ensuite, pouvoir en modifier un si necessaire.

voila ma table

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `accounts` ( `login` VARCHAR(45) NOT NULL default '', `password` VARCHAR(45) , `lastactive` DECIMAL(20), `accessLevel` TINYINT NOT NULL DEFAULT 0, `lastIP` CHAR(15) NULL DEFAULT NULL, `lastServer` TINYINT DEFAULT 1, PRIMARY KEY (`login`) );
(partie 1)

le scrypt qui recupere les infos
<?php 
include("config/config.php");
echo'
<table width="743" border="1" align="center">
  <tr>
<th width="59" bgcolor="#3399CC"><center>Modifier</center></th>
<th width="103" bgcolor="#3399CC"><center>Login</center></th>
<th width="133" bgcolor="#3399CC"><center>password</center></th>
<th width="153" bgcolor="#3399CC"><center>accessLevel</center></th>
<th width="110" bgcolor="#3399CC"><center>lastIP</center></th>
<th width="145" bgcolor="#3399CC"><center>lastServer</center></th>
</tr>';

$sql = "SELECT login,password,accessLevel,lastIP,lastServer FROM accounts ORDER BY login"; 

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

// on fait une boucle qui va faire un tour pour chaque enregistrement 
while($data = mysql_fetch_assoc($req)) 
    {
	echo '
    <tr>
	  <th><a href="accounts_modif.php?login='. $data['login']. '">modifier</a></th>
      <th><center>'.$data['login'].'</center></th>
      <th><center>'.$data['password'].'</center></th>
      <th><center>'.$data['accessLevel'].'</center></th>
      <th><center>'.$data['lastIP'].'</center></th>
      <th><center>'.$data['lastServer'].'</center></th>
    </tr>
'; 
} 
echo '</table>';
// on ferme la connexion à mysql 
mysql_close(); 
?>
</div>
(partie 2)

le forumulaire de modification (celui ci doit m'afficher a nouveau les infos du membre dans le formulaire)
<?php

include("config/config.php");

//récupération de la variable d'URL,
//qui va nous permettre de savoir quel enregistrement modifier
$login  = $_POST['login'];

//requête SQL:
 $sql = "SELECT password,accessLevel FROM accounts WHERE login='$login'";
  
  //exécution de la requête:
  $req = mysql_query($sql);
  
  //affichage des données:
  if ($data = mysql_fetch_array($req));
  {
 ?>

<form action="accounts_maj_bd.php" method="post">
<table width="238" border="0" align="center" class="text1">
            <tr>
    <td width="51">Login :</td>
    <td width="75"<?php echo $data['login'];
	//pour etre sur d'etre sur le bon login on laffiche
	?>"/></td> 
  </tr>
  <tr>
        <td>Password :</td>
    <td><input name="passeword" type="text" value="<?php echo $password; 
	//ici on affiche ce qu'il a deja dans la table, ensuite on peut le modiffier
	?>"  size="25">
	</td> 
	</tr>
	  <tr>
<td>
<center>AccesLevel:</center>
</td>
 <td>
 <input name="accesLevel" type="text" value="<?php echo $accesLevel; 
 //ici on affiche ce qu'il a deja dans la table, ensuite on peu le modiffier
 ?>" size="25"></td>
  </tr>
  <tr>
    <td colspan="2" align="center">
	<input type="hidden" name="login" value="<?php echo $login; ?>" />
	<input type="submit" value="Envoyer"></td>
  </tr>
</table>
</form>
<center>
  <?php
  }//fin if 
  ?>
(partie 3)

apres modification dans le formulaire il update
<?php 

include("config/config.php");

$login  = $_POST['login'];
$password     = $_POST['password'];
$accessLevel = $_POST['accessLevel'];

  $result=mysql_query("UPDATE accounts SET
             password='$password',accessLevel='$accessLevel' WHERE login='$login'");
  if (!$result) {
     echo "La mise à jour de vos données a échouée.<br>";
  } else {
     echo "Vos données ont été mises à jour<br>";
  }
  mysql_close();
?>
(partie 1) = ok
(partie 2) = il ne me redonne pas les infos dans le formulaire ( je ne sais pas ou est l'erreur)
(partie 3) = pas encore tester vue ke la partie 2 je suis bloqué .lol.

merci d'avance a tout ce qui peuve m'aidé à corriger mon scrypt

cordialement

boulon D Monkey
Modifié en dernier par boulon le 29 oct. 2008, 02:58, modifié 1 fois.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 17:43

Tu récupères le login dans l'url donc c'est GET qu'il faut utiliser et non POST comme tu as fait.

Mais c'est risqué ça de passer les accès dans l'URL. Pourquoi n'utilises-tu pas un ID unique pour faire ça ?

Et n'oublies pas de faire attention à l'injection SQL. -> mysql_real_escape_string()

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 17:49

Pourquoi n'utilises-tu pas un ID unique pour faire ça ?
que veu tu dire part Id unique
//qui va nous permettre de savoir quel enregistrement modifier
$login = $_GET['login'];
meme en remplacent le POST par GET dans la partie 2 ca ne marche pas
Modifié en dernier par boulon le 28 oct. 2008, 17:52, modifié 1 fois.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 17:51

Tu n'as définies aucune clé dans ta table, il est toujours conseillé d'en mettre une. Tu peux l'auto-incrémenter et elle sera unique pour chaque enregistrement.

Ensuite tu pourras te baser sur cet ID pour identifier chaque membre au lieu de te baser sur le login.

Donc dans ta table, tu ajoutes un champ "id_membre" (par exemple), clé primaire et auto-incrémenté ça devrait faire l'affaire.

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 18:13

j'ai rajouter le champ comme tu me la conseillé
j'ai modifier la (parit1)

Code : Tout sélectionner

$sql = "SELECT id,login,password,accessLevel,lastIP,lastServer FROM accounts ORDER BY id";
ensuite le lien qui amene sur la (page2)

Code : Tout sélectionner

echo' <th><a href="accounts_modif.php?id_membre='. $data['id']. '">modifier</a></th>
la partie 2 a été modifié comme ceci

Code : Tout sélectionner

//récupération de la variable d'URL, //qui va nous permettre de savoir quel enregistrement modifier $id = $_GET['id_membre']; //requête SQL: $sql = "SELECT password,accessLevel FROM accounts WHERE login='$id_membre'";
pas de reponse il me met pas d'erreur mais dans le formulaire je ne vois toujour rien.

si tu veu test par toi meme $

voici le lien

http://l2-persia.com/script/accounts.php

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 19:01

$sql = "SELECT password,accessLevel FROM accounts WHERE login='$id_membre'";
Tu as laissé "login". Et comme l'id est un entier, inutile de l'entourer par des quotes

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 19:29

j'ai corrigé ce que tu ma dit
$sql = "SELECT password,accessLevel FROM accounts WHERE id=$id_membre";
ca ne change rien non plus

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 19:35

Que te donne
echo $id_membre;
?

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 19:56

en metant ca
echo '$id_membre';
il ne m'affiche pas l'ID

mais quand je replace tous cette valeur par
echo ''.$_GET['id_membre'].'';
il m'affiche l'ID

ça peut provenir de ça? il ne maffiche toujour pas le login et password et les accessLevel que je puisse le modifier..

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 20:45

Relis mon code, je n'ai pas mis de quote après le echo.

Avant de faire ce echo tu as bien défini $id_membre=$_GET['id_membre'] ? Si non, c'est normal que ça ne fonctionne pas.

Eléphanteau du PHP | 25 Messages

28 oct. 2008, 21:34

voila le scypt avec tes conseils

(la partie 2)
<?php 

include("config/config.php"); 
 //auteur du scrypt:
 
// Scrypt par monkey D Akira ou D Boulon
// Tout droits rerservés
// www.Elysion.com

//récupération de la variable d'URL, 
//qui va nous permettre de savoir quel enregistrement modifier 

$login=$_GET['login']; 

//requête SQL: 
$sql = 'SELECT login,password,accessLevel FROM accounts WHERE login=$login'; 

// echo pour savoir si recupere bien le login
 echo $login;

//exécution de la requête: 
 $req = mysql_query($sql);

//affichage des données: 
if ($data = mysql_fetch_array($req)); 
{ 
?> 

<form action="accounts_maj_bd.php" method="post"> 
<table width="238" border="0" align="center" class="text1"> 
<tr> 
<td width="51">Login :</td> 
<td width="75"<?php echo $data $login; 
//pour etre sur d'etre sur le bon login on laffiche 
?>"/></td> 
</tr> 
<tr> 
<td>Password :</td> 
<td><input name="passeword" type="text" value="<?php echo $password; 
//ici on affiche ce qu'il a deja dans la table, ensuite on peut le modiffier 
?>" size="25"> 
</td> 
</tr> 
<tr> 
<td> 
<center>AccesLevel:</center> 
</td> 
<td> 
<input name="accesLevel" type="text" value="<?php echo $accesLevel; 
//ici on affiche ce qu'il a deja dans la table, ensuite on peu le modiffier 
?>" size="25"></td> 
</tr> 
<tr> 
<td colspan="2" align="center"> 
<input type="hidden" name="login" value="<?php echo $login; ?>" /> 
<input type="submit" value="Envoyer"></td> 
</tr> 
</table> 
</form> 
<center> 
<?php 

//fin de if
}
 //auteur du scrypt

// Scrypt par monkey D Akira ou D Boulon
// Tout droits rerservés
// www.Elysion.com
?>
jusqu'a maintenant tout es bien parti il recuper bien le bon login mai il m'affiche toujour pas le password et l'accessLevel dans les parties formulaires. pour ensuite passe a ça modif...

voila un screen

Image

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2008, 22:01

Tu as gardé le login...ou est passé l'id ?

A quoi correspond $password ? Je ne le vois défini nulle part donc il n'existe pas c'est pour ça que tu ne récupères rien du tout.

Eléphanteau du PHP | 25 Messages

29 oct. 2008, 01:27

[quote="boulon"]oui j'ai gardé le login et ca fonctione autand que si c'etait l'ID que j'avais mis..

Code : Tout sélectionner

A quoi correspond $password ? Je ne le vois défini nulle part donc il n'existe pas c'est pour ça que tu ne récupères rien du tout.
apres ton commentaire j'ai fini par le definir comme ça
<?php 

include("config/config.php"); 
 //auteur du scrypt:
 
// Scrypt par monkey D Akira ou D Boulon
// Aidé par Deca -_-
// Tout droits rerservés
// www.Elysion.com

//récupération de la variable d'URL, 
//qui va nous permettre de savoir quel enregistrement modifier 

$login = $_GET['login']; 
$accesslevel = stripslashes($data['accessLevel']);

// On récupère les infos du login correspondante
$sql = ('SELECT * FROM accounts WHERE login=\''.$_GET['login'].'\''); 

//exécution de la requête: 
$req = mysql_query($sql);
 
//affichage des données: 
if ($data = mysql_fetch_array($req)); 
{ 
?> 

<form action="accounts_maj_bd.php" method="post"> 
<table width="238" border="0" align="center" class="text1"> 
<tr> 
<td width="51">Login :</td> 
<td width="75"/><?php echo $login; //pour etre sur d'etre sur le bon login on laffiche  ?> 

</td> 
</tr> 
<tr> 
<td> 
<center>AccesLevel:</center></td> 
<td> 
<input name="accesLevel" type="text" value="<?php echo $data['accessLevel'];  
//ici on affiche ce qu'il a deja dans la table, ensuite on peu le modiffier 
?>" size="25"></td> 
</tr> 
<tr> 
<td colspan="2" align="center"> 
<input type="hidden" name="login" value="<?php echo $login; ?>" /> 
<input type="submit" value="Envoyer"></td> 
</tr> 
</table> 
</form> 
<center> 
<?php 

//fin de if
}
 //auteur du scrypt

// Scrypt par monkey D Akira ou D Boulon
// Aidé par Deca -_-
// Tout droits rerservés
// www.Elysion.com
?>
la partie en vert a ete modifier ossi...

j'en n'es profiter pour effacer la partie password qui je pense me servai a rien. ce n'es pas a moi de le modifier mais au membre...

cette partie du scrypt marche ... ;) mais je ne sias pas s'il injecte dans la BDD pour un update
reste la partie 3 a voir aussi

je continue de cherher

merci de ton aide

cordialement Boulon D monkey..

Avatar du membre
ViPHP
ViPHP | 3008 Messages

29 oct. 2008, 09:45

Et s'il y avait 2 logins identiques...?

L'id étant unique, tu es sûr qu'un seul membre le possède contrairement à l'ID.
$accesslevel = stripslashes($data['accessLevel']);
ne sert à rien, tu ne l'utilises nulle part.

Regardes la fonction que je t'ai indiqué plus haut pour te protéger des injections.

Petit nouveau ! | 5 Messages

29 oct. 2008, 17:06

ce n'est peut etre pas ça mais une chose me turlupine

quant tu fait

$req = mysql_query($sql);

il te manque un parametre => le $db (identifiant de ta connexion a la base de données)
il faudrait donc mettre

$req = mysql_query($sql, $db);

et d'ailleurs tu devrais mettre cela

if($req = mysql_query($sql, $db){
//suite de tes instructions
}else{
echo mysql_error($db)." in ".$sql;
}

en mettant des 'echo' sur tes vérifications tu trouveras facilement ce qui ne va pas