Problème Compte Actif

Eléphant du PHP | 184 Messages

07 févr. 2011, 21:22

Bonjour,

J'ai réussi ( avec des cheveux en moins et beaucoup d'aide lol ) à réaliser une confirmation par mail d'inscription à un site quelconque.
J'ai un champ " actif " dans ma base à zero et qui passe à 1 quand le compte et actif et qui permet de se logger ensuite.

Mon problème est que même si le compte est inactif, mon fichier de log laisse passer l'utilisateur.
Je dois avoir pas mal d'erreurs là dedans:

Merci par avance:

Code : Tout sélectionner

<? require("conf.php"); /*-----------------------------------------------------------------*/ /* PROGRAMME PRINCIPAL */ /*-----------------------------------------------------------------*/ // CONNEXION A LA BASE DE DONNEE $conn = mysql_pconnect($sql_serveur, $sql_user, $sql_passwd) or trigger_error(mysql_error(),E_USER_ERROR);mysql_select_db($sql_bdd, $conn); // Récupération des variables necessaires à la vérification du champ 'actif' de la BDD $login = $_POST['pseudo_membre']; // Récupération de la valeur du champ actif pour le login $login $sql = "SELECT actif FROM membre WHERE pseudo like '%$login%'"; $result = mysql_query($sql)or die(mysql_error()); $row= mysql_fetch_assoc($result); $num_rows=mysql_num_rows($result); if($num_rows!=1) { $actif = $row['actif']; // $actif contiendra alors 0 ou 1 } else { $actif = ''; // $actif contiendra alors 0 ou 1 } /**/ // Il ne nous reste plus qu'à tester la valeur du champ 'actif' pour // autoriser ou non le membre à se connecter if($actif == '1') // Si $actif est égal à 1, on autorise la connexion { //... // On autorise la connexion... //... } else // Sinon la connexion est refusé... { //... header("Location:$url_erreur"); //... } // ON SELECTIONNE L'ENREGISTREMENT CONTENANT LE LOGIN ET // MOT DE PASSE SAISIS A LA PAGE INDEX.HTM $requete="select pseudo,passe from membre where pseudo=\"$pseudo_membre\" and passe=\"$passe_membre\""; $row2 = mysql_query($requete)or die(mysql_error()); // SI AUCUN ENREGISTREMENT NE CORRESPOND if(mysql_num_rows($row2)==0) { // REDIRECTION VERS LA PAGE ERREUR header("Location:$url_erreur"); } // SI LE LOGIN ET MOT DE PASSE SONT EXACTES else { // CREATION D'UN IDENTIFIANT ALEATOIRE $taille = 20; $lettres = "abcdefghijklmnopqrstuvwxyz0123456789"; srand(time()); for ($i=0;$i<$taille;$i++) { $id.=substr($lettres,(rand()%(strlen($lettres))),1); } // MISE A JOUR DE L'IDENTIFIANT DANS LA TABLE $requete2="update membre set id=\"$id\" where pseudo=\"$pseudo_membre\" and passe=\"$passe_membre\""; $row3 = mysql_query($requete2)or die(mysql_error()); // REDIRECTION VERS UNE PAGE PROTEGEE AVEC L'IDENTIFIANT SERVANT DE CLE header("Location:agenda.php?id=$id"); } ?>

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2011, 21:46

$sql = "SELECT actif FROM membre WHERE pseudo like '%$login%'";
$result = mysql_query($sql)or die(mysql_error()); 
$row= mysql_fetch_assoc($result);
$num_rows=mysql_num_rows($result); 

if($num_rows!=1)

{ 
     $actif = $row['actif'];  // $actif contiendra alors 0 ou 1
}
  else
 
{
    $actif = ''; // $actif contiendra alors 0 ou 1
} /**/
A remplacer par :
$sql = "SELECT actif FROM membre WHERE pseudo like '%$login%' AND actif=1";
$result = mysql_query($sql)or die(mysql_error()); 
$num_rows=mysql_num_rows($result); 
if( $num_rows == 1 )
  $actif = 1;
else
 $actif = 0;
;)

Eléphant du PHP | 184 Messages

07 févr. 2011, 22:00

Merci pour ta réponse :)

Mallheureusement le pseudo encore inactif passe toujours.

J'ai bien vérifié dans la base, il est toujours à 0 dans le champ " actif ", il ne devrait pas encore pouvoir se logger.

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2011, 22:19

J'avais pas fait gaffe...
Changes le like en =
Sinon c'est normal qu'on trouve des résultats bizarres...
Et si tu avais mis cela pour cause de majuscules/minuscules regardes du côté de strtolower() et strtoupper().

Eléphant du PHP | 184 Messages

08 févr. 2011, 09:55

C'est bon, ça marche maintenant, j'ai juste une petite erreur:

Cannot modify header information - headers already sent by (output started at /www/login.php:37) in /www/login.php on line 71

