IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Rozdílné menu podle typu uživatele v PHP

Aktivity
Avatar
Jan D
Člen
Avatar
Jan D:26.12.2021 0:36

Ahoj. Potřeboval bych poradit. Lámu si tu hlavu už docela dlouho nad možností různého menu na webové stránce podle toho jaký je přihlášený uživatel (v PHP). Zkoušel jsem to jak pomocí switch / case, tak i pomocí podmínek if, ale nějak mi to pořád né a né fungovat. V databázi mám u každého uživatele pole char(1), kde mám různé hodnoty a podle nich bych chtěl, aby to každému přihlášenému uživateli podle této hodnoty nabídlo v záhlaví příslušnou menu nabídku. Zkoušel jsem už různé kombinace a to jak podmínek, tak formátu hodnot a pořád nic.
Proto jsem se chtěl zeptat jestli nemáte někdo nějakou zaručenou variantu, jak to udělat jednoduše a aby to fungovalo ?
Díky

 
Odpovědět
26.12.2021 0:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.12.2021 8:18

No, to ti muzeme tezko poradit, kde mas v kodu chybu, kdyz sis ho nechal pro sebe. Ani nemame tuseni, jakym zpusobem vypisujes menu. Jako, klidne to muzes includovat.

<?php
// --- menu.php ---
function menu($prava = 'quest')
{
if ($prava=='uzivatel') {include 'soubor1.htm';}
if ($prava=='admin') {include 'soubor2.htm';}
if ($prava=='editor') {include 'soubor3.htm';}
if ($prava=='uzivatel') {include 'soubor4.htm';}
}
//---
?>

<?php
// --- index.php ---
include 'menu.php';
$prava = 'uzivatel';
menu($prava);
//---
?>
Editováno 26.12.2021 8:19
 
Nahoru Odpovědět
26.12.2021 8:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.12.2021 11:38

A mimochodem, nez polozis dotaz sem, poloz dotaz googlu. Treba si usetris spustu casu... behem 20 min se da zkouknout treba 100 moznosti. Nic z toho se ti nelibilo?
google = php menu navigation / About 2,630,000,000 results (0.69 seconds)
google = php menu by user permissions / About About 163,000,000 results (0.69 seconds)
google = php include menu by user roles / About 904,000,000 results (0.69 seconds)
google = php include menu by user roles school example
https://www.youtube.com/watch?…
Krasne videjko. Resi to pomoci databaze. Coz si muzes upravit podle sebe na neco jineho.

 
Nahoru Odpovědět
26.12.2021 11:38
Avatar
Jan D
Člen
Avatar
Odpovídá na Peter Mlich
Jan D:26.12.2021 20:51

Ahoj Peter. Děkuji za příklad a google nápovědu. Samozřejmě jsem se to snažil googlit, ale když někdo (já) zadává špatný dotaz k vyhledání, tak vyjedou výsledky, který mi až tolik nepomohli.
Kód jsem si zatim nechal "pro sebe", protože jsem si říkal, že někdy je lepší raději začít od nuly než se přehrabovat ve "zmatku" :-)
Zatím díky za nápovědu a případně doplním o konkrétní kód.

 
Nahoru Odpovědět
26.12.2021 20:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.12.2021 9:03

No, ale, kdyz nedas kod, tak neni na cem stavet, neni mozne ti v nem najit chybu a psat vlastni je prace navic. Vlastni vedomosti obvykle touzime zpenezit. Jinak by asi bylo lepsi jit kopat tunely, ne?

 
Nahoru Odpovědět
27.12.2021 9:03
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.12.2021 10:22

Jakoze, poradit najit chybu je jedna vec, jina udelat to cele za tebe.

 
Nahoru Odpovědět
27.12.2021 10:22
Avatar
Jan D
Člen
Avatar
Odpovídá na Peter Mlich
Jan D:28.12.2021 0:16

