Operátory v praxi v PHP (4.díl/2.série)

V a předminulém díle jsme se naučili, co to jsou operátory a k čemu je lze použít: Operátory v PHP (2.díl/2.série). Ukážeme se praktické ukázky, jak tyto operátory využít. Příště se dozvíme, jak operátory použít do podmínek…

Kapitoly:

 

Spojování řetězců

První a nejznámější operátor je . Žádnou vědu v tom nehledejte – je to prostě a jednoduše klasická tečka, jak ji znáte:

.

Nic víc, nic míň. Tahle tečka nám ale umožní spojit dvě (nebo tři, čtyři…) věci (řetězce) dohromady. Řekněme, že chceme spojit jedničku (1) a pětku (5), výsledkem spojení tedy bude číslo 15:

<?php     
  $obsah = "1"."5";     
  echo $obsah; 
?>

Pokud si tento kód spustíte, vyjde Vám číslo patnáct (15). Obsahem proměnné $obsah je prostě jednička a pětku za sebou, takže patnáctka. Předpokládám, že už to chápete, ale zkusíme si to ještě jednou:

<?php     
  $obsah = "25"."85"."8";     
  echo $obsah; 
?>

A teď jsme spojili čísla 25, 85 a 8. Lze vypozorovat, že lze spojovat i více čísel (řetězců) – klidně padesát. Pokud si tento kód spustíte, vypíše se Vám číslo 25858. Zkusíme si to ještě jednou a s trošku jiným obsahem:

<?php     
  $obsah = "ahoj"."+/="."48"."php";     
  echo $obsah; ?>

Po spuštění tohoto skriptu se nám vypíše ahoj+/=48php. Teď si ale určitě říkáte, jak využijete toto spojování řetězců, že? Je to jednoduché, pokud třeba od uživatele pomocí (třeba) superglobální proměnné $_POST získáváte nějaká data, je někdy potřeba tyto proměnné spojit (např. jméno a příjmení). Uděláme to takto:

<?php     
  $jmeno = "Honza";     
  $prijmeni = "Novák";     
  $celejmeno = $jmeno.$prijmeni;     
  echo $celejmeno; 
?>

Teď by se nám měl vypsat tento text: HonzaNovák. Co když ale chceme mít mezi křestním jménem (Honza) a příjmením (Novák) mezeru? Vyřešíme to velice jednoduše:

<?php     
  $jmeno = "Honza";     
  $prijmeni = "Novák";   
  $celejmeno = $jmeno." ".$prijmeni;   
  echo $celejmeno; 
?>