Mais mon message: " le compte n'est pas activé s'affiche correctement.

Il y a conflit justement avec ce message et le header final qui envoie sur la page une fois loggé. ( $zone_membre)

J'ai lu que cela venait des flux, comment pourrais je le présenter pour que ça ne s'affiche pas ?

Code : Tout sélectionner

<?php require("conf.php"); /*-----------------------------------------------------------------*/ /* PROGRAMME PRINCIPAL */ /*-----------------------------------------------------------------*/ // CONNEXION A LA BASE DE DONNEE $conn = mysql_pconnect($sql_serveur, $sql_user, $sql_passwd) or trigger_error(mysql_error(),E_USER_ERROR);mysql_select_db($sql_bdd, $conn); // Récupération des variables necessaires à la vérification du champ 'actif' de la BDD $login = $_POST['pseudo_membre']; // Récupération de la valeur du champ actif pour le login $login $sql = "SELECT actif FROM membre WHERE pseudo = '$login' AND actif='1'"; $result = mysql_query($sql)or die(mysql_error()); $num_rows=mysql_num_rows($result); if( $num_rows == 1 ) $actif = 1; else $actif = 0; // Il ne nous reste plus qu'à tester la valeur du champ 'actif' pour // autoriser ou non le membre à se connecter if($actif == '1') // Si $actif est égal à 1, on autorise la connexion { //... // On autorise la connexion... //... } else // Sinon la connexion est refusé... { //... echo "Erreur ! Votre compte n'est pas activé...<br>"; //... } // ON SELECTIONNE L'ENREGISTREMENT CONTENANT LE LOGIN ET // MOT DE PASSE SAISIS A LA PAGE INDEX.HTM $requete="select pseudo,passe from membre where pseudo=\"$pseudo_membre\" and passe=\"$passe_membre\""; $row2 = mysql_query($requete)or die(mysql_error()); // SI AUCUN ENREGISTREMENT NE CORRESPOND if(mysql_num_rows($row2)==0) { // REDIRECTION VERS LA PAGE ERREUR header("Location:$url_erreur"); } // SI LE LOGIN ET MOT DE PASSE SONT EXACTES else { // CREATION D'UN IDENTIFIANT ALEATOIRE $taille = 20; $lettres = "abcdefghijklmnopqrstuvwxyz0123456789"; srand(time()); for ($i=0;$i<$taille;$i++) { $id.=substr($lettres,(rand()%(strlen($lettres))),1); } // MISE A JOUR DE L'IDENTIFIANT DANS LA TABLE $requete2="update membre set id=\"$id\" where pseudo=\"$pseudo_membre\" and passe=\"$passe_membre\""; $row3 = mysql_query($requete2)or die(mysql_error()); // REDIRECTION VERS UNE PAGE PROTEGEE AVEC L'IDENTIFIANT SERVANT DE CLE header("Location:$zone_membre?id=$id"); } ?>

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2011, 10:23

Tu ne dois rien envoyer au navigateur avant d'utiliser une fonction header().
Dans un cas d'un header("Location:...") cela ne sert de toute manière à rien car tu ne verras pas le message.
Donc pas de fonction echo, print, ect.

Si tu veux absolument un message et une redirection il faut que tu fasses ta redirection en HTML (ou javascript) avec un timeout, ou bien un lien.

Eléphant du PHP | 184 Messages

08 févr. 2011, 10:46

Merci infiniment pour tes conseils.

Je tente cela tout de suite.

Merci encore

Eléphant du PHP | 184 Messages

08 févr. 2011, 11:48

J'ai utilisé:

die ("Votre compte n'est pas activé");

C'est correct ?

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2011, 11:51

die() au même titre que exit() stop le script.
On les utilise en cas d'erreur d'exécution et non comme information normale à envoyer à l'utilisateur. :/

Si tu veux afficher un message il faut que tu passes par echo et donc par une redirection navigateur et non serveur.
Donc du HTML.

Eléphant du PHP | 184 Messages

08 févr. 2011, 11:55

En fait j'ai essayé, j'ai fait une page erreur.html mais je n'arrive pas à mette un href dans mon echo :(

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2011, 12:23

// href HTML ?
echo "<a href=\"erreur.html\">erreur.html</a>";

Eléphant du PHP | 184 Messages

08 févr. 2011, 18:14

Merci beaucoup !!

Une dernière question, après j'arrête lol.

Comment puis je faire pour que le href soit automatique ?

En gros pour qu'il aille directement à la page.

Merci

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2011, 18:19

Il ne faut pas utiliser (que) une balise A alors.
Il faut renseigner une balise meta dans la balise head ou bien utiliser une redirection javascript.

JS :
echo "<script type=\"text/javascript\">document.location.href='erreur.html';</script>";
Mais je ne te suis pas bien... Si c'est une page d'erreur pourquoi ne pas l'afficher plutôt que de rediriger l'utilisateur vers cette page?
Un simple include() de cette page suffirait.