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:

2. místo v soutěži Junior Internet!

Ahoj,

v sobotu 28. března 2015 jsem zavítal na konferenci Junior Internetu, dostal jsem se mezi tři finalisty z kategorie Web – mladší a obsadil jsem krásné 2. místo z celé ČR!!!

V dopoledním programu jsem tam měl šesti (sedmi) minutovou přednášku o tomhle projektu MůjSkript.cz. V odpoledním programu jste si mohli poslechnou odborné přednášky např. 

  • Davida Vávry z Avastu o aplikacích pro chytré hodinky
  • Lukáše Hurycha z Twista o rozjetí vlastního podniku
  • Petra de Giera a Jakuba Vágnera o různých IT technologiích
  • Vítka Ježka z manGoWebu o tom, za co by se upsal ďáblu

Celý den byl nabitý hodně zajímavými tématy a obory. Moc jsem si ho užil! Na Twitteru můžete najít nějaké tweety pod hashtagem #JuniorNet15. Tak hledejte 😉

Soutěže Junior Internetu byly rozděleny do čtyř kategorií:

  • JuniorWeb
  • JuniorDesign
  • JuniorText
  • JuniorMobile

Já byl hned v té první. A byl jsem druhý 😀 (jenom, že se to hezky rýmuje…). Pokud máte zájem, můžete si prohlédnout můj diplom z téhle soutěže v PDF, nebo jako obrázek. Kompletní výsledkovou listinu najdete na oficiálním webu pod záložkou Konference. Fotky z konference najdete níže, nebo oficiální fotky tady.

 

Díky za skvělou konferenci!

Tomáš Jareš 🙂

 

Tady přikládám čtyři obrázky. Na prvních třech jsem já. Na posledním je vyfocen celý sál při poslední odpolední přednášce.

 

 

 

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);
 ?>

Zálohování databáze MySQL a uložení do souboru .sql

Dneska jsem na internetu narazil na zajímavý PHP skript, který Vám zazálohuje databázi MySQL a soubor ve formátu .sql uloží do souboru. Sám tento skript už používám.

Upravil jsem si ho tak, aby generoval název ve tvaru mysql-zaloha-21-03-2015_09-17-28_PM.sql. Takže přímo vím, ze kdy záloha DB pochází. Navíc tenhle skript spouštím pomocí cronu jednou za 12 hodin, takže se o nic nestarám a vše se mi zálohuje samo.

Bezva!

 

Stačí si v dolní části upravit jenom adresu serveru, název DB, jméno a heslo:

<?php
function zalohuj($db,$soubor=""){
 $text="";
 
 function keys($prefix,$array){
 $array=Array();
 $radky="";
 $pocet = count($array);
 $posledni = $pocet-1;
 if($pocet == 0)
 return;
 for($i = 0; $i<$pocet; $i++){
 if($i != $posledni)
 $carka = ",";
 else
 $carka = "";
 $radky .= "`$array[$i]`$carka";
 }
 return ",\n$prefix($radky)";
 }
 
 $sql = mysql_query("SHOW TABLE STATUS FROM $db");
 
 
 while($data = mysql_fetch_array($sql)){
 $PRI=$UNI=$MUL="";
 
 $text .= "--\n-- Struktura tabulky $data[0]\n--\n\n";
 $text .= "CREATE TABLE `$data[0]`(\n";
 $sqll = mysql_query("show columns from $data[0]") or die ("Nastala chyba: " . mysql_error());
 $e = true;
 while($dataa = mysql_fetch_array($sqll)){
 if($e){
 $e = false;
 }
 else
 $text .= ",\n";
 $null = ($dataa[2] == "NO")? "NOT NULL":"NULL";
 $default = !empty($dataa[4])? " DEFAULT '$dataa[4]'":false;
 
 
 if($default == " DEFAULT 'CURRENT_TIMESTAMP'") $default = " DEFAULT CURRENT_TIMESTAMP";
 if($dataa[3] == "PRI") $PRI[] = $dataa[0];
 if($dataa[3] == "UNI") $UNI[] = $dataa[0];
 if($dataa[3] == "MUL") $MUL[] = $dataa[0];
 $extra = !empty($dataa[5])? " ".$dataa[5]:false;
 $text .= "`$dataa[0]` $dataa[1] $null$default$extra";
 }
 $primary = keys("PRIMARY KEY",$PRI);
 $unique = keys("UNIQUE KEY",$UNI);
 $mul = keys("INDEX",$MUL);
 $text .= "$primary$unique$mul\n) ENGINE=$data[Engine] COLLATE=$data[Collation];\n\n";
 unset($PRI,$UNI,$MUL);
 #data
 $text .= "--\n-- Data tabulky $data[0]\n--\n\n";
 $query = mysql_query("SELECT * FROM $data[0]");
 while($fetch = mysql_fetch_array($query)){
 $values="";
 $pocet_sloupcu = count($fetch)/2;
 $i = 0;
 while($i < $pocet_sloupcu){
 if($i < $pocet_sloupcu-1)
 $carka = ",";
 else
 $carka = "";
 $values .= "'".mysql_escape_string($fetch[$i])."'$carka";
 $i++; 
 }
 $text .= "\nINSERT INTO `$data[0]` VALUES($values);";
 unset($values);
 }
 }
 
 if(!empty($soubor)){
 $fp = @fopen($soubor,"w+");
 $fw = @fwrite($fp,$text);
 @fclose($fp);
 }
 
 return $text;
}
 
