Diskuze: Zvláštní chování kódu

PHP PHP Zvláštní chování kódu American English version English version

Avatar
Martin Štěpánek (Enormyk):

Ahoj,
už nad svým kódem sedím nějakou dobu a pořád nemohu najít chybu, kterou jsem tam někde zanechal. Je mi jasné, že se jedná o něco absurdního a jen já to nevidím, proto bych prosil o pomoc. :-)

Mám administraci a u každého uživatele si uchovávám, jaké má oprávnění k sekcím. Ukládám ho do jedné buňky stylem "člen, korektor". Při přihlašování si následující řetězec před funkci explode rozdělím na pole podřetězců.

$_SESSION['prava'] = explode(', ', $uzivatel['prava']);

Poté vypisuje menu, podle oprávnění, které mají. Uvědomuji si, že by to mohlo jít i přes vícerozměrná pole, ale takto mi to více vyhovuje:

<?php
$stranky = array(
    'Statistiky',
    'K vydání',
    'Všechny články',
    'Všechny recenze',
    'Galerie',
    'Ocenění',
    'Záznamy',
    'Databáze',
    'Oznámeni',
    'Seznam uživatelů',
    'Rubriky',
);

$odkazy = array(
    'statistika',
    'vydani',
    'vsechnyclanky',
    'vsechnyrecenze',
    'galerie',
    'oceneni',
    'zaznamy',
    'databaze',
    'oznameni',
    'seznam',
    'rubriky',
);

$prava = array( //zatím jsem k samostatným sekcím nedával speciální oprávnění, proto všechny mají "admin"
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
);

$ikony = array(
    'bar-chart',
    'newspaper-o',
    'file-text',
    'book',
    'picture-o',
    'trophy',
    'bars',
    'database',
    'bell',
    'users',
    'list',
);
?>

Zde vypisuji menu cyklem:

                            <?php
                            for ($i = 0; $i < count($stranky); $i++) {
                                if (in_array($prava[$i], $_SESSION['prava'])) {
//ověří jestli v poli $_SESSION['prava'] se nachází dané oprávnění
                                    echo'<li>';
                                    echo'<a href="index.php?stranka=' . $odkazy[$i] . '">';
                                    echo'<span class="fa fa-' . $ikony[$i] . '"></span> ';
                                    echo$stranky[$i];
                                    echo'</a>';
                                    echo'</li>';
                                }
                            }
                            ?>

Kód jak se zdá funguje, problém je jinde. Po načtení této stránky se mi změní obsah $_SESSION['prava'], ale nechápu, kde k přepisu dochází.
Před spuštěním tohoto scriptu je výpis pole následující:

Array ( [0] => člen [1] => korektor [2] => admin )

Po spuštění je toto:

Array ( [0] => admin [1] => admin [2] => admin [3] => admin [4] => admin [5] => admin [6] => admin [7] => admin [8] => admin [9] => admin [10] => admin )

Předem děkuji za pomoc. :-)

Editováno 26. května 20:09
Odpovědět 26. května 20:06
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Marek Z.:

Kde všude definuješ

$_SESSION['prava']

?

Nahoru Odpovědět 26. května 20:17
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Martin Štěpánek (Enormyk):

No jen při tom přihlášení, jak už jsem uvedl a pak už to nikde neměním. To je právě to, co mne tak zaráží. Hlavně se to mění jen po spuštění tohoto scriptu, nikde jinde problém není. :-D

Nahoru Odpovědět 26. května 20:35
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Marek Z.:

Můžeš dodat celej kód té stránky?

Nahoru Odpovědět 26. května 22:11
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Martin Štěpánek (Enormyk):

No stránka je tato:

<?php
session_start();

function nactiTridu($trida) {
    require("../tridy/$trida.php");
}

spl_autoload_register("nactiTridu");

mb_internal_encoding("UTF-8");
Db::pripoj();

if (!in_array('admin', $_SESSION['prava']) or ! isset($_SESSION['uzivatel_id'])) {
    session_destroy();
    Header('Location: ../../index.php');
    exit();
}

$stranky = array(
    'Statistiky',
    'K vydání',
    'Všechny články',
    'Všechny recenze',
    'Galerie',
    'Ocenění',
    'Záznamy',
    'Databáze',
    'Oznámeni',
    'Seznam uživatelů',
    'Rubriky',
);

