Hem... quel drôle de code.
Déjà, pour toi et pour ceux qui le reliront, c'est quand même plus clair de l'indenter correctement (et plus encore quand on ne met pas toutes les accolades facultatives).
Ensuite (dans le désordre) :
* pourquoi est-ce que tu fais parfois un un vilain
meta refresh et à d'autres moments un joli
header ?
* je suppose que le fichier code.txt est temporaire (puisque tu as dû le créer à la main et que tu écrases à chaque fois son contenu avec un nouveau code erreur) mais alors pourquoi ne pas faire tout simplement un
exit ?
* puisque le login et le password sont obligatoires quel est l'intérêt d'avoir tous ces niveaux d'erreurs (login vide et password vide / login vide et password non vide / login non vide et password vide) ?
* pourquoi, après avoir bien vérifié qu'ils n'étaient pas vides, refais-tu un test
if(isset($_POST['login']) && isset($_POST['pwd']) ) ?
* pourquoi lire les 500 premiers enregistrements de la table
session (pourquoi 500 d'ailleurs ?) et vérifier pour chaque enregistrement s'il correspond aux login/password ? Ce serait quand même plus logique et plus rapide de les rajouter en clause WHERE dans ta requête.
* la structure de ta table est comme suit :
1. login
2. password
3. role
ce qui est une mauvaise idée pour plusieurs raisons.
> d'abord parce qu'on préconise d'utiliser un identifiant unique (INT en auto_increment généralement) et qu'en l'état rien n'est moins sûr : as-tu une clé unique sur login / password (et éventuellement role) ?
> parce que les champs login / password devraient logiquement être rattachés à la table
utilisateurs
> quant au champ role soit un utilisateur ne peut en avoir qu'un et un seul (ce qui semble être le cas) et alors il devrait également être rattaché à la table
utilisateurs, soit un utilisateur peut en avoir plusieurs et il faudrait une autre table utilisateur_role. On peut également supposer que plusieurs utilisateurs aient le même "role" et dans ce cas il faudrait créer une table
roles dont l'identifiant se retrouverait en clé étrangère de la table
utilisateurs.
> pour finir le fait de créer cette table
roles va te permettre de supprimer ces vilains tests en dur dans le code (if role == xxx alors header yyy) puisqu'il suffira d'y rajouter le champ url.
Au final ça pourrait donner quelque chose comme ça :
CREATE TABLE roles (
id_role int(10) unsigned NOT NULL auto_increment,
libelle text NOT NULL,
url text NOT NULL,
PRIMARY KEY (id_role)
) AUTO_INCREMENT=7 ;
--
-- Contenu de la table 'roles'
--
INSERT INTO roles (id_role, libelle, url) VALUES
(1, 'finances', 'finances.html'),
(2, 'énergies', 'energies.html'),
(3, 'ressources humaines', 'ressources.html'),
(4, 'travaux neufs', 'travaux.html'),
(5, 'maintenance', 'maintenance.html'),
(6, 'administrateur', 'administrateur.html');
-- --------------------------------------------------------
--
-- Structure de la table 'utilisateurs'
--
CREATE TABLE utilisateurs (
id_user int(10) unsigned NOT NULL auto_increment,
nom text NOT NULL,
prenom text NOT NULL,
login text NOT NULL,
`password` text NOT NULL,
id_role int(10) unsigned NOT NULL,
PRIMARY KEY (id_user)
) AUTO_INCREMENT=1 ;
<?php
// Initialisation ou récupération des variables
$login = !empty($_POST['login']) ? trim($_POST['login']) : '';
$pwd = !empty($_POST['pwd']) ? trim($_POST['pwd']) : '';
$erreurs = array();
if($_SERVER['REQUEST_METHOD']=='POST') {
// login obligatoire
if(empty($login)) {
$erreurs[] = 'Le login est requis.';
}
// password obligatoire
if(empty($pwd)) {
$erreurs[] = 'Le password est requis.';
}
// pas d'erreur
if(empty($erreurs)) {
// Vérification du couple login / password
require 'connexion.php';
$sql = sprintf("SELECT url FROM utilisateurs Natural Join roles WHERE login='%s' AND password='%s'",
mysql_real_escape_string($login),
mysql_real_escape_string($pwd));
$result = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($result) < 1) {
$erreurs[] = 'Login et/ou Password incorrect(s).';
} else {
header('Location: '. mysql_result($result, 0) );
}
}
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Connexion</title>
<style type="text/css" media="screen">
.alerte {
color: #FF0033;
font-weight: bold;
}
</style>
</head>
<body>
<?php
if(!empty($erreurs)) {
foreach($erreurs as $erreur) {
echo '<p class="alerte">'.$erreur."</p>\n";
}
}
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
<label for="login">Login : </label>
<input type="password" name="login" id="login" value="<?php echo htmlspecialchars($login); ?>" />
</p>
<p>
<label for="pwd">Password : </label>
<input type="password" name="pwd" id="pwd" value="<?php echo htmlspecialchars($pwd); ?>" />
</p>
<p>
<input type="submit" value="Se connecter" />
</p>
</form>
</body>
</html>