Probleme recuperation formulaire et redirection

cs_medjai Messages postés 3 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 14 janvier 2009 - 13 janv. 2009 à 18:18
Flachy Joe Messages postés 2101 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 7 novembre 2022 - 19 janv. 2009 à 13:05
Bonjour à vous et tout d'abord Bonne année 2009 !! :p
Voilà pour tout dire, j'ai un problème en ce qui concerne mon authentification sur un site que je développe. Le pire c'est que je ne sais même pas ce qui cloche car je n'ai pas réellement de message d'erreur mais ce qui est sûr c'est que cela ne fonctionne pas comme prévue. o_O
J'ai un formulaire (avec 2 champs: login et pass; ce qui n'est vraiment pas trop compliqué normalement) mais j'ai beau renseigner les bons champs (avec ce qui se trouve dans ma table), je retourne toujours au formulaire sans être rediriger comme il se doit. :colere2:
(problème de la variable $loginOK qui affecte un header !!)
Si c'est bien cela, enfin je crois.. :-°
J'ai un code html pour le formulaire mais qui je pense est bon donc je donne mon script de vérification du formulaire qui je pense doit etre faux (sinon je ne serai pas là, lol :D ).
Voici le code:

Code : PHP




<?php
// On demarre la session
session_start();
function verif_login($login, $pass) {

$loginOK = false;

// On n'effectue les traitement qu'a la condition que les informations aient ete effectivement postees
if(isset($_POST['login']) && isset($_POST['pass']) && ($_POST['login'] && $_POST['pass'] != NULL)){
if (!empty($_POST['login']) && !empty($_POST['pass'])) {

mysql_connect( "localhost" , "" , "" ) or die ("pas d'ouverture mysql".mysql_error());
mysql_select_db("manadgersdb") or die ("connexion base marche pas".mysql_error());

$login = mysql_real_escape_string($_POST['login']);
$query mysql_query("SELECT 'id_clients', login, email, pass_md5 FROM clients WHERE login '$login'") or die ("la requete a echouee".mysql_error());

// On verifie que l'utilisateur existe bien
if ( mysql_num_rows($donnees) >0){
$donnees = mysql_fetch_assoc($query);
}
mysql_close();
// On verifie que son mot de passe est correct
if ((md5($pass)) == $donnees['pass_md5']) {
$_SESSION['id_clients'] = $donnees["id_clients"];
$_SESSION['login'] = $login;
$_SESSION['email'] = $donnees["email"];

$loginOK = true;
}
}
return $loginOK;
}
}


$loginOK = verif_login($_POST["login"], $_POST["pass"]);
//Maintenant dans la var loginOK il y a true si le login est bon, FALSE sinon

// Si le login a ete valide on met les donnees en sessions
if ($loginOK === true) {
header("location: menu.php");
}else{
header("location: monformulaire.php");

}
?>



Voilà et sims d'avance.

Peace





Si t'appelles une voyante et qu'elle ne décroche pas avant que ça sonne, alors raccroche ..!!
By JC.VD

8 réponses

Flachy Joe Messages postés 2101 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 7 novembre 2022 1
13 janv. 2009 à 19:18
C'est un problème d'entête déjà envoyée lors de l'appel de header ('location...
En effet session_start() envoi déjà des headers, et il ne peuvent plus être réenvoyer.

La solution : Ajouter ob_start(); avant session_start();  cf : http://www.php.net/manual/fr/function.session-start.php

Flachy Joe

« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 janv. 2009 à 22:55
Salut,

J'ai parcouru rapidement.
Plutôt que d'utiliser la bufferisation je ferai plus simple :

if (isset ($_POST["login"]) && isset($_POST["pass"]) {
    $loginOK = verif_login($_POST["login"], $_POST["pass"]);
    //Maintenant dans la var loginOK il y a true si le login est bon, FALSE sinon

    // Si le login a ete valide on met les donnees en sessions
    if ($loginOK === true) {
      header("location: menu.php");
    }else{
      header("location: monformulaire.php");
    }
    exit;
}

session_start();
[...]

Cordialement,

Kohntark -
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 janv. 2009 à 23:47
... faut arrêter de parcourir rapidement; j'ai dit une connerie, Flachy Joe a raison : ob_start et ob_end_flush, autant pour moi.

J'en profite :
if ( mysql_num_rows($donnees) >0){
    $donnees = mysql_fetch_assoc($query);
}
mysql_close();
// On verifie que son mot de passe est correctif ((md5($pass)) $donnees['pass_md5']) {>
si la requête ne retourne aucun résultat $donnees ne sera pas définie => bug, voir possibilité de faire de l'injection SQL.

mysql_close() => ne sert à rien

&& ($_POST['login'] && $_POST['pass'] != NULL)
=> ne sert à rien, non ?

Les "or die ("pas d'ouverture mysql".mysql_error());" sont dangereux : en cas d'erreur ils révèlent des infos importantes sur la structure de ta base

Kohntark-
0
cs_medjai Messages postés 3 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 14 janvier 2009
14 janv. 2009 à 10:43
Merci, j'ai bien essayyé de modifier l'ordre des tests d'existence des varable login et pass mais rien, nada,niet.
Que dois-je conclure sachant que  je n'ai pas encore une methode fructueuse pour debuguer..

Si t'appelles une voyante et qu'elle ne décroche pas avant que ça sonne, alors raccroche ..!!
By JC.VD[Insert_Emoticon%28%27/imgs2/smile_question.gif%27%29; ]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_medjai Messages postés 3 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 14 janvier 2009
14 janv. 2009 à 17:49
up  
0
Flachy Joe Messages postés 2101 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 7 novembre 2022 1
14 janv. 2009 à 18:36
Je suis pas sur que quiconque regarde la liste des nouveaux échange, celle qui liste les thread par date de début est beaucoup plus utilisable, donc le up ne sert pas à grand chose....

Qu'en est il de l'utilisation de ob_start ?

Flachy Joe

« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks<
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
15 janv. 2009 à 08:43
Que dois-je conclure
=> tu dois en conclure qu'il faut utiliser la proposition de Flachy Joe et mes remarques du 13 janvier 2009 à 23:47:12 (je rappelle que mon premier post est une erreur)

une methode fructueuse pour debuguer..
=> ajoute ça en haut de ta page, car j'ai l'impression que les reports d'erreurs ne sont pas actifs chez toi :

ini_set ('display_errors', 'on');
error_reporting(E_ALL);

Cordialement,

Kohntark-
0
Flachy Joe Messages postés 2101 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 7 novembre 2022 1
19 janv. 2009 à 13:05
Quelques modifs du code fournis, ça fonctionne :

--8<--[monformulaire.php]--8<--
<html>
<form method="post" action="traitement.php">

</form>
</html>
--8<--
Non, ça ne suit pas les standards, mais ça marche !

--8<--[traitement.php]--8<--
<?php
    // On demarre la session
    session_start();
    function verif_login($login, $pass) {
       
        // On n'effectue les traitement qu'a la condition que les informations aient ete effectivement postees
        if(isset($login) && isset($pass)){
            if (!empty($login) && !empty($pass)) {
/*                mysql_connect( "localhost" , "" , "" ) or die ("pas d'ouverture mysql".mysql_error());
                mysql_select_db("manadgersdb") or die ("connexion base marche pas".mysql_error());
               
                $login = mysql_real_escape_string($_POST['login']);                $query mysql_query("SELECT 'id_clients', login, email, pass_md5 FROM clients WHERE login '$login'") or die ("la requete a echouee".mysql_error());
               
                // On verifie que l'utilisateur existe bien
                if ( mysql_num_rows($donnees) >0)
                    $donnees = mysql_fetch_assoc($query);

                mysql_close();
*/
///<DEBUG
                //N'importe quel mot de passe est valide...
                $donnees['pass_md5'] = md5($pass);
///DEBUG>
               
                // On verifie que son mot de passe est correct
                if ((md5($pass)) == $donnees['pass_md5']) {
                    $_SESSION['id_clients'] = $donnees["id_clients"];
                    $_SESSION['login'] = $login;
                    $_SESSION['email'] = $donnees["email"];
                   
                    return true;
                }
            }
        }
        return false;
    }

    if (verif_login($_POST["login"], $_POST["pass"]))
        header("location: menu.php");
    else
        header("location: monformulaire.php");
?>
--8<--

L'erreur vient du SQL ou du HTML, en tout cas la redirection fonctionne, et l'utilisation de ob_start() ne semble pas utile (!?)

NB : Plusieurs erreurs de logique dans la fonction verif_login d'origine : utilisation de $_POST alors que les var sont en arguments, pas de return dans toutes les conditions, $loginOK qui ne sert à rien.

Flachy Joe

« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks<
0
Rejoignez-nous