dans le code que tu founis il n'y a pas de session_start().
toujours dans ce même code lorsque tu fais if ($MembreID == "") . Ma variable $MembreID c'est affectée null part !
d'ailleurs il serait p'tet plus "optiomisé" de faire ce contrôle avant pour éviter une requete sql inutile.
les whiles que tu utilise sont totalement inutile parce que :
- un membre n'a qu'un seul compte (sinon c'est la merde assurée avec le même login).
- avec ton code, dans le cas où il y aurait plusieurs lignes, seule la dernière tu jeux de résultat serais prise en compte
if ($s_Login != "" | $s_Pass != "") { => tu te connecte avec soit le login soit le mot de passe ? pratique coté usurpation d'identité
$userID = $row['userID'];
$S_membre['id'] = $row['id'];
tu as deux identifiants dans la même table ? si oui => inutile.
unset($p); => aucune trace null part dans le code
$_SESSION['s_p'] = null; idem
$_SESSION['p'] = null; idem
if ($_SERVER['SCRIPT_NAME'] == "/index.php") {
header("Location: index.php");
}
si tu n'es pas sur l'index tu reste sur une page blanche ?
$s_Login = (isset($_POST['s_Login'])) ? mysql_real_escape_string($_POST['s_Login']) : '';
$s_Pass = (isset($_POST['s_Pass'])) ? mysql_real_escape_string($_POST['s_Pass']) : '';
inutile sha1 ou md5 ne retourne pas de chaînes avec des caractères qui peuvent corrompre la requête sql (c'est que de l'hexa), mais pourquoi pas.
au final je ferais ton code dans se style :
<?php
session_start();
if(!empty($_SESSION['S_membre']['id'])){
// déja connecté retour case précédente. Un message serait une bonne idée !
header('Location: '.$_SERVER['HTTP_REFERER']);
exit();
}
$temp_vie_cookie = 12456789;
if (!empty($_POST['s_Login']) && !empty($_POST['s_Pass'])) {
$sql = 'SELECT *
FROM source_clients
WHERE email = md5(\'' . mysql_real_escape_string($_POST['s_Login']) . '\' )';
$query = mysql_query($sql);
if ($query !== false) {
$row = mysql_fetch_array($query);
if ($row !== false) {
// on libère la ressource
mysql_free_result($query);
if ($row['pass'] == sha1($_POST['s_Pass'])) {
unset($row['pass']); // info inutile en session
$_SESSION['S_membre'] = $row;
$MembreID = md5(uniqid(rand(), true));
if (empty($row['userID'])) {
$sql = 'UPDATE source_clients
SET userID= \'' . $MembreID . '\'
WHERE id = ' . $_SESSION['S_membre']['id'];
if (mysql_query($sql) === false) {
// erreur à la mise à jour de la table
}
}
$cookietime = time() + (86400 * $temp_vie_cookie); // prolonge le cookie
setcookie("MembreID", $MembreID, $cookietime);
header("Location: index.php");
} else {
// mdp ko
}
} else {
// pas de résultat donc utilisateur inconnu
}
} else {
// erreur SQL, => mysql_error();
}
} else {
//echo "Utilisateur non trouvé ";
}
// auto connexion ?
if (!empty($_COOKIE['MembreID'])) { // si le cookie existe
$sql = 'SELECT *
FROM source_clients
WHERE userID=' . mysql_real_escape_string($MembreID); // <= c'est un entier je suppose ? si oui pas de ' ce n'est pas une chaine de caractère.
$query = mysql_query($sql);
if ($query !== false) {
$row = mysql_fetch_array($query);
if ($row !== false) {
mysql_free_result($$query); // important
unset($row['pass']); // info inutile en session
$_SESSION['S_membre'] = $row;
$cookietime = time() + $temp_vie_cookie; // prolonge le cookie
setcookie("MembreID", $_COOKIE['MembreID'], $cookietime);
} else {
// utilisateur inconnu !
}
} else {
// erreur sql tu as le message avec myslq_error()
}
}
pour les requêtes plutôt qu'un select * indiquer les noms des champs est une meilleur idée pour la lisibilité du code et éviter de ramener des trucs inutile (genre le mot de passe ne sert qu'a la connexion).
@+