$hostiteldb="server";
$jmenodb="uzivatel";
$heslodb="heslo";
$db="databaze";
 
mysql_connect($hostiteldb, $jmenodb, $heslodb);
mysql_query("SET NAMES 'utf8'");
mysql_select_db($db);
 
$text = zalohuj($db,"mysql-zaloha".date("-d-m-Y\_h-i-s\_A").".sql");
echo "<textarea>$text</textarea>";
?>

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 🙂

Vlastní doména lokálního serveru

Pokud máte na svém počítači nainstalovaný lokální webový server a nebaví Vás neustále zadávat do prohlížeče adresy typu http://localhost/projekty/projekt1/soubor.php, existuje možnost, jak si tuto práci ulehčit. Ne, opravdu nemyslím záložky v prohlížeči…

Kapitoly:

Předem chci říct, že na klasickém webhostingu toto nefunguje. Provozovatel Vám totiž většinou nedá k souboru httpd.conf přístup. Ale my chceme mít lokální doménu, takže nebudeme řešit hostingy, ke kterým si již domény většinou kupujeme. Taktéž tento postup funguje pouze na systému Windows (kvůli souboru hosts).

 

Dejme třeba tomu, že namísto již zmíněné adresy chceme do prohlížeče zadat třeba jen projekt.1/soubor.php.

Využijeme k tomu dva soubory – httpd.conf a Windowsácký soubor hosts (bez přípony).

Soubor httpd.conf na serveru

Nejdříve si otevřeme konfigurační soubor našeho Apache serveru – httpd.conf. Většinou bývá ve složce apache, ale u každého balíku instance to může být trochu jinak. Po otevření souboru vložme na konec souboru tyto řádky:

     
  ServerAdmin localhost                      #e-mailova adresa admnistratora 
  DocumentRoot "C:/lokalni/cesta/ke/slozce/ktere/chceme/vytvorit/domenu"     

  ServerName domena.lokalni                  #nazev domeny
  ServerAlias www.domena.lokalni             #pripadna verze s www (cely tento radek muzete smazat)  
  ErrorLog "logs/soubor-error.log"           #soubory s logy
  CustomLog "logs/soubor-access.log" common  #soubory s logy   
  <Directory "C:/lokalni/cesta/ke/slozce/ktere/chceme/vytvorit/domenu">         
    Options -Indexes +FollowSymLinks         
    AllowOverride all
  </Directory>     
   

Jediné, co vlastně v tomto souboru musíme změnit je třetí řádek s DocumentRoot, kde jen dolníte správnou lokální, absolutní cestu ke složce, které chceme vytvořit lokální doménu. To samé ještě upravíte na osmém řádku začínajícím <Directory.

A naposledy ještě upravíte řádky s ServerName a ServerAlias. Tam si zadáte to, co chcete používat jako lokální doménu. ErrorLog a CustomLog není povinný, ale doporučuji jej využívat pro chybové hlášky a logy přístupů.

Soubor hosts ve Windows

Posledním krokem, aby Vám vše fungovalo je nutno si na počítači, na kterém chcete přistupovat přes doménu je upravit soubor hosts.

Najdete ho na tomto umístění C:WindowsSystem32driversetchosts. Tento soubor je již vytvořený a nemá příponu!

Na konec souboru (většinou je prázdný) vložte:

domena.lokalni 127.0.0.11
www.domena.lokalni 127.0.0.1

Což nám zajistí, že na tomto počítači se nám vlastně nastaví DNS záznamy pro tuto doménu na náš lokální server (127.0.0.1). A tam už si to dokáže poskládat sám soubor httpd.conf.

 

Máte-li dotaz, přispějte do komenářů 🙂

 

Horní a dolní index textu – značky sup a sub

Nedávno jsem potřeboval na jeden web vložit značku metrů čtverečních, tedy m2. Té dvojce jsem ale potřebpval nastavit horní index (je odsazena výše). Dnes si ukážeme, jak na to…

Kapitoly:

 

Horní index

Horní index si můžeme představit třeba takto: nějaký text v horním indexu. Uplatnění najdeme především v aritmetice a geometrii, kde chceme zapsat metry čtvereční, nebo třeba metry krychlové.

Pro zápis horního indexu použijeme párovou značku <sup> a </sup>, kterou obalíme potřebné znaky, které chceme vyvýšit a zmenšit jim trochu velikost písma – font-size v CSS jistě znáte :-)

Kompletní názorná ukázka pro 28 metrů čtverečních by mohla vypadat třeba takhle:

Obývací pokoj má 28 m<sup>2</sup>.

Tímto zápisem nám vznikne tato věta:

Obývací pokoj má 28 m2.

 

Dolní index

Využití dolního indexu již není tak časté, ale lze jej zapsat velmi podobnou párovou značkou <sub> a </sub>. Pozor, zde je rozdíl pouze v jediném písmenku – sub a sup! Já si to často pletu… Ukázka dolního indexu by vypadala například takto:

Píšeme text a najednou potřebujeme <sub>dolní index</sub>.

Ukázka výsledku:

Píšeme text a najednou potřebujeme dolní index.

 

Závěrečná ukázka

Záverečné shrnutí:

  • Pro horní index používáme párovou značku <sup>
  • Pro dolní index používáme párovou značku <sub>

Živá ukázka