Rozhodně to nechci, aby to udělal někdo za mě ;-) Šlo mi jenom o nějaký základní typ.
Každopádně jsem tedy "vyzobal" kód a nechal to podstatné a přikládám. Mám možná trochu podezření i na typ proměnné "spravce", která nabývá hodnoty buď 0 nebo 1 (v základu).

<?
session_start();
require "./func.php";
if ($_GET["a"]=="logout")
{
  unset($_SESSION["id"]);
}
elseif ($_GET["a"]=="login" or isset($_SESSION["id"]))
{
  $link=mysqli_connect("localhost", "user", "pass");
  mysqli_select_db($link,"database");

  if (isset($_POST["odesli"])) {
  $id = iduzivatele($_POST["jmeno"], $_POST["heslo"], $link);
  if ($id<>0) $_SESSION["id"]=$id;
  $spravce = pravauzivatele($_POST["jmeno"], $_POST["heslo"], $link);
  }
}
?>

<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>

  <body class="size-1140">
    <!-- HEADER -->
    <header role="banner">
      <!-- Top Navigation -->
            <? switch ($spravce) {

        case "1":
           {
              print '<li><a href="#">Admin funkce</a>';
              print '   <ul>';
              print '   </ul>';
              print '</li>';
              break;
            }

        case "0":
            {
            print '<li><a href="index.php?a=strana1">Strana 1</a></li>';
            print '<li><a>Info</a>';
            print '     <ul>';
            print '     </ul>';
            print '</li>';
            break;
          }

        default:
            {
            print '<li><a href="index.php?a=uvod">Úvod</a></li>';
            print '<li><a href="index.php?a=contacts">Kontakty</a></li>';
            print '<li><a href="index.php?a=login">Přihlášení</a></li>';
            break;
          }
        }
            ?>
    </header>
  </body>
</html>




<!-- func.php -->
<?php
function iduzivatele ($jmeno, $heslo, $link)
{
  $vysledek = mysqli_query($link, "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'");
  if (mysqli_num_rows($vysledek)== false)
    return false;
  else {
    $radek = mysqli_fetch_array($vysledek);
    return $radek["id"];
  }
}

function pravauzivatele ($jmeno, $heslo, $link)
{
  $vysledek = mysqli_query($link, "SELECT spravce FROM Users WHERE email_rodic='".$jmeno."' and heslo='".$heslo."'");
  if (mysqli_num_rows($vysledek)== false)
    return false;
  else {
    $radek = mysqli_fetch_array($vysledek);
    return $radek["spravce"];
    // return $vysledek;
  }
}
?>
 
Nahoru Odpovědět
28.12.2021 0:16
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.12.2021 10:11
  • pis php kod pred html kodem
  • nevypisuj primo, pouzivej promene a jejich obsah vypis az na miste

"Mám možná trochu podezření i na typ proměnné "spravce""
Tak si to vypis tam, kde to pouzivas. var_dump($spravce);


function sqlRow($link, $query)
{
  if (!$link || !$query)
    return false;
  $vysledek = mysqli_query($link, $query);
  if (mysqli_num_rows($vysledek)== false)
    return false; // return ukoncuje, takze neni treba psat else, ale muzes ho tam mit, pro tvoji vetsi prehlednost
  return mysqli_fetch_assoc($vysledek); // tady ti staci fetch_assoc misto fetch_array
}

function iduzivatele ($jmeno, $heslo, $link)
{
  $radek = sqlRow($link, "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'");
  return $radek["id"] || false;
}

