[php] authentification: pb de foreach

Bonjours, voila j’ai une exo a faire, et j’ai un probléme, voici la consigne:
C’est l’exo1, parti pratique

La page index avec le test pour savoir si le visiteur a une session d’ouverte… je le ferait plus tard, pour l’instant j’ai créer formulaire.php, qui agit sur verification.php

Verification.php recoit le login et le pass que le visiteur a saisi, et il le compare avec… ce qu’il y a dans le fichier login.txt, et il agit en conséquence:

Si les identifiants sont bons, on met a jour la supergolbale $_SESSION…

J’ai un probléme avec mon foreach, le prof m’as dit qu’il fallait que je sorte de la boucle au bon moment:
actuellement, ca ne marche qu’avec les identifiants vincent et 3456, soit le dernier, avec les autres ca marche pas…

vous pouvez essayer de vous loger ici:
login (sur easyphp y’a pas tous ces warning a cause du session_start() :confused: bizar

et vous pouvez telecharger tous les fichiers de cet exo que j’ai fait ici:
zip

Merci de votre aide

tp noté?

sinon pense à créer le dossier sessions sous free :slight_smile:

et on ne sort jamais d’une boucle avec exit …

-> http://www.php.net/manual/fr/function.exit.php

En gros, tu kill ton script. Essaye break…

Et sinon, si votre prof vous a dit d’utiliser <? c’est que son cours n’est pas du tout à jour.

On utilise <?php car c’est PORTABLE, C’EST LE BIEN!

Merci de ta reponse, j’essayerais avec break.
Le exit dans une boucle, je sais que le prof de C n’apprécie pas du tout, j’avais un doute en php…
Et sinon, pour le <? au lieu de <?php, ca vient pas du prof, ça vient de moi, c’est plus rapide, par contre j’ignoré les problèmes de portabilité, alors merci pour tous ces conseils.

Ah oui, le tp n’est pas noté, dans quelques semaines, a l’issu des cours php, on aura un projet a réaliser (l’année derniére par exemple, on m’as dit qu’il fallait faire un blog, en utilisant des fichiers en plus, interdiction d’utiliser MySQL, j’ai du mal a comprendre la logique de ceux qui font les consignes parfois…

ben tu peux utiliser SQLLite qui est une bdd locale :smiley:

ou pgSQL, c’est pas mySQL quoi :smiley:

Oui c’est vrai, on peut jouer sur les mots, mais le prof est pas joueur a mon avis…

Sinon pour mon probléme, j’ai pas reussi a le ressoudre, j’ai essayé avec break, break 2…

Voici mon code:

$nom = $_POST['nom'];
$pass = $_POST['pass'];

$fichier=file('login.txt');

foreach ($fichier as $elem){
	$test=explode(',',$elem);
	if ($test[0]==$nom){
  if ($test[1]==$pass){
  	echo 'hello'.$nom;
  	//opération sur les cookies et redirection sur la page index
  	break;
  }	
	}
	else
  echo 'au revoir';
}

D’avance merci

Edit :
Apres test, j’ai trouvé l’erreur de ton probleme. Quand tu explode les deux partie de la virgule ton passe a un blanc apres, il n’est pas jamais egale a la variable passé par le formulaire.
un str?() pour coupé le derniere caractere, qui est surment du au retour chariot dans le fichier test.

J’aurais , en ce qui me concerne, plutot vu un truc qui met en forme tout les entrée du fichier, un tableau array( ‘Login’ , ‘Pass’ ); pour apres tu verifies si l’entrée que tu recherche est bien dans le tableau que tu as crée avec isset() par exemple ?.


$Datas = file(...);
foreach( $Datas as $Value ) {
       $Value = explode( ',' , $Value );
       $listLogin[ $Value[0] ] = $Value[1];
}

if( isset( $listLogin[ $Login ] ) ) {
       if( $listLogin[ $Login ] == $Pass ) {
                /* Valider la connection */
       } else {
                /* La connection n'est pas possible ( Password Faux ) */
       }
} else {
       /* La connection n'est pas possible ( Login introuvable ) */
}

Surment un code un peu plus long a réalisé car il parcours tout le tableau resulat de file, et ne s’arrette quand le login est trouvé. Mais dans le cas ou le login n’existe pas le tien ne s’arrette pas non plus avant la fin.

J’ai testé ton code:

$Datas = $fichier;
foreach($Datas as $Value) {
$Value = explode( ',' , $Value );
$listLogin[ $Value[0] ] = $Value[1]; //(ij'ai remplacé 1-2 par 0-1, sinon erreur
}

if( isset( $nom[ $nom ] ) ) {
if( $listLogin[ $nom ] == $pass ) {
	echo 'hello'.$nom;
} else {
 /* La connection n'est pas possible ( Password Faux ) */
}
} else {
/* La connection n'est pas possible ( Login introuvable ) */
}

Et ben… toujours le même probléme, ca ne marche qu’avec le dernier couple login/mot de passe du fichier login.txt, soit vincent/3456, avec les autres, même erreur qu’avant.

Au moins on est sur que le probléme vient du foreach lol
En fait, quand la boucle foreach trouve le login/pass, elle “refait un tour” ce qui n’est pas le cas quand ce couple était le dernier du fichier, enfin je pense que c’est ca le probléme, c’est vraiment pas pratique tout ca :confused:

Le probléme reste entier

Je remet mon edit ici :

Apres test, j’ai trouvé l’erreur de ton probleme. Quand tu explode les deux partie de la virgule ton passe a un blanc apres, il n’est pas jamais egale a la variable passé par le formulaire.
un str?() pour coupé le derniere caractere, qui est surment du au retour chariot dans le fichier test.

Merci, je ne suis pas sûr d’avoir bien compris:
en gros, a chaques fois il lit sur la même ligne?
j’ai trouvé ca sur le code ascii de la touche entrée.

J’ai appris que la touche entrée faisait 2 opérations: a la ligne et retour charriot.

Concrétement il faut faire quoi? (pourrait tu me donner le code, ca serait sympa)

Tu as plusieur entrée dans ton fichier test :

Login,Pass
Login,Pass
etc

Quand la fonction file() lit le fichier elle trouve des espace en fin de ligne apres "Pass"

Login,Pass(espace)
Login,Pass(espace)
Login,Pass(pas d’espace fin de fichier)

Ainssi c’est pour cela que seulement la derniere entrée pour etre validé par ton code. Ou alors pour etre validé il faudrais que la personne entre son code + un espace et la seulement les n - 1 premiere entrée serons validé (pas la derniere en somme, car elle na pas d’espace a la fin).
La moyen d’y remedier et d’eleve cette espace grace a des fonction php de troncage de chaine.

tente moi ça :

function login($login, $pwd) {
  $htpwd = 'login.txt';
  $matched = false;
  // TODO : économiser la mémoire, sérialiser le fichier, ou autre.
  foreach (file($htpwd) as $line) {
    $set = preg_split('@\s*,\s*@', trim($line), 2);
    // ou explode(',', trim($line), 2);
    //    $set[0] = rtrim($set[0]);
    //    $set[1] = ltrim($set[1]);
    if ($set[0] == $login && $set[1] == $pwd) return true;
  }
  return false;
}

De cette façon :


// + isset($_POST['..']) 
if (login($_POST['nom'], $_POST['pass'])) {
  echo 'connecté';
}

C’est du boulot maché, mais bon. Tu as compris l’essentiel je pense.

C’est bon, ca marche, merci a vous deux:
Pour le moment, j’utilise la source de Sans-Nom
Et au prochain cours de php (lundi prochain), je verrais pour les retours charriots etc… histoire de réparer le bout de code que j’avais crée.
Bonne soirée