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.
Tvůrce
Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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í.
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á.
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š?
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í
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. :/
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.
Smaže se jenom ta položka s právy nebo celá session? Dal bych si pozor na řádky se session destroy.
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ě.
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 )
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'];
tak jsem přejmenoval $prava na $prav a funguje to
to by se mohlo zařadit do Akta X
Ale ještě lepší kamarádi jsou PhpStorm s XDebugem
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
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
Málokdo má koupený PhpStorm Ale jo, to je ta lepší varianta
My ako študenti ho máme FREE Ale myslím že stojí za to do neho investovať ...
My ako študenti ho ale i tak nemůžeme používat komerčně
A ano, určitě se vyplatí si ho koupit, ale 3.5 tisíce je holt 3.5 tisíce
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č...
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ť.
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.