Upravili jsme třetí řádek. Jak to funguje? Máme proměnnou $jmeno (ta není v uvozovkách, protože je to proměnná a není to text). Následně přidáme tečku pro připojení něčeho dalšího – řetězce. Bude to mezera (tu ale musíme dá do uvozovek, protože je to text. Následně přidáme další tečku pro připojení dalšího řetězce. A to bude proměnná $prijmeni (zase není v uvozovkách).

PAMATUJ SI: Proměnné nezapisujeme do uvozovek! V uvozovkách je pouze text!

 

Sčítání a odčítání čísel

Teď už to bude jednoduché 🙂 (Téměř) všechny operátory fungují stejně.  Budeme používat klasický znak pro sčítání – plus:

+

Sečtení čísel provedeme takto:

<?php     
  $vysledek = 2+2;   
  echo $vysledek; 
?>

Tenhle kód je zcela easy. Výsledkem by mělo být číslo čtyři (4). Zkuste si skript spustit.

Odčítání funguje na stejném principu:

-

Použijeme jenom znak mínus (pomlčka):

<?php   
  $vysledek = 10-5;   
  echo $vysledek; 
?>

Pokud si tento skript spustíte, mělo by Vám vyjít číslo pět (5).

 

Násobení, dělení a zbytek

Princip je opět naprosto stejný, myslím, že ho tady už nemusím uvádět.

 

Přičtení jedničky a odečtení jedničky

Funguje na zajímavém principu. Pokud chceme k nějakému číslu (třeba k dvanáctce – 12) přičíst pouze jedničku (1) použijeme dvě pluska a to takhle:

<?php   
  $vysledek = "12";   
  $vysledek++;   
  echo $vysledek; ?>

Pokud si tento kód spustíte, mělo by se Vám vypsat číslo 13.

Odečtení funguje stejně, akorát přidáme dvě mínuska:

<?php   
  $vysledek = "12";   
  $vysledek--;   
  echo $vysledek; 
?>

Výsledkem by mělo být číslo jedenáct.

 

Další operátory, které využijeme až v podmínkách

Jejich přehled naleznete zde: Operátory v PHP (2.díl/2.série). Operátory, které využíváme v podmínkách fungují všechny na stejném principu. Takže pokud si napíšu podmínku, pokud:

  • je proměnná $prvni
  • stejná (to stejné značí dvě rovnítka ==)
  • jako proměnná $druha
  • tak udělej to první
  • jinak udělej to druhé
<?php   
  $prvni = "ahoj";   
  $druha = "nashledanou";   
  if($prvni == $druha){     
    //udělej to první     
  }else{      
    //udělej to druhé     
  } 
?>

To je opět hrubý náčrt podmínky. Už je totiž znáte z minula: Podmínky v PHP (3.díl/2.série) 🙂

Podmínky v PHP (3.díl/2.série)

Ahoj,

v minulém díle jsme si řekli něco o operátorech v PHP. V díle ještě před ním jsme se podívali na zub Superglobálním proměnným v PHP. Nyní si troufám říci, že jsme již plně „vyzbrojeni“ na pochopení podmínek v PHP.

Jelikož jsou podmínky velice rozsáhlé téma (toto je už 3. díl ze 2. série), budou následovat ještě alespoň dva další díly. V tomto díle Vás seznámím hlavně s nutnými základy podmínek a jejich fungováním. Abyste pochopili, jak se s nimi pracuje, na jakém principu fungují a hlavně – jak je můžete využít a k čemu jsou dobré v praxi.

Kapitoly:

 

Fungování podmínky (teorie)

Základním stavebním kamenem celé podmínky je nějaký již předem daný postup, jak ji poskládat. Každý postup se dá různě vylepšovat, nebo usnadnit. Je možné, že v praxi se setkáte s různými způsoby jak zapsat podmínku. Vždy ale různé zápisy se stejným cílem fungují stejně. Lze zapsat o pět znaků méně a bude to fungovat úplně stejně, jako kdybych jich napsal o pět více.

Nemůžu říct, které postupy jsou správné a které ne. Jak již jsem řekl, všechny fungují (pokud teda neobsahují chybu). Postup (a logika), kterým fungují podmínky je zhruba tento:

  1. Řeknu, že tohle je podmínka
  2. Následně si vyberu způsob, kterým chci vytvořit podmínku – vyberu si operátor
  3. Poté pomocí operátorů porovnám hodnoty
  4. Pokud souhlasí podle operátoru, tak
    1. Provedu jednu akci
    2. Jinak provedu tu druhou
  5. A podmínku nakonec ukončím

Toto byl opravdu velice letmý náčrt toho, jak podmínka může fungovat.

 

První ukázka jednoduché podmínky

Dejme tomu, že chceme sestavit tuto podmínku:

  • Pokud je obsah proměnné $prvni stejný jako obsah proměnné $druha
  • Tak vypiš text „Je to stejné“
  • Pokud není, tak vypiš text „Není to stejné“

A co budeme muset udělat?

  • Vytvořit proměnnou $prvni a definovat její obsah
  • Vytvořit proměnnou $druha a taktéž definovat její obsah
  • Vytvořit podmínku, že pokud jsou obě proměnné stejné tak (…), jinak (…)

Jdeme tedy na to! Založme si nejdříve nový PHP dokument nazvěme ho podminka1.php (název je na Vás). Na jeho začátku definujme dvě základní proměnné $prvni a $druha:

<?php  
  $prvni = "ahoj";  
  $druha = "ahoj";

Definovali jsme oběma proměnným stejný obsah – slovo ahoj. To znamená, že až budeme stavět podmínku, logicky se nám vypíše text „Je to stejné“.

Dále vytvořme začátek podmínky:

if($prvni == $druha)

Teď jsme vytvořili podmínku, ve které porovnáváme dvě proměnné, že

  • pokud je obsah $prvni
  • stejný (to stejný značí v podmínce dvě rovnítka – více v článku Operátory) jako
  • obsah $druha

Ale neznáme pokračování, co má PHP skript udělat, pokud obsah těchto proměnných bude stejný, nebo nebude? Co potom? Ještě upravím ten řádek se začátkem podmínky, pomocí složené závorky { otevřu podmínku:

if($prvni == $druha){

Nyní už se podíváme na to, co udělat v případě shody a co v případě neshody:

if($prvni == $druha){   
  echo "Je to stejné"; 
} else {  
   echo "Není to stejné"; }

Toto už je plně funkční podmínka. Hned na druhý řádek jsme vložili echo, to se nám vypíše v případě shody. Následně přidáme na konec středník a ještě složenou závorku (tentokrát na druhou stranu) }.

Potom napíšeme else, tohle slovíčko nám totiž v podmínce značí v češtině slovní spojení v opačném případě. A přidáme složenou závorku {. Takže v opačném případě (pokud se obsahy proměnných $prvni a $druha nerovnají – nejsou stejné) vypiš pomocí echo text „Není to stejné“. Poté zase ukončíme řádek středníkem a na nový řádek přidáme složenou závorku na druhou stranu }.

Celkový kód bude vypadat takto (vyzkoušejte si):

<?php   
  $prvni = "ahoj";  
  $druha = "ahoj";  
  if($prvni == $druha){ 
    echo "Je to stejné"; 
  } else {  
    echo "Není to stejné";
  }  
?>

Co když obsah není stejný?

Pakliže bychom změnili obsah jedné z proměnných (slovo ahoj), tak už se nám nemůže vypsat text, že je to stejné. Není to stejné. Jakmile je jedna z porovnávaných proměnných jiná, tak se vypíše tak část za else. Tedy text „Není to stejné“. Uvedu pro Vás příklad:

<?php   
  $prvni = "nashledanou";   
  $druha = "ahoj";
  if($prvni == $druha){  
    echo "Je to stejné"; 
  } else { 
    echo "Není to stejné";
  }  
?>

Nyní by se nám měl vypsat text „Není to stejné“.

Operátory v PHP (2.díl/2.série)

Ahoj,

v minulém článku jsme se seznámili se Superglobálními proměnnými v PHP a jednoduchou adresou. Dnes a v příštích dílech se budeme zabývat hlavně superglobální proměnnou $_GET. Tu budeme používat pro tvoření jednoduchých URL adres za pomoci parametrů a podmínek.

Abychom ale začali s používáním podmínek, tak se nejdříve musíme naučit (nebo seznámit) různé operátory, které budeme v těchto podmínkách používat. Např. pokud bych chtěl zobrazit soubor info.php, tak musím nejdříve sestrojit nějakou podmínku a v té právě posuzovat podle operátorů shodu, nebo neshodu, nebo jiné možnosti.

Takže začneme…

Mezi nejzákladnější operátory patří například spojování řetězců, přičítání, odčítání a spoust dalších.

. slouží ke spojení více řetězců – př. $promenna.“.txt“ Nám spojí obsah proměnné $promenna s řetězcem .txt.
+ slouží k sčítání čísel – př. $vysledek = 5+5 A do proměnné $vysledek se nám uloží hodnota 10, apod.
slouží k odčítání čísel.
* slouží k násobení čísel. Hodně lidí si tento znak plete. Je to hvězdička, není to písmeno x, ani znak ×.
/ slouží k dělení čísel. Je to lomítko napravo. Není to znak ÷.
% slouží k výpočtu zbytku (většinou po dělení).
++ slouží k připočtení jedničky (1) k nějakému číslo – př. $cislo = 1++ a obsah $cislo bude o jednu číslici vyšší.
slouží k odečtení jedničky (1) od nějakého čísla.

 A nyní se podíváme na ty operátory, které budeme používat v podmínkách:

&& a zároveň. Podmínka, pokud něco a zároveň něco jiného, tak tohle.
|| nebo. Dvě svislé čáry (není to písmeno L), pokud je to takhle, nebo takhle (ale alespoň jedno), tak tohle.
== rovnost. Pokud se něco rovná s něčím, tak tohle.
!= nerovnost. Pokud se něco nerovná s něčím, tak tohle.
< menší. Pokud je něco menší než něco jiného, tak tohle.
> větší. Pokud je něco větší než něco jiného, tak tohle.
<= větší, nebo stejné. Pokud je něco větší, nebo stejně velké jako něco jiného, tak tohle.
>= menší, nebo stejné. Pokud je něco menší, nebo stejně velké jako něco jiného, tak tohle.

Toto byly základní operátory, které budeme v podmínkách používat. Příště se již vrhneme do podmínek.

Superglobální proměnné v PHP (1.díl/2.série)

Ahoj,

pod dlouhé době jsem se zase dostal k napsání článku sem na MůjSkript.cz. Tentokrát na téma o superglobálních proměnných v $_POST a $_GET a jejich parametrech v URL adresách.

Hádám, že jste se už určitě setkali s tím, že jste měli v adresním řádku adresu podobou této:

http://domena.cz/stranka.php?kategorie=php&tema=promenne

Mám namysli ty proměnné v superglobální proměnné v PHP v $_GET: kategorie=php a tema=promenne. Superglobální proměnné jsou ty, které jsou již předem definované v jazyce PHP a my se o ně víceméně nemusíme vůbec starat. V superglobálních proměnných se ukrývají nějaké předávané parametry. Buď z nějakého formuláře, předchozího skriptu, nebo prostě jako klasický odkaz.

Mezi ty nejznámější superglobální proměnné řadíme $_GET a $_POST. Uvedu jednoduchý příklad. Pokud budeme tvořit nějaký formulář v HTML, můžeme si v hlavičce toho formuláře vybrat, jakým způsobem chceme data z formuláře odesílat. V HTML tím přesněji myslím atribut method ve formulářovém elementu form. Většinou pak také uvádíme adresu, na kterou chceme data poslat – a to pomocí dalšího atributu a to je action.

<form method="post" action="zpracuj_formular.php">

Tímto easy (čti: velmi jednoduchým) formulářem odešleme data z formulářem prostřednictvím POST souboru zpracuj_formular.php. Pokud data posíláte prostřednictvím metody POST, tak se nám tyto data skryjí a nelze je vypozorovat v URL adrese (pouze požadavky a posílanými daty).

Kdybychom chtěli (jakožto určitě chceme) tyto data z formuláře zpracovat, velmi jednoduše se k nim dostaneme v PHP v superglobální proměnné $_POST. Jak už jsem říkal, metoda POST posílá data skrytá. Nelze je tedy vyčíst z URL adresy. Například pokud bych měl takovýto formulář:

<form method="post" action="zpracuj_formular.php"> 
  <input type="text" name="jmeno"> 
  <input type="text" name="prijmeni"> 
  <input type="submit"> 
</form>

tak data z něj v souboru zpracuj_formular.php mohu vyčíst takto:

<?php 
  $prvni = $_POST['jmeno']; 
  $druha = $_POST['prijmeni']; 
?>

Což znamená, že do proměnné $prvni jsem uložil data ze superglobální proměnné $_POST, která si vzala data z formulářového políčka, které mělo name=“jmeno.“ Vlastně v těch hranatých závorkách a jednoduchých uvozovkách definuji, z jakého inputu (nebo třeba selectu) mám vybrat ty správná data.

Pokud stále někdo tápe, ukážu mu to na jiném příkladě s jinými názvy proměnný a name. Formulář bude vypadat třeba takto:

<form method="post" action="zpracuj_formular.php"> 
  <input type="text" name="telefon"> 
  <input type="text" name="adresa"> 
  <input type="text" name="mail"> 
  <input type="submit"> 
</form>

Tak si data vytáhnu takhle:

<?php  
  $nejakapromenna = $_POST['telefon']; 
  $dalsipromenna = $_POST['adresa']; 
  $nejakadalsipromenna = $_POST['mail']; 
?>

Názvy těch proměnných před rovnítkem (v mém případě $nejakapromenna, $dalsipromenna, $nejakadalsipromenna) mohou být volitelné, to je na Vás. Jediné pravidlo je to, že text v hranatých závorkách a jednoduchých uvozovkách musí být vždy stejný s name v HTML. Takže abychom si to shrnuli:

  • v proměnné $nejakapromenna bude uložen obsah inputu s name=“telefon
  • v proměnné $dalsipromenna bude uložen obsah inputu s name=“adresa“
  • v proměnné $nejakadalsipromenna bude uložen obsah inputu s name=“mail“.

Samozřejmě doporučuji používat názvy proměnných alespoň trochu více přívětivější, nejlépe takové, abychom věděli, co se v nich ukrývá. Já použil schválně jiné proměnné, abyste si nemysleli, že se musí shodovat s name v inputech. Nemusí, můžou být různé, ale můžou být i totožné. Naopak názvy u superglobálních proměnných se musí shodovat s name v inputu v HTML.

 

Další superglobální proměnnou je $_GET. Pomocí parametru $_GET můžeme předávat parametry veřejně dostupné v URL adrese. Uvedu příklad:

<form method="get" action="zpracuj_skript.php">

A pokud je budeme chtít zpracovat v PHP, tak to funguje úplně stejně jako u superglobální proménné $_POST, až na ten rozdíl, že nepoužijeme $_POST, ale $_GET. Takže si ukážeme zase nějaký kompletně funkční příklad. V HTML budu mít tenhle formulář:

<form method="get" action="zpracuj_formular.php"> 
  <input type="text" name="jmeno"> 
  <input type="text" name="mail"> 
  <input type ="text" name="adresa"> 
  <input type="submit"> 
</form>

A v PHP si pomocí superglobální proměnné $_GET data vypíšu:

<?php 
  $jmeno = $_GET['jmeno'];
  $email = $_GET['mail']; 
  $adresa = $_GET['adresa']; 
?>

Zase, není zde vůbec žádný problém použít jiné názvy proměnných. Například zde jsem jako proměnnou použil $email i když v superglobální proměnné a v name inputu mám jen mail. Opět to zde vůbec nevadí.

 

Pokud bychom chtěli zkombinovat v HTML formu metodu post a supergobální proměnnou $_GET, tak se Vám to nepovede. Respektive nezískáte žádná data. To samé platí i naopak – pokud budu v HTML formuláři definovat metodu get a v PHP ji volat jako superglobální proměnnou $_POST, nedostanu žádnou odpověď, žádná data.

Superglobální proměnné lze používat i pro všechny možné inputy, password, selecty i radio buttony, je to jedno. Vždy tu správnost ovlivňuje jen správně nastavená metoda ve formuláři a v PHP – musí se shodovat.

 

A teď konečně k těm slíbeným URL adresám pomocí $_GET parametrů… Vytvořte si nový soubor index.php a do jeho obsahu napište definici parametrů superglobální proměnné $_GET:

<?php 
  $predmet = $_GET['predmet']; 
?>

 

Tento zápis, předpokládám, chápete. Nyní si přidáme první podmínku a to:

  • pokud se obsah proměnné $predmet (což je obsah superglobální proměnné $_GET[‚predmet‘]) shoduje s textem prirodopis
  • tak vypiš jednoduchou hlášku „Jsi v kategorii Přírodopis“
<?php
  $predmet = $_GET['predmet']; 
  if ($predmet == "prirodopis"){ 
    echo "Jsi v kategorii Přírodopis"; 
  } 
?>

Takže pokud přistoupíme na adresu http://vasedomena.cz/index.php?predmet=prirodopis, tak se nám zobrazí text „Jsi v kategorii Přírodopis“.

Nyní si zkusíme ještě trošku tu podmínku změnit, že:

  • pokud se obsah proměnné $predmet (což je obsah superglobální proměnné $_GET[‚predmet‘]) shoduje s textem prirodopis
  • a zároveň (to značí ty &&) pokud se obsah proměnné $tema (což je obsah superglobální proměnné $_GET[‚tema‘]) shoduje s textem obratlovci
  • tak vypiš text „Jsi v kategorii Přírodopis v tématu Obratlovci“
<?php  
  $predmet = $_GET['predmet']; 
  $tema = $_GET['tema']; 
  if ($predmet == "prirodopis" && $tema = "obratlovci"){ 
    echo "Jsi v kategorii Přírodopis v tématu Obratlovci"; 
  } 
?>

Takže pokud přistoupíme na adresu http://vasedomena.cz/index.php?predmet=prirodopis&tema=obratlovci, tak se nám zobrazí text „Jsi v kategorii Přírodopis v tématu Obratlovci“.

Tak, tohle by nám pro začátek mohlo stačit. Nejdříve měl být tenhle článek jenom o superglobálních proměnných, ale nějak jsem se rozepsal, tak jsem sem přidal i malou ukázku URL adresy s $_GET parametrem. V příštích dílech si ukážeme, jak rozsáhleji „opodmínkovat“ skript, jak ošetřit vstup, jak zobrazit chybovou hlášku v případě špatného parametru a ještě víc..

Tak se těšte! Příští díl bude v neděli (26.4.), nebo v pondělí (27.4.) 🙂

Include v PHP – 1.díl

Jestliže tvoříte nějaké rozsáhlejší stránky, které budou mít dvacet a více stránek, doporučuji si rozkouskovat šablonu Vaší stránky na různé části.

Když jsem já jednou dělal stránky, které měly třeba padesát podstránek a potom bylo potřeba v patičce všech stránek změnit datum, nebo třeba trošku pozměnit strukturu a pořadí odkazů v menu, byla opravdu hrooozně velká otrava všechny ty stránky (jednu po druhé) měnit.

Proto doporučuji si stránky rozkouskovat. Vytvořme si nějakou základní kostru webové šablony, třeba takhle:

<!doctype html> 
<html>   
  <head> 
    <meta charset="utf-8"> 
    <title>Webová stránka | Název webu</title> 
  </head> 
  <body> 
    <div id="hlavicka"> 
      <div id="logo"> 
        <h1>Nadpis webu</h1> 
      </div> 

      <div id="menu"> 
        <ul> 
          <li><a href="prvni">První</a></li> 
          <li><a href="druhy">Druhý</a></li> 
          <li><a href="treti">Třetí</a></li> 
          <li><a href="ctvrty">Čtvrtý</a></li> 
        <ul> 
      </div> 
    </div> 
    
    <div id="sloupecek"> 
      <p>Aktuální novinky...</p> 
    </div>
 
    <div id="obsah"> 
      <p>Lorem ipsum, dolor sit amet...</p> 
    </div> 
 
   <div id="paticka"> 
      &copy; 2015 Název webu. 
    </div> 
  </body> 
</html>

 

A co kdybych Vám naservíroval třeba takovýhle zdrojový kód? Není to jednodušší?

<!doctype html> 
<html>   
  <head> 
    <meta charset="utf-8"> 
    <title>Webová stránka | Název webu</title> 
  </head> 
  <body> 
    <div id="hlavicka"> 
      <div id="logo"> 
        <?php include "logo.php" ?>
      </div> 

      <div id="menu"> 
       <?php include "menu.php" ?>
      </div> 
    </div> 
    
    <div id="sloupecek"> 
      <?php include "sloupecek.php" ?>
    </div>
 
    <div id="obsah"> 
      <p>Lorem ipsum, dolor sit amet...</p> 
    </div> 
 
   <div id="paticka"> 
      <?php include "paticka.php" ?>
    </div> 
  </body> 
</html>

Hlavičku bychom mohli klidně ještě rozdělit na soubor menu.php, ale to je jen takové vylepšení.

A teď se konečně dostáváme k tomu dobrému využití, k čemu jde PHP include využít. Řekněme, že chci v patičce každé stránky webu mít tohle:

&copy; 2015 Název webu. Všechna práva vyhrazena.

Změna je v té větě „Všechna práva vyhrazena“. Kdybych byl neznalý správce webových stránek, používající HTML a CSS, tak si normálně otevřu editor a budu upravovat jednu stránku za druhou. Stránka s aktualitami, stránka s ceníkem, stránka s blogem, stránka s kontakty… Ach joo, už mě to nebaví.

Jenže já jsem znalý správce webových stránek (což jste i Vy!), takže jsem webové stránky už na jejich počátku navrhnul tak, aby pro části, které se budou často měnit existoval jenom jeden soubor a ten se postupně do těch ostatních podstránek webu includoval (čti vkládal). Ano, přesně tak, jak jste mohli vidět výše.

 

První použití INCLUDE

PHP include lze používat pouze pro relativní cestu! Nelze volat soubor s absolutní cestou:

<?php include "http://mujskript.cz/soubor.php" ?>

Vždy se musí volat soubor s cestou relativní:

<?php include "soubor.php" ?>

Takže postup a fungování funkce include je takový:

  1. Do všech stránek (např. index.php a kontakt.php), kde chci mít stejný obsah, např. menu vložím <?php include „menu.html“ ?>
  2. Do souboru menu.html (klidně i menu.php – přípona je na Vás) vložím menu, prostě to, co by normálně bylo na stránek, místo include
  3. Takže v souborech index.php a kontakt.php budu mít v editoru tento kód (např.):
    1. <html>
      <body>
      <div id=“menu“>
      <?php include „menu.php“ ?>
      </div>
      … <!– pokračování kódu, nebudu ho sem vypisovat… –>
  4. A obsah souboru menu.php bude:
    1. <ul>
      <li><a href=“prvni“>První položka menu</a></li>
      <li><a href=“druha“>Druhá položka menu</a></li>
      </ul>
  5. Když toto všechno nahrajeme na hosting s podporou PHP, tak jako uživateli se ukáže:

    1. <html>
      <body>
      <div id=“menu“>
       <ul>
          <li><a href=“prvni“>První položka menu</a></li>
          <li><a href=“druha“>Druhá položka menu</a></li>
      </ul>

      </div>
      … <!– pokračování kódu, opět Vám ho sem nebudu vypisovat… –>

Takže vidíme, že tento způsob práce nám může výrazně ulehčit práci. Je možné, že někteří z Vás to stále nechápou. Nebojte, já to také nemohl hned pochopit 😉 Proto jsem pro Vás připravil jednoduchou ukázku v .zipu, kterou si můžete stáhnout a vyzkoušet (funguje to jen na hostingu (nebo localhostu), kde je podpora PHP).

Stáhnout include1.zip

Zobrazit ukázku (stejná jako v include.zip) – otevřete si i soubor menu.php

 

Těšte se na další díly! Pokud máte dotazy, nebojte se využít komentáře níže:

Rotace obrázku v PHP pomocí imagerotate()

Dnes si ukážeme, jak pomocí PHP otočit obrázek o několik stupňů.

Máme na výběr: 0°, 90°, 180°, 270°, či dokonce 360°. Nebo úplně jinak, třeba o 15°, nebo rovnou 145°.

 

Nejdříve si musíme definovat, jak se bude jmenovat vstupní obrázek (ten, co se bude rotovat) a pak ještě ten výstupní (co uložíme jako otočený).

Vytvoříme si tedy dvě proměnné:

<?php 
  $vstup = "a.jpg"; 
  $vystup = "b.jpg";

Předpokládejme, že si skript nazveme rotace.php a ve stejné složce existuje obrázek, který se jmenuje a.jpg. Druhý nemusí existovat. Na prvním řádku máme otevírací tag pro PHP. Na druhém řádku definujeme obsah proměnné $vstup jako obsah a.jpg a na třetím řádku zase k proměnné $vystup obsah b.jpg.

 

Vytvoření kopie obrázku

Dále si musíme načíst obrázek a.jpg a udělat si jeho kopii, abychom s ním mohli dále pracovat. To provedeme pomocí PHP funkce imagecreatefromjpeg, v překladu to znamená: obrázek vytvoříme z jpeg. Z originálu vytvoříme kopii proměnné $vstup (jako první parametr funkce v závorce) a tu uložíme jako proměnnou $kopie.

$kopie   = imagecreatefromjpeg($vstup);

 

Otočení obrázku

Nyní přichází ten očekávaný a slavnostní okamžik – samotná rotace pomocí PHP funkce imagerotate. Výstup této funkce uložíme do proměnné $otoceny. Jako první parametr funkce uvedeme název obrázku, který budeme rotovat. Takže to bude proměnná $kopie. Jako druhý parametr uvedeme číslo – číslem udáváme počet stupňů, ve kterých se má obrázek otočit. Uvedeme třeba 90°. A nulu přidáme jako poslední parametr:

$otoceny = imagerotate($kopie,90,0);

 

Uložení obrázku

A jako poslední, uložíme zrotovaný obrázek do souboru. A to pomocí PHP funkce imagejpeg. Prvním parametrem bude samotný obrázek v proměnné $otoceny a druhým bude jeho název, tedy proměnná $vystup. A přidáme uzavírací tag pro PHP:

$obrazek = imagejpeg($otoceny, $vystup); 
?>

A máme hotovo! Na konečný skript se můžete podívat ještě tady:

<?php 
  $vstup   = "a.jpg"; 
  $vystup  = "b.jpg";       
  $kopie   = imagecreatefromjpeg($vstup); 
  $otoceny = imagerotate($kopie,90,0); 
  $obrazek = imagejpeg($otoceny, $vystup);
 ?>

Počítání kliků na odkaz v PHP

Nedávno se na mě obrátil kamarád, že má na webu reklamní banner a potřebuje počítat počet prokliků na ten banner. Chtěl po mě, jestli bych mu nenapsal nějaký jednoduchý skript.

Tak jsem se rozhodl, že Vám ho sem na MůjSkript.cz napíšu taky. Skript, který budeme společně tvořit by měl umět toto:

  • Vzít si parametr v URL adrese a pomocí $_GET ho zpracovat do proměnné
  • Uložit do nějakého souboru nějaký počet aktuálních prokliků
  • Případně ten soubor i vytvořit
  • Přesměrovat na URL adresu zadanou v proměnné $_GET pomocí PHP hlavičky location

Co by mohl umět dále:

  • Ochránit se před XSS útoky pomocí PHP funkce htmlspecialchars
  • Sčítat do jednoho souboru všechny prokliky
  • Pro každou URL adresu vytvořit vlastní soubor a počítat si prokliky zvlášť
  • Dynamicky měnit vytvářet a ukládat soubory podle URL adresy v $_GET

Kapitoly:

Způsob odkazování v HTML

Nejprve si musíme říct, jak budeme odkazovat na skript a jak mu budeme předávat hodnotu webové stránky (domény). Klasický odkaz na doménu bychom mohli zapsat takto:

<a href="http://domena.cz">Reklama na doménu</a>

Jenže díky tomuhle způsobu bychom se vzdali určité moci, jako monitorovat, jesli někdo na ten odkaz klikl. Určitě by to šlo i v JavaScriptu, ale o tom tenhle článek není. Abychom mohli počet kliknutí na odkaz počítat, přičítat a ukládat do souboru je zapotřebí, abychom tuto reakci uživatele (že klikl na odkaz) zachytili. Použijeme k tomu PHP a parametr GET v URL adrese, který míří na skript. Takže odkaz na doménu bude vypadat takto:

<a href="nejaky-soubor-ktery-pocita-pocet-kliknuti.php?url=domena.cz">Reklama na doménu.cz</a>

Tímhle skriptem dokážeme odchytit uživatelu reakci, že klikl na odkaz, zapsat ji do souboru a následně uživatele poslat na stránky domena.cz.

Základní stavba skriptu

Nejprve si vytvořme nějaký PHP soubor. Já si vytvořím například soubor pocitat.php. Na tento soubor budeme odkazovat způsobem, který jsme si ukázali v předchozí kapitole, tedy pomocí parametru GET:

<a href="pocitat.php?url=domena.cz>

A tento skript by nás (z pohledu uživatele) klasicky přesměroval na URL adresu domena.cz. Mezitím si ale server udělá všechno potřebné k zapsaní.

Nejdříve logicky vložíme otevírací tagy pro PHP. Jako první krok si musíme z URL adresy vycucnout název domény, na kterou chceme později přesměrovat. Protože ji posíláme přes parametr url (pocitat.php?url=domena.cz), musíme si ho taky v PHP zadat jako parametr… Tuto doménu z parametru url uložíme do proměnné $domena. Takže asi nějak takhle:

<?php
  $domena = $_GET['url'];

Nezapomeneme na konec přidat středník. Ve druhém kroku již zadáme podmínku: pokud

  • existuje proměnná $domena
  • ošetři vstup proměnné $domena pomocí htmlspecialchars (více v článku)
  • vytvoř novou proměnnou $jmenosouboru s obsahem pocet.txt
  • a pokřačuj dále…

Takže jak už jsme si řekli v bodech, proměnnou $domena ošetříme pomocí funkce htmlspecialchars, abychom se mohli chránit před XSS útoky. Protože parametr v URL si může jednoduše změnit i uživatel a napsat nám do něj nebezpečný JavaScriptový kód. Výsledkem této funkce htmlspecialchars bude opět proměnná $domena.

Taky si vytvoříme novou proměnnou $jmenosouboru, jejíž obsah bude název souboru, do kterého budeme ukládat počet prokliků – soubor pocet.txt:

if(isset($domena)){ /* toto je podmínka */
  $domena=htmlspecialchars($domena, ENT_QUOTES); /* zde si ošetřujeme vstup proti XSS útokům */
  $jmenosouboru = "pocet.txt";  /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */
  }

Načtení obsahu souboru v proměnné $jmenosouboru

Po tomto kuse kódu následuje další podmínka, a ta zní: pokud

  • existuje soubor s názvem, který je uložený v proměnné $jmenosouboru (pocet.txt)
  • pokud tento soubor neexistuje, vytvoř ho
  • načti obsah tohoto souboru (pocet.txt) pomocí file_get_contents
  • a ulož tento obsah do proměnné $pocet

K tomu už asi není nic víc, co psát a z bodů je vše jasné. Kód by měl vypadat takhle:

if(file_exists($jmenosouboru)){ /* podmínka, jestli existuje soubor s názvem uloženým v $jmenosouboru */
  $pocet=file_get_contents($jmenosouboru); 
  }

Přičtení kliku (jedničky) k dosavadnímu číslu

V dalším kroku si napíšeme, že pokud je soubor pocet.txt bez obsahu, tak bude jeho obsah 0. Takže obsahem proměnné $pocet bude nula (0), ale pouze v případě, že v souboru není žádné jiné číslo!

Následně si přidáme trošku matematiky, k číslu uloženém v proměnné $pocet přičteme jedničku (1). To pomocí dvou plusek ++.

else{$pocet=0;} /* Jestliže je obsah souboru prázdný, nebo v něm nejsou číslice, vlož nulu (0) */
$pocet++; /* K aktuálnímu číslu v proměnné $pocet přičti jedničku (1) */

Zapsaní počtu kliků do souboru v proměnné $jmenosouboru

Dále si vytvoříme novou proměnnou $soubor, ve které otevřeme pomocí funkce fopen soubour v proměnné $jmenosouboru s oprávněním zapisování – write (w).

Nyní zavoláme další funkci fwrite, pomocí které zapíšeme do souboru v proměnné $soubor (pocet.txt) obsah proměnné $pocet (počet kliknutí). Do proměnné $pocet jsme také v předchozím kroku přičítali pomocí dvou plusek.

Následně soubor v proměnné $soubor zavřeme pomocí funkce fclose. Celý tento krok je vidět v tomto kódu:

$soubor=fopen($jmenosouboru,'w');
fwrite($soubor,$pocet); /* zapíše počet kliků */
fclose($soubor);

Přesměrování uživatele na požadovanou stránky v GET

Jako poslední krok uživatele přesměrujeme uživatele na původní požadovanou stránku v $_GET parametru url. Tu jsme zadali jako proměnnou, takže $domena. Před začátek proměnné zadáme ještě http:// a konečné přesměrování provedeme to pomocí PHP hlavičky location. A pak ukončíme PHP skript:

header("location: http://$domena"); /* přesměruje se na požadovanou URL v proměnné */
}
?>

Nyní máme skript připraven a můžeme ho začít používat.

 

TIP: Pro každou stránku vlastní soubor $jmenosouboru

Všechny prokliky se nám aktuálně sčítají do jednoho jediného soubor – pocet.txt. Co když ale chceme počítat prokliky pro každou adresu/doménu/soubor zvlášť?

Je to velmi jednoduché: stačí si změnit poslední řádek v naší kapitole Základní stavba skriptu. Myslím tím tento řádek:

$jmenosouboru = "pocet.txt";  /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */

Pomocí tohoto řádku definujeme, do jakého souboru chceme zapisovat, jelikož ale chceme zapisovat do dynamického souboru (chceme, abychom měli tolik souborů, na kolik různých domén odkazujeme), musíme jeho název upravit.

Příponu .txt necháme, ale jeho název se bude měnit podle aktuálního obsahu proměnné $domena. Takže platí pravidlo: kolik různých adres do $_GET url zadáme, tolik se nám automaticky vytvoří souborů s názvy jednotlivých adres. Změňme tento řádek na:

$jmenosouboru = $domena.".txt"; /* a tady vytváříme novou proměnnou s názvem $jmenosouboru */

Jak jste si jistě mohli povšimnout, název proměnné není v uvozovkách – až samotná koncovka .txt. Je to proto, že koncovka .txt je volný text, zatímco proměnná $domena je již předem definvoaná. Také jste si mohli všimnout toho, že mezi $domena a „.txt“ je tečka. To z toho důvodu, že chceme tyto dva řetězce (proměnná a text) spojit v jeden.

Ke stažení

Počet kliků s jedním .txt souborem (všechny kliky se sčítají) – .ZIP

Počet kliků s více dynamickými .txt soubory (1 url = 1 soubor) – .ZIP

 

Pokud se Vám článek líbil, nebo se na něco chcete zeptat, využijte komentářů níže. Udělá mi to radost. Tomáš 🙂

 

Pokud se Vám skript líbí, nebo se chcete na něco zeptat, budu rád, když využijete komentářů níže. Udělá mi to radost 🙂

Upload obrázků na server v PHP

Zde je jednoduchý skript, který Vám přiložený obrázek uloží do složky obrazky. Název souboru se pojmenovává podle timestampu (aktuální čas, den, měsíc, rok…) – trošku nevýhoda při kolizi. Nejdříve si vytvoříme HTML formulář a následně PHP skript:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="obrazky[]" />
    <input type="submit" value="Nahrát na server!" />
</form>
 
<?php
 
// konfigurace
$uploadDir = 'obrazky'; // adresar, kam se maji nahrat obrazky (bez lomitka na konci)
$allowedExt = array('jpg', 'jpeg', 'png', 'gif'); // pole s povolenymi priponami
 
// zpracovani uploadu
if(isset($_FILES['obrazky']) && is_array($_FILES['obrazky']['name'])) {
 
    $counter = 0;
    $allowedExt = array_flip($allowedExt);
    foreach($_FILES['obrazky']['name'] as $klic => $nazev) { // zde poslané obrázky proměníme na proměnnou $nazev
        
        $nazev = htmlspecialchars($nazev, ENT_QUOTES);
        $fileName = basename(time() . ".png");
        $fileName = sprintf(time() . ".png", pathinfo($nazev, PATHINFO_EXTENSION));
        $tmpName = $_FILES['obrazky']['tmp_name'][$klic];
        $fileName = htmlspecialchars($fileName, ENT_QUOTES);
        
 
        // kontrola souboru
        if(
            !is_uploaded_file($tmpName)
            || !isset($allowedExt[strtolower(pathinfo($fileName, PATHINFO_EXTENSION))])
        ) {
            // neplatny soubor nebo pripona
            continue;
        }
 
        // presun souboru
        if(move_uploaded_file($tmpName, "{$uploadDir}".DIRECTORY_SEPARATOR."{$fileName}")) {
            ++$counter;
        }
 
    }
 
    if ($counter > 0)
    echo "<hr><p>Úspěšně byl nahrán {$counter} z ".sizeof($_FILES['obrazky']['name'])." obrázků, děkujeme!<br>
    <br>
    <b>Odkazy na obrázek</b>:<br>
    Klikatelný odkaz na obrázek:<br> 
    <a href='http://web.cz/$uploadDir/$fileName'  target='_blank'>http://web.cz/$uploadDir/$fileName</a><br>
    
    Kopírovatelný odkaz na obrázek:<br> 
    <input type='text' name='f1' id='url' size='100%' value='http://web.cz/$uploadDir/$fileName' onclick='this.select(); PS.clickUrl();'><br>
    </p>"."<br>";
    else
    echo "<hr><b><font color='red'>CHYBA: Nenahráli jste žádný obrázek, nebo má obrázek špatnou příponu!</font></b><br>"; 
}
 
?>

 

A teď, co je v jednotlivých proměnných (tyto proměnné jsou znázorněny v kódu):

$uploadDir= relativně umístěná složka, do které se mají obrázky uložit (bez lomítka na konci)

$allowedExt = povolené přípony obrázku, ostatní nebudou nahrány

$nazev = nezpracovaný název souboru (tak jak jej má uživatel ve svém PC)

$fileName = koncový název souboru, se kterým můžeš dále pracovat

 

Proměnná $fileName se pro jistotu na řádku 23 ještě kontroluje pomocí htmlspecialchars, to aby se nemohl provést nebezpečný XSS útok (více zde). Proměnnou $nazev také radši kontroluji (ačkoliv to není nutné).

Živá ukázka

Velmi podobnou ukázku najdete na foto.mujskript.cz

Ke stažení zde 

 

V článku používáme materiály a funkce, které najdete také na MůjSkript.cz!

Obrana proti XSS útokům v PHP

Pokud Vám někdo do inputu, nebo třeba jako název obrázku (který nahraje) vloží nebezpečný JS, který nemáte převedený na entity, vystavujete se tak nebezpečí.

XSS útok na nejmenší úrovni může třeba jen vyalertovat text. Stačí pokud do vstupu (text, file, mail) vloží nebezpečný JS kód (= XSS útok). XSS útok může vypadat například takto:

' onmouseover='alert(1)' data-foo='.jpg

To je ukázka XSS útoku v případě, že nahráváte fotku a uložíte ji pod výše zmíněným názvem. Po najetí na odkaz (po nahrání) se alertem vypíše jednička. A takto se dá zneužít jedna bezpečností díra. Pokud input, nebo file pojmenujeme ve specifikaci jako name=“text“ – př.

<input type="text" size="30" name="text">

můžeme použít PHP kód, který všechny nepovolené znaky (apostrofy, uvozovky, ostré závorky, apod…) změní na entity, které se vypíší jako entity (nepřepíší se na text). Funkce, která to umí se jmenuje htmlspecialchars. Ukážeme si příklad, pokud jsme input (či cokoliv jiného, do čeho se dá vložit text) pojmenovali name=“text“ a ten přes hodnotu POST dali do proměnné $text:

$novapromenna = htmlspecialchars($text, ENT_QUOTES);

Což nám zajistí, že obsah proměnné $text (ve které je uložen obsah inputu) se převede na entity. Převedený text se nám uloží do nové proměnné $novapromenna, se kterou můžeme již dále pracovat (je zaentinovaná). Když je zaentinovaná, znamená to, že se škodlivý XSS útok nespustí, což je pro nás dobře.

Takže aktuální obsah proměnné $novapromenna je například (pokud použiji původní škodlivý kód):

&amp;amp;#039; onmouseover=&amp;amp;#039;alert(1)&amp;amp;#039; foo=&amp;amp;#039;.jpg

Což je správně zaentinovaný útok. Prostě se všechny neobvyklé znaky (které nejsou v klasické latinské abecedě) zaentinují. Doufám, že jste článek pochopili, případně využijte komentářů níže pod článkem.

Generování čísel v PHP bez opakování v daném rozmezí pomocí rand

Pokud potřebujeme na stránce vygenerovat nějaké číslo v rozmezí, které zadáme, můžeme využít PHP. Začínáme!

Do proměnné $nahodnaCisla si pomocí array uložíme rozmezí čísel, ve kterých chceme generovat. Já jsem zvolil rozmezí 1 – 5000 (vyznačeno červeně v kódu), ale můžeme si zadat jakékoliv jiné rozmezí, třeba 2585 – 185005, nebo 1 – 10, je to na Vás. Rozmezí čísel vožíme mezi závorky a oddělíme čárkou, jako je to v kódu níže. Následně se nám do proměnné $cislo uloží vygenerované číslo. Zde je PHP kód:

PHP:

<?php
$nahodnaCisla = array();
do {
    $cislo = rand(1, 5000);
    if (!in_array($cislo, $nahodnaCisla)) $nahodnaCisla[] = $cislo;
} while (count($nahodnaCisla) < 5);
?>                     


Pokud bychom s vygenerovaných číslem chtěli dále pracovat, máme ho stále uložené v proměnné 
$cislo, kterou můžeme dále zpracovávat jinými skripty. Například poslat do databáze, uložit do souboru, atd…

Pokud bychom chtěli číslo vypsat uživateli pomocí funkce echo, přidáme na konec skriptu (před ?>) ještě tento kód:

echo $cislo;

Ten nám zajistí, že se vypíše samostatné číslo na řádek, které je stále uložené v proměnné $cislo na řádek. Jestli bychom ho ještě chtěli obohatit hláškou „Vygenerované číslo v rozmezí 1 – 5000 je…“, klidně můžeme. Živá ukázka. Na konec kódu (nejdříve bychom odstranili předchozí echo) bychom tedy ještě přidali: 

echo "Vygenerovan&#233; &#269;&#237;slo v rozmez&#237; 1 - 5000 je&nbsp;"; echo "<strong>";  echo $cislo; echo "</strong>";


Kompletně celý PHP kód i s výpisem by tedy mohl vypadat třeba takto:

<?php
$nahodnaCisla = array();
do {
    $cislo = rand(1, 5000);
    if (!in_array($cislo, $nahodnaCisla)) $nahodnaCisla[] = $cislo;
} while (count($nahodnaCisla) < 5);
echo "Vygenerovan&#233; &#269;&#237;slo v rozmez&#237; 1 - 5000 je&nbsp;";
echo "<strong>"; 
echo $cislo;
echo "</strong>";
?>                     


Živá ukázka