Pb de lecture dans ma bdd

Phil21
Invité n'ayant pas de compte PHPfrance

25 août 2010, 18:06

Bonjour à tous,
Ce script me permet la redirection sur une page après validation d’un mot de passe en base de données.

Lorsque je demande une « lecture dans ma bdd » comprenant plusieurs enregistrements de mot de passe, seul le dernier enregistrement et reconnu et fonctionne correctement !

Si quelqu’un à une idée pour résoudre ce problème…
Merci beaucoup pour votre aide.

Ma table :
-- phpMyAdmin SQL Dump
-- version 2.6.4-pl3
-- http://www.phpmyadmin.net
-- 
-- Serveur: localhost
-- Généré le : Mercredi 25 Août 2010 à 17:52
-- Version du serveur: 5.0.81
-- Version de PHP: 5.2.6-1+lenny9
-- 
--
-- Base de données: `password `
-- --------------------------------------------------------
-- Structure de la table `password `
--
CREATE TABLE `password ` (
  `id` int(11) NOT NULL auto_increment,
  `mot_de_passe` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
-- Contenu de la table `password `
--
INSERT INTO `password ` VALUES (2, '9543');
INSERT INTO `password ` VALUES (3, '4857');
INSERT INTO `password ` VALUES (3, '2681');
Mon script :
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=password',  'root',  '1234');
}
catch (Exception $e)
{
 die('Erreur : ' . $e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM password');
while ($donnees = $reponse->fetch())
{
 $passe = $donnees['mot_de_passe']; 
}
$reponse->closeCursor(); 
if(isset($_POST['mdp']))
{
 if(($_POST['mdp'])===$passe)
 {
  header ("location: ma_page_login.php");
  }
   else
   {
   header ("location: ma_page_erreur.php");
   }
   }
?>

</table>
</font> 
</div>
<table width="200" border="0" align="center">
<tr>
 <td align="center" valign="middle"><img src="../../images/header.png" width="856" height="153" /></td>
 </tr>
<tr>
 <td align="center" valign="middle" class="mess3"><p class="mess7">&nbsp;</p>
 <p class="mess7">Accueil</p>
<p><img src="images/ordi_live.png" width="126" height="110" /></p>
 <p class="mess9">&nbsp;</p>
 <p class="mess9">Veuillez entrer votre mot de passe et valider</p></td>
<tr>
 <td align="center" valign="middle"><form action="ma_page.php" method="post">
 <p>
 <input name="mdp" type="password" style="text-align:center; " class="texte_noir" size="30" maxlength="30" />
 <br />
 <input type="submit" class="button_dark" value="Valider" />
 </p>
</form>
</td>
<tr>
 <td colspan="7" align="center">&nbsp;</td>
</tr>
<tr>
 <td colspan="7" align="center">&nbsp;</td>
</tr>
<tr>
 <td colspan="7" align="center"><a href="retour.php" class="mess4">Quitter</a></td>
</tr>
</table>
</body>

ViPHP
xTG
ViPHP | 7331 Messages

25 août 2010, 19:04

C'est tout à fait normal car tu écrases le contenu de $passe à chaque itération.
Mets ton test à l'intérieur de la boucle while.

Phil21
Invité n'ayant pas de compte PHPfrance

25 août 2010, 22:40

Merci xTG pour cette réponse, mais je suis novice dans ce domaine et je ne saisi pas tout quand tu me dis de mettre mon test à l’intérieur de la boucle while.
Pourrais-tu me donner des détails ou me corriger le script ? (que je comprenne mieux mon erreur)

Merci pour ton aide !

ViPHP
xTG
ViPHP | 7331 Messages

26 août 2010, 10:50

J'ai rien dit en fait... J'avais mal parcouru le code.
Bon voilà une solution, tu créés un array avec les mots de passe récupérés et quand tu les as tous tu vérifies que le mot de passe est dans l'array.
$reponse = $bdd->query('SELECT mot_de_passe FROM password');
while ($donnees = $reponse->fetch())
{
 $passe[] = $donnees['mot_de_passe'];
}
$reponse->closeCursor();
  if(isset($_POST['mdp']))
  {
   if( in_array($_POST['mdp'],$passe) )
   {
    header ("location: ma_page_login.php");
   }
   else
   {
   header ("location: ma_page_erreur.php");
   }
 }

Phil21
Invité n'ayant pas de compte PHPfrance

26 août 2010, 17:16

Merci beaucoup xTG pour ta réponse qui ma permis de comprendre mon problème et bien sur d’avancé dans mon apprentissage…

Bonne fin de journée ! :wink: