Probleme recuperation formulaire et redirection

Signaler
Messages postés
3
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
14 janvier 2009
-
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
-
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

Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
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
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
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 -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
... 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-
Messages postés
3
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
14 janvier 2009

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; ]
Messages postés
3
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
14 janvier 2009

up  
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
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<
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
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-
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
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<