function pravauzivatele ($jmeno, $heslo, $link)
{
  $radek = sqlRow($link, "SELECT spravce FROM Users WHERE email_rodic='".$jmeno."' and heslo='".$heslo."'");
  return $radek["spravce"] || false;

Ja bych si pred ten radek pridal var_dump. Bez nalogovani je to pradzne a po nalogovani, kdo vi.

<?php var_dump('$spravce=', $spravce, '$_SESSION=', $_SESSION); ?>
            <? switch ($spravce) {

======
Jinak, v tom kodu je nekolik kritickych chyb.

  • Treba, proc se 'login' vytahuje z GET? Udaje z POST? Formular se da odeslat post nebo get. Oboje naraz nemusi vzdy fungovat. Pokud se uzivatel loguje pres $_GET["a"]=="login", pak je divne, ze jmeno a heslo ctes jako $_POST["jmeno"]
  • pokud se uzivatel loguje, a login se nezdari, zustane nalogovany predchozi uzivatel. Ja bych ocekaval, ze se smaze vsechen login a nebude prihlasen nikdo.
  • Pokud jsem hacker, tak mi staci zmenit udaj v session, id uzivatele na jine, abych ziskal prava admina a uplnou kontrolu nad systemem?
  • Pokud jsem hacker, staci mi zasat spravny udaj do loginu, abych ti naboural sql dotazy. Prvni vec, kterou zkousi. Maji na to program, co takhle vyzkousi vsechna policka.
iduzivatele($_POST["jmeno"], $_POST["heslo"], $link);
 ---> "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'" // to tam davas primo z post

$jmeno = " ' OR ' '=' "; // pokud zadam tohle do policka pro jmeno, s temi apostrofy...
$heslo = " ' OR ' '=' ";
SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'
SELECT id FROM Users WHERE jmeno=' ' OR ' '=' ' and heslo=' ' OR ' '=' ' -- a to je totez jako
SELECT id FROM Users WHERE false OR (true AND false) OR true
SELECT id FROM Users WHERE false OR false OR true
SELECT id FROM Users WHERE true -- a to ti vrati prvniho uzivatele a pokud je admin... :)

$jmeno = $heslo = " ' OR 1=1 AND id=5 OR 1='";
SELECT id FROM Users WHERE jmeno=' ' OR 1=1 AND id=5 OR 1='' and heslo=' ' OR 1=1 AND id=5 OR 1='' -- a to je totez jako
SELECT id FROM Users WHERE false OR true AND id=5 OR false AND false OR true AND id=5 OR false
SELECT id FROM Users WHERE true AND id=5 OR false OR true AND id=5
SELECT id FROM Users WHERE true AND id=5
SELECT id FROM Users WHERE id=5 -- takze se muze nalogovat na jakehokoliv uzivatele

Nesmis zkratka do sql dotazu cpat promene bez osetreni.
Ja vim, v dokumentaci se to neresi, ale ta je taky stara 20 let. Vsude jinde, googlem, bys nasel priklady, kde na to upozornuji a pouzivaji str_replace.

$a = str_replace("'", "\'" $a); // nahradi apostrof ' za \' ... nebo
$a = mysqli_real_escape_string($a);

https://www.php.net/…e-string.php
google = mysqli escape value for query

 
Nahoru Odpovědět
28.12.2021 10:11
Avatar
Jan D
Člen
Avatar
Odpovídá na Peter Mlich
Jan D:28.12.2021 11:09

Díky za postřehy, to s tím nezabezpečeným logováním, toho jsem si vědom. Měl jsem právě nějaký starší kód a zatim si právě hraju s tím rozdílným menu a na to zabezpečení se chystám potom (možná špatný postup, ale snažim se nejprve vyladit jednu věc a pak jdu na další :-) )
Jinak k tomu: "pis php kod pred html kodem" - to se vztahuje i na ten switch() ?
Pokud to bylo na ty funkce, tak ty mam v separátnim souboru a jenom jsem je nešikovně přidal na konec.

 
Nahoru Odpovědět
28.12.2021 11:09
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.12.2021 16:53

Jako, pis si to, jak chces, ale ja to pisi na jedno misto. Vyrobim vystupy a ty pak zobrazuji uz hotove. Bude to pak pekne oddelene, program a html kod.
S temi strankami ti to nefungovalo, tak jsi mohl resit to ostatni, mezitim :)

 
Nahoru Odpovědět
29.12.2021 16:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.