$odkazy = array(
    'statistika',
    'vydani',
    'vsechnyclanky',
    'vsechnyrecenze',
    'galerie',
    'oceneni',
    'zaznamy',
    'databaze',
    'oznameni',
    'seznam',
    'rubriky',
);

$prava = array(
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
);

$ikony = array(
    'bar-chart',
    'newspaper-o',
    'file-text',
    'book',
    'picture-o',
    'trophy',
    'bars',
    'database',
    'bell',
    'users',
    'list',
);
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
        <meta name="description" content="Redakce spolku literárních fanatiků.">
        <link rel="shortcut icon" href="../img/ikona.ico">
        <link rel="stylesheet" href="../styl.css" type="text/css">
        <script type="text/javascript" src="../script.js"></script>
        <title>Redakce - Admin</title>
    </head>
    <body>
        <style type="text/css">
            a{
                color: #528be0;
            }

            a:hover{
                color: #73A2E6;
            }

            #menu li{
                background-color: #528be0;
            }

            #menu li:hover{
                background-color: #73A2E6;
            }
        </style>
        <nav id="hlavni">
            <ul>
                <li><a href="../index.php?stranka=oznameni">
                        <?php
                        $oznameni = new Oznameni();
                        $data = $oznameni->zjisti();
                        if (!empty($data)) {
                            echo'<span class="fa fa-bell fa-2x"></span>';
                        } else {
                            echo'<span class="fa fa-bell-o fa-2x"></span>';
                        }
                        $zpravy = new Zpravy();
                        $data = $zpravy->zjisti();
                        if (!empty($data)) {
                            echo'<li><a href="../index.php?stranka=zpravy"><span class="fa fa-envelope fa-2x"></span></a></li>';
                        } else {
                            echo'<li><a href="../index.php?stranka=zpravy"><span class="fa fa-envelope-o fa-2x"></span></a></li>';
                        }
                        ?>
                    </a>
                </li>
                <li><a href="../index.php?stranka=profil"><span class="fa fa-user fa-2x"></span></a></li>
                <li><a href="../index.php"><span class="fa fa-sign-out fa-2x"></span></a></li>
            </ul>
        </nav>

        <article>
            <?php
            if (isset($_GET['stranka'])) {
                ?>
                <div id="levy-sloupec">
                    <nav id="menu">
                        <li><a href="../index.php">Redakce</a></li>
                        <ul>
                            <li><a href="index.php">Hlavní strana</a></li>
                            <?php
                            for ($i = 0; $i < count($stranky); $i++) {
                                $pravaex = explode(', ', $prava);
                                for ($j = 0; $j < count($pravaex); $j++) {
                                    if (in_array($pravaex[$j], $_SESSION['prava'])) {
                                        $provereno = 'ano';
                                    } else {
                                        $provereno = 'ne';
                                    }
                                }
                                if ($provereno == 'ano') {
                                    echo'<li>';
                                    echo'<a href="index.php?stranka=' . $odkazy[$i] . '">';
                                    echo'<span class="fa fa-' . $ikony[$i] . '"></span> ';
                                    echo$stranky[$i];
                                    echo'</a>';
                                    echo'</li>';
                                }
                            }
                            ?>
                        </ul>
                    </nav>
                </div>
            <?php } ?>
            <section>
                <?php
                if (isset($_GET['stranka'])) {
                    $stranka = $_GET['stranka'];
                } else {
                    $stranka = 'index';
                }
                if (preg_match('/^[a-z0-9]+$/', $stranka)) {
                    $vlozeno = include('stranky/' . $stranka . '.php');
                    if (!$vlozeno) {
                        echo('Podstránka nenalezena');
                    }
                } else {
                    echo('Neplatný parametr.');
                }
                ?>
            </section>

        </article>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
    </body>
</html>

Poté jako hlavní stránku vkládám stránku z stranky/index.php:

<style type="text/css">
    @media all and (min-width: 100px){
        section{
            width: 100%;
            margin: 0;
            padding: 0;
        }

        a{
            display: block;
            width: 100%;
            text-align: center;
            margin-bottom: 30px;
            color: #528be0;
        }

        a:hover{
            color: #73A2E6;
        }
    }
    @media all and (min-width: 400px){
        a{
            width: 50%;
            float: left;
        }
    }
    @media all and (min-width: 600px){
        a{
            width: 30%;
        }
    }
    @media all and (min-width: 1000px){
        a{
            width: 20%;
        }
    }
</style>
<?php
for ($i = 0; $i < count($stranky); $i++) {
    $pravaex = explode(', ', $prava);
    for ($j = 0; $j < count($pravaex); $j++) {
        if (in_array($pravaex[$j], $_SESSION['prava'])) {
            $provereno = 'ano';
        } else {
            $provereno = 'ne';
        }
    }
    if ($provereno == 'ano') {
        echo'<a href="index.php?stranka=' . $odkazy[$i] . '">';
        echo'<span class="fa fa-' . $ikony[$i] . ' fa-5x"></span><br>';
        echo$stranky[$i];
        echo'</a>';
    }
}
?>

PS: ten scritp pro zjištění práv jsem teď trochu upravil, aby se do něj dalo zapsat více druhů práv, ale i přesto problém přetrvává.

Editováno 27. května 8:10
Nahoru Odpovědět 27. května 8:09
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Marek Z.:

Zde vidím ověření té proměnné, ale stále nevidím její definování.

Můžeš ještě ukázat jak provádíš přihlašování při, kterém ji vlastně definuješ?

Nahoru Odpovědět 27. května 12:26
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Martin Štěpánek (Enormyk):
if ($_POST) {
    $uzivatel = Db::queryOne('
                SELECT *
                FROM uzivatele
                WHERE mail=? AND heslo=SHA1(?)
        ', $_POST['mail'], $_POST['heslo'] . "neuvedenaSul");
    if (!$uzivatel)
        $zprava = 'Neplatné uživatelské jméno nebo heslo.';
    else {
        $_SESSION['uzivatel_id'] = $uzivatel['id_uzivatele'];
        $_SESSION['jmeno'] = $uzivatel['jmeno'];
        $_SESSION['prijmeni'] = $uzivatel['prijmeni'];
        $_SESSION['kolej'] = $uzivatel['kolej'];
        $_SESSION['uzivatel_mail'] = $_POST['mail'];
        $_SESSION['prava'] = explode(', ', $uzivatel['prava']);
        setcookie($_SESSION['jmeno_navstevnika'], $_SESSION['jmeno'].' '.$_SESSION['prijmeni'], time()+3600*24*30);
        header('Location: ../index.php');
        exit();
    }
}

Poté na celém webu přetrvává, jen u tohohle scriptu se záhadně mění :-)

Nahoru Odpovědět 27. května 14:14
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Marek Z.:

Mno to mě opravdu také zaráží, nikde nic nevidím. Vážně je toto vše? Musí se ta hodnota někde přepsat a zde vůbec nevidím, že by k tomu došlo až po přihlášení tedy. :/

Nahoru Odpovědět 27. května 14:50
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Martin Štěpánek (Enormyk):

Alespoň vím, že nejsem jediný :-D Nikde tu proměnnou vůbec neupravuji, po přihlášení se vytvoří a poté už s ní nic nedělám. :-)

Nahoru Odpovědět 27. května 15:21
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Jiří Gracík:

Smaže se jenom ta položka s právy nebo celá session? Dal bych si pozor na řádky se session destroy.

Nahoru Odpovědět 27. května 16:52
Creating websites is awesome till you see the result in another browser ...
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Martin Štěpánek (Enormyk)
Jiří Gracík:

A nezapomeň, že vardump je v php tvůj jediný opravdový kamarád :D Dej ho tam, kde to určitě funguje a tam, kde už to nefunguje a postupně je posouvej k sobě.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 27. května 16:55
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Jiří Gracík
Martin Štěpánek (Enormyk):

Ne, ono to jenom přepíše ty prava, nic jiného to nezmění ani nesmaže :-)
z:

Array ( [0] => člen [1] => korektor [2] => admin )

to udělá:

Array ( [0] => admin [1] => admin [2] => admin [3] => admin [4] => admin [5] => admin [6] => admin [7] => admin [8] => admin [9] => admin [10] => admin )
Nahoru Odpovědět 27. května 17:03
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Odpovídá na Jiří Gracík
Martin Štěpánek (Enormyk):

tak nevím proč to dělá toto :

var_dump($_SESSION['prava']);
$prava = array(
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
    'admin',
);
var_dump($_SESSION['prava']);

nechápu jak $prava může přepsat $_SESSION['prava']; :-D

Nahoru Odpovědět 27. května 17:07
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Odpovídá na Jiří Gracík
Martin Štěpánek (Enormyk):

tak jsem přejmenoval $prava na $prav a funguje to :-D
to by se mohlo zařadit do Akta X :-D

Nahoru Odpovědět  +2 27. května 17:15
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Jiří Gracík
TomasGlawaty:

Ale ještě lepší kamarádi jsou PhpStorm s XDebugem ;)

Nahoru Odpovědět  +2 27. května 18:46
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Odpovídá na TomasGlawaty
Dominik Gavrecký:

Xdebug ? Povieš mi niečo o ňom ?

Nahoru Odpovědět 27. května 19:20
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Dominik Gavrecký
TomasGlawaty:

Je to php extension pro debuggování. Označíš si v kódu breakpoint a když se script spustí a dojde k tomuto breakpointu, tak se zastaví a čeká na tvoji reakci. Ty si můžeš prohlédnou všechny proměnné, co obsahují a krokovat si dále jak script pokračuje, "skákat" do funkcí atd. K tomu je potřeba samozřejmě pořádné IDEčko, alespoň NetBeans, ale doporučuji rozhodně PhpStorm.
Druhá věc je, že XDebug zpomaluje běh php scriptů, takže je fajn ho mít vypnutý a zapínat ho až jak je potřeba.
Pokud tě to zajímá, tady je například (ikdyž starší) článek od Filipa Procházky:
Debuggujeme s PhpStormem
Často si už bez něho vývoj ani nedovedu představit, hlavně pokud musí člověk fixovat chyby a zejména po jiných programátorech :)

Nahoru Odpovědět 27. května 19:49
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Odpovídá na TomasGlawaty
Martin Štěpánek (Enormyk):

jo já Phpstorm mám, ale ještě jsem se na něj nezvykl, tak pořád používám ověřený Netbeans - po tomhle to už udělám :-D

Nahoru Odpovědět 27. května 21:22
Nesnáším, když někdo u if nepoužívá {}, byť se jedná o jeden řádek.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na TomasGlawaty
Jiří Gracík:

Málokdo má koupený PhpStorm :D Ale jo, to je ta lepší varianta

Nahoru Odpovědět  +2 27. května 21:24
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Jiří Gracík
Dominik Gavrecký:

My ako študenti ho máme FREE :) Ale myslím že stojí za to do neho investovať ...

Nahoru Odpovědět  +2 27. května 21:42
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Dominik Gavrecký
Jiří Gracík:

My ako študenti ho ale i tak nemůžeme používat komerčně :)

Nahoru Odpovědět  +1 28. května 0:16
Creating websites is awesome till you see the result in another browser ...
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Dominik Gavrecký
Jiří Gracík:

A ano, určitě se vyplatí si ho koupit, ale 3.5 tisíce je holt 3.5 tisíce :D

Nahoru Odpovědět 28. května 0:23
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Jiří Gracík
Dominik Gavrecký:

Dobre ale ak si to prirovnáš k tomu koľko času ti to dokáže ušetriť tak 3,5 k pre programátora je si myslím nič...

Nahoru Odpovědět  +1 28. května 0:24
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Jiří Gracík
Dominik Gavrecký:

Priemerný plat pre programátora je niečo okolo 50 000 ak sa nemýlim vychádzam z toho čo tu písal Dávid. Licenciu zakúpiš na jeden rok čo mám teda 3 500 pri 600 000 je to mizíva suma ak si pomyslím koľko času to dokáže ušetriť mne a to ho ešte ani neviem poriadne používať.

Nahoru Odpovědět 28. května 0:33
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Dominik Gavrecký
Jiří Gracík:

Pokud máš stabilní plat 50 tisíc, pak jsi nejspíš někde zaměstnaný a je ti to nejspíš jedno. Pokud děláš sám na sebe, tak je to trochu o něčem jiném :)

Nahoru Odpovědět  +2 28. května 10:08
Creating websites is awesome till you see the result in another browser ...
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 25 zpráv z 25.