Avatar billede nolsen89 Juniormester
30. maj 2016 - 23:35 Der er 7 kommentarer og
1 løsning

admin side check userid og admin status

hej jeg har denne auth kode på min admin side:

<?php
session_start();
if(isset($_SESSION["userId"])){
}else{
    header('Location: ../index.php');
}
?>

men jeg ønsker og ha 2 check i mit isset(), så den både check imod userId, samt om status er li med 1 fra min table..

<?php
session_start();
$userId = $_SESSION["userId"];
if($result = $db->query("SELECT * FROM Users WHERE id = '$userId'")) {
if($result->num_rows) {
if($row = $result->fetch_object()) {
    $status = $row->status;
}
}
$result->free();
}
?>

men får bare op denne fejlmelding

Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /customers/4/8/3/os-dart.no/httpd.www/test/admin/index.php on line 17
Avatar billede olsensweb.dk Ekspert
31. maj 2016 - 00:19 #1
hurtig tanke, du kunne ligge din $userId op i toppen, og checke på din status længere nede


du mangler også exit efter header('Location:......, hvilke forhindre resten af siden indlæsses, selv om den ikke bruges


(utested)
[code]
<?php
session_start();
$url_return = "../index.php";
if(isset($_SESSION["userId"])){
    $userId = $_SESSION["userId"];
}
else{
    header('Location:'.$url_return );
    exit();
}


if($result = $db->query("SELECT * FROM Users WHERE id = '$userId'")) {
    if($result->num_rows) {
        if($row = $result->fetch_object()) {
            $status = $row->status;
        }
    }
    $result->free();
}

if($status !== 1){
    // ikke admin rettigheder
    header('Location:'.$url_return );
    exit();
}
?>
[/code]

code taget er nok ikke blevet bedre på det nye eksperten, men det skal lige prøves
Avatar billede nolsen89 Juniormester
31. maj 2016 - 08:51 #2
tak for svaret, fik dog en feil på siden..

Fatal error: Uncaught Error: Call to a member function query() on null in /customers/4/8/3/os-dart.no/httpd.www/test/admin/index.php:13 Stack trace: #0 {main} thrown in /customers/4/8/3/os-dart.no/httpd.www/test/admin/index.php on line 13
Avatar billede olsensweb.dk Ekspert
31. maj 2016 - 09:07 #3
>Fatal error: Uncaught Error: Call to a member function query()
lyder som om du ikke har en database connection ( den du kalder $db )
Avatar billede nolsen89 Juniormester
31. maj 2016 - 09:29 #4
nu virker det, men den kører header uanset om jeg har status 0 eller 1..
Avatar billede olsensweb.dk Ekspert
31. maj 2016 - 09:43 #5
>men den kører header uanset om jeg har status 0 eller 1..
er 1 en int eller en string ??

det der testes for er om den er tallet 1 ( en int )
prøv at lave denne
if($status !== 1){

om til
if($status != 1){
Avatar billede nolsen89 Juniormester
31. maj 2016 - 09:47 #6
jeg har et enum i min table med 0, 1, 2 så jeg tro det er int eller hvad??
Avatar billede nolsen89 Juniormester
31. maj 2016 - 09:50 #7
det hjalp med != istedet for !==..
tak for løsningen..

er dette en sikker løsning til en admin side eller findes der en bedre løsning??
Avatar billede olsensweb.dk Ekspert
31. maj 2016 - 10:22 #8
enum er sin helt egen datatype

=== / !== lavet netop også test af datatype.

så i if($status !== 1)  testes om $status ikke er ligmed værdien 1 datatypen int


>er dette en sikker løsning til en admin side eller findes der en bedre løsning??
rimelig sikker, du kan sikkert finde andre løsninger, når du gør så brug den der passer dig bedst

jeg tror jeg ville bruge Prepare Statement i SQL, og bindeparam $userId. istedet for direkte $_POST / $_GET værdier i SQL.

>$userId = $_SESSION["userId"];
ville jeg lave om til
$userId = (int) $_SESSION["userId"];
da jeg antager $userId er en integer, så sender du andet over ens int, bliver det typecasted til int, så du her får en grov afvaskning af dine data.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester