NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Martin Štěpánek :26.5.2016 20:06

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.5.2016 20:09
Odpovědět
26.5.2016 20:06
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Martin Štěpánek
Uživatel sítě :26.5.2016 20:17

Kde všude definuješ

$_SESSION['prava']

?

Nahoru Odpovědět
26.5.2016 20:17
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Martin Štěpánek :26.5.2016 20:35

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.5.2016 20:35
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Martin Štěpánek
Uživatel sítě :26.5.2016 22:11

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

Nahoru Odpovědět
26.5.2016 22:11
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Martin Štěpánek :27.5.2016 8:09

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.5.2016 8:10
Nahoru Odpovědět
27.5.2016 8:09
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Martin Štěpánek
Uživatel sítě :27.5.2016 12:26

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.5.2016 12:26
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Martin Štěpánek :27.5.2016 14:14
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.5.2016 14:14
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Martin Štěpánek
Uživatel sítě :27.5.2016 14:50

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.5.2016 14:50
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Martin Štěpánek :27.5.2016 15:21

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.5.2016 15:21
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Martin Štěpánek
Neaktivní uživatel:27.5.2016 16:52

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.5.2016 16:52
Neaktivní uživatelský účet
Avatar
Odpovídá na Martin Štěpánek
Neaktivní uživatel:27.5.2016 16:55

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.5.2016 16:55
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Štěpánek :27.5.2016 17:03

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.5.2016 17:03
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Neaktivní uživatel
Martin Štěpánek :27.5.2016 17:07

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.5.2016 17:07
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Neaktivní uživatel
Martin Štěpánek :27.5.2016 17:15

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
27.5.2016 17:15
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Neaktivní uživatel
TomasGlawaty:27.5.2016 18:46

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

 
Nahoru Odpovědět
27.5.2016 18:46
Avatar
Odpovídá na TomasGlawaty
Dominik Gavrecký:27.5.2016 19:20

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

Nahoru Odpovědět
27.5.2016 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:27.5.2016 19:49

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.5.2016 19:49
Avatar
Odpovídá na TomasGlawaty
Martin Štěpánek :27.5.2016 21:22

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.5.2016 21:22
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na TomasGlawaty
Neaktivní uživatel:27.5.2016 21:24

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

Nahoru Odpovědět
27.5.2016 21:24
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Dominik Gavrecký:27.5.2016 21:42

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

Nahoru Odpovědět
27.5.2016 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
Odpovídá na Dominik Gavrecký
Neaktivní uživatel:28.5.2016 0:16

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

Nahoru Odpovědět
28.5.2016 0:16
Neaktivní uživatelský účet
Avatar
Odpovídá na Dominik Gavrecký
Neaktivní uživatel:28.5.2016 0:23

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.5.2016 0:23
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Dominik Gavrecký:28.5.2016 0:24

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
28.5.2016 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 Neaktivní uživatel
Dominik Gavrecký:28.5.2016 0:33

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.5.2016 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
Odpovídá na Dominik Gavrecký
Neaktivní uživatel:28.5.2016 10:08

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
28.5.2016 10:08
Neaktivní uživatelský účet
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.