12-07-2010, 07:33 AM
Pourtant, la coloration syntaxique du forum permet de voir ce qui merde…
En fait c'est juste parce que tu fais des choses un peu bizarre, comme sauter de lignes en plein commentaire. Cela me fait penser que tu ne sais pas ce que tu écris et que tu t'es contenté de faire du copier/coller.
Ici, le mot "d'identification" est balancé en plein milieu du code… Donc ça plante…
Après, tu délimites une chaîne avec des guillemets simples :
Ici, PHP croit que la chaîne s'arrête au ' de "n'êtes". Il faut que tu échappes cet apostrophes (en mettant un \ devant) ou que tu utilises des double quote.
Voici le code source lavé de quelques erreurs :
Ensuite, quelques choses à améliorer. Déjà, tu ne devrais pas utiliser extract. C'est très sale car ça crée des variables à la volée, donc tu pourras avoir des résultats inattendus si de telles variables existent déjà. Tu devrais utiliser $_POST['login'] au lieu de $login.
Ensuite, tes requêtes. Tu fais :
Ça va vitre être le bordel et être inutilisable. Je te conseille d'adopter cette notation qui te permettra du code bien plus propre et maintenable :
Avec sprintf, le premier argument est une chaîne qui contient des marqueurs qui seront remplacés dans l'ordre des arguments suivants. Quand c'est une chaîne de caractères que tu attends, il faut mettre '%s', et quand c'est un nombre entier, tu mets %d et si c'est un nombre à virgue, tu mets %f.
Pense à passer tes chaînes à la fonction mysql_real_escape_string pour éviter certaines failles.
Pense à passer tes entiers à la fonction intval et tes flottants à la fonction floatval.
Un autre conseil : n'utilise pas d'abréviations. Ta colonne pwd devrait s'appeler password. Et tu devrais utiliser le même mot partout pour un même usage (là tu as pwd et pass), je te conseille d'utiliser password partout.
Ensuite, ta table tbl_user, ce n'est pas vraiment un bon nom : on sait que c'est une table (et tu n'en es pas encore à utiliser des vues), donc le nom users (car elle contient plusieurs users) semble plus judicieux.
Enfin, pour tes erreurs, je te déconseille le or die, ça va t'emmerder le jour où tu voudras les retirer (bien que tu ne sois pas près de le faire). Voici ce que je te propose :
Ça implique de définir quelque part dans ton script (dans un fichier inclus dans chaque script, par exemple) une constante DEBUG_SQL à true comme cela :
Et le jour où tu ne veux plus ces relevés, tu la mets à false.
Voilà !
Sephi-Chan
En fait c'est juste parce que tu fais des choses un peu bizarre, comme sauter de lignes en plein commentaire. Cela me fait penser que tu ne sais pas ce que tu écris et que tu t'es contenté de faire du copier/coller.
else {
echo '<p>Vous avez oublié de remplir un champ.</p>';
include('login.htm'); // On inclut le formulaire
d'identification
exit;
}
Ici, le mot "d'identification" est balancé en plein milieu du code… Donc ça plante…
Après, tu délimites une chaîne avec des guillemets simples :
if(!isset($_SESSION['login'])) {
echo 'Vous n'êtes pas autoris´ à acceder à cette zone';
include('login.htm');
exit;
}
Ici, PHP croit que la chaîne s'arrête au ' de "n'êtes". Il faut que tu échappes cet apostrophes (en mettant un \ devant) ou que tu utilises des double quote.
Voici le code source lavé de quelques erreurs :
<?php
session_start();
mysql_connect();
if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])){
extract($_POST);
// on recupère le password de la table qui correspond au login du visiteur
$sql = "select pwd from tbl_user where login='".$login."'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$data = mysql_fetch_assoc($req);
if($data['pwd'] != $pass) {
echo '<p>Mauvais login / password. Merci de recommencer</p>';
include('login.htm'); // On inclut le formulaire d'identification
exit;
}
else {
session_start();
$_SESSION['login'] = $login;
echo 'Vous etes bien logué';
// ici vous pouvez afficher un lien pour renvoyer
// vers la page d'accueil de votre espace membres
}
}
else {
echo '<p>Vous avez oublié de remplir un champ.</p>';
include('login.htm'); // On inclut le formulaire d'identification
exit;
}
/*
si la variable de session login n'existe pas cela siginifie que le visiteur
n'a pas de session ouverte, il n'est donc pas logué ni autorisé à acceder
à l'espace membres
*/
if(!isset($_SESSION['login'])) {
echo "Vous n'êtes pas autorisé à acceder à cette zone";
include('login.htm');
exit;
}
?>
Ensuite, quelques choses à améliorer. Déjà, tu ne devrais pas utiliser extract. C'est très sale car ça crée des variables à la volée, donc tu pourras avoir des résultats inattendus si de telles variables existent déjà. Tu devrais utiliser $_POST['login'] au lieu de $login.
Ensuite, tes requêtes. Tu fais :
$sql = "select pwd from tbl_user where login='".$login."'";
Ça va vitre être le bordel et être inutilisable. Je te conseille d'adopter cette notation qui te permettra du code bien plus propre et maintenable :
$sql = sprintf(
"SELECT pwd
FROM tbl_user
WHERE login = '%s';",
mysql_real_escape_string($_POST['login'])
);
Avec sprintf, le premier argument est une chaîne qui contient des marqueurs qui seront remplacés dans l'ordre des arguments suivants. Quand c'est une chaîne de caractères que tu attends, il faut mettre '%s', et quand c'est un nombre entier, tu mets %d et si c'est un nombre à virgue, tu mets %f.
Pense à passer tes chaînes à la fonction mysql_real_escape_string pour éviter certaines failles.
Pense à passer tes entiers à la fonction intval et tes flottants à la fonction floatval.
Un autre conseil : n'utilise pas d'abréviations. Ta colonne pwd devrait s'appeler password. Et tu devrais utiliser le même mot partout pour un même usage (là tu as pwd et pass), je te conseille d'utiliser password partout.
Ensuite, ta table tbl_user, ce n'est pas vraiment un bon nom : on sait que c'est une table (et tu n'en es pas encore à utiliser des vues), donc le nom users (car elle contient plusieurs users) semble plus judicieux.
Enfin, pour tes erreurs, je te déconseille le or die, ça va t'emmerder le jour où tu voudras les retirer (bien que tu ne sois pas près de le faire). Voici ce que je te propose :
$req = mysql_query($sql);
if(DEBUG_SQL && !$req){ die('<h1>Erreur SQL !<h1><pre>'.$sql.'</pre><p>'.mysql_error().'</p>'); }
Ça implique de définir quelque part dans ton script (dans un fichier inclus dans chaque script, par exemple) une constante DEBUG_SQL à true comme cela :
define("DEBUG_SQL", true);
Et le jour où tu ne veux plus ces relevés, tu la mets à false.
Voilà !
Sephi-Chan