Autor Zpráva
gardener
Profil
Zdravím
Mám problém s kterým si nevím rady co se týče session
Ve skriptu s názvem overeni si session nejprve zaregistruji:

overeni.php
session_register("prihlasen");
session_register("is_admin");

a oescapuji promenne
$surname = (mysql_real_escape_string($_POST["surname"]));
$password = (mysql_real_escape_string($_POST["password"]));


poté zavolám fci overeni:

fce overeni:

<?php
function overeni ($surname, $password){
    $_SESSION['prihlasen'] = 0;
    $_SESSION['is_admin'] = 0;
    
    if(mysql_query("select surname,password,jeadmin from users where surname='".$surname."' and password='".$password."'and jeadmin='1' "))
   {
      $_SESSION['prihlasen'] = 1;     
	   $_SESSION['is_admin'] = 1;
      return true;
  }
    elseif(mysql_query("select surname,password from users where surname='".$surname."' and password='".$password."' ")){
        $_SESSION['prihlasen'] = 1;
        return true;
    }
    else
    {
    return false;
    }
}

?>


a na základě vrácené hodnoty provedu akci.

{
if($_SESSION['prihlasen'] == 0){
     echo "Spatne zadane udaje";
     //echo "<script>location.href='form_login.php';</script>";
     exit();
}
else if(($_SESSION['prihlasen'] == 1)&($_SESSION['is_admin'] == 1))
{
    echo "Prihlasen je admin";	
    //exit("<script>location.href='admin.php';</script>");
}
else if($_SESSION['prihlasen'] == 1)
{
    echo "Prihlasen je user";	
    //exit("<script>location.href='layout.php';</script>");
}
else
{
	die("Nebyla nastavena session");
}
}


Problém nastává v tu chvíli, kdy je vrácená hodnota
Ať už vyplním login korektně pro admina, nebo zadám nesmysly, vždy se mi přihlásí jako user, tzn session je nastavena na
$_SESSION['prihlasen'] == 1

Netuší někdo prosím kde by mohla být chyba?
Nebo zda by pomohlo ověřovat počet vrácených řádků z dotazu?

Díky za jakoukoliv radu
AM_
Profil
session_register je zastaralá, není nutné ji používat. ano, výsledek query musíš někam uložit, a pak je to mysql_num_rows($result).
Mastodont
Profil
V manuálu PHP je jasně napsáno:
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().
Čili ty první dva řádky vykopni a nahlas, co to dělá.
gardener
Profil
//session_register("prihlasen");
//session_register("is_admin");

Jsem vykopnul a chová se to stejně...tipoval bych že problém bude s tím sql dotazem?
gardener
Profil
AM_
Jenže s tím vyvstává problém ten, že bych musel dotaz provést na začátku fce, uložit do proměnné a na tu pak zavolat numrows, jenže jak to vyřešit s druhým dotazem? To snad jedině pomocí vnořené podmnínky?
gardener
Profil
Tzn. nějak takto:
    $dotaz=mysql_query("select surname,password,jeadmin from users where surname='".$surname."' and password='".$password."'and jeadmin='1' ");
    if(mysql_num_rows($dotaz)!=0)
   {
      $_SESSION['prihlasen'] = 1;     
	   $_SESSION['is_admin'] = 1;
      return true;
  }
Mastodont
Profil
 if(mysql_query("select ...

Jak již bylo řečeno, musíš použít ještě mysql_num_rows($result), protože mysql_query vrátí result, ne počet záznamů.
EDIT - Aha, pozdě.
AM_
Profil
gardener
no, jako jo. Ono taky ověřovat všechno jen přes WHERE je dost nešikovné. spíš si dej select jeadmin from users where... a pak v tom výsledku ověřuj, jestli jeadmin nebo neniadmin, posílat takovéto 2 dotazy do DB je dost neefektivní...
gardener
Profil
Jenže to vrací warning [pre]mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\Registrace\functions.php on line 6[/pre]

S tím že i pokud zadám správné hodnoty, tj. musí dotaz vrátit řádek, přihlásí se jako user...což je špatně.
gardener
Profil
AM_
Mohl by jsi tu myšlenku rozvést, to jako, že bych to mohl vyřešit pomocí jednoho dotazu?
AM_
Profil
$q = mysql_query("SELECT jeadmin FROM users WHERE username='$username' AND password='$password'");
if (mysql_num_rows($q) > 0){
  list($jeadmin) = mysql_fetch_row($q);
  if ($jeadmin){
    //prihlasen admin
  } else {
    //prihlasen user
  }
} else {
//neprihlasen nikdo
}

Jestli ti to vrací supplied argument is not valid, tak máš chybu v tom dotazu, vyjeď si po tom dotazu mysql_error();
gardener
Profil
Změnil jsem v dotazu název sloupce proto ten warning, nicméně když použiji tvoji fci, tak i při zadání správných údajů se "přihlášení" neprovede viz:

<?php
function overeni ($surname, $password){
    $_SESSION['prihlasen'] = 0;
    $_SESSION['is_admin'] = 0;
 $q = mysql_query("SELECT isadmin FROM users WHERE surname='$surname' AND password='$password'");
if (mysql_num_rows($q) > 0){
  list($jeadmin) = mysql_fetch_row($q);
  if ($jeadmin){
    $_SESSION['prihlasen'] = 1;
    $_SESSION['is_admin'] = 1;
  } else {
    $_SESSION['prihlasen'] = 1;
  }
} else {
 $_SESSION['prihlasen'] = 0;
}
}

?>


Říkám si, jestli by nebylo lepší udělat samostatnou tabulku pro admina...
gardener
Profil
Tak problém vyřešen
Po po kontrole error_reporting(E_ALL);
Jsem zjistil, volání nedefinované proměnné, username, místo surname.
Tzn, že nyní je to vyřešeno a funguje to:

Tzn, výsledná fce bude vypadat takto:

<?php
function overeni ($surname, $password){
    $_SESSION['prihlasen'] = 0;
    $_SESSION['is_admin'] = 0;
 $q = mysql_query("SELECT isadmin FROM users WHERE surname='$surname' AND password='$password'");
if (mysql_num_rows($q) > 0){
  list($jeadmin) = mysql_fetch_row($q);
  if ($jeadmin){
    $_SESSION['prihlasen'] = 1;
    $_SESSION['is_admin'] = 1;
  } else {
    $_SESSION['prihlasen'] = 1;
  }
} else {
 $_SESSION['prihlasen'] = 0;
}
}

?>


Díky všem a především AM_ za pomoc, a příště si zapnu reportování chyb rovnou na začátku...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: