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.
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í.
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á.
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š?
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í
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. :/
Martin Štěpánek :27.5.2016 15:21
Alespoň vím, že nejsem jediný Nikde tu proměnnou vůbec neupravuji, po přihlášení se vytvoří a poté už s ní nic nedělám.
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.
Neaktivní uživatel:27.5.2016 16:55
A nezapomeň, že vardump je v php tvůj jediný opravdový kamarád Dej ho tam, kde to určitě funguje a tam, kde už to nefunguje a postupně je posouvej k sobě.
+20 Zkušeností
+2,50 Kč
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 )
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'];
Martin Štěpánek :27.5.2016 17:15
tak jsem přejmenoval $prava na $prav a funguje to
to by se mohlo zařadit do Akta X
TomasGlawaty:27.5.2016 18:46
Ale ještě lepší kamarádi jsou PhpStorm s XDebugem
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
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
Neaktivní uživatel:27.5.2016 21:24
Málokdo má koupený PhpStorm Ale jo, to je ta lepší varianta
Dominik Gavrecký:27.5.2016 21:42
My ako študenti ho máme FREE Ale myslím že stojí za to do neho investovať ...
Neaktivní uživatel:28.5.2016 0:16
My ako študenti ho ale i tak nemůžeme používat komerčně
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
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č...
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ť.
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
Zobrazeno 25 zpráv z 25.