PHP

PHP (Hypertextový Preprocesor, původně Personal Home Page) je multiplatformní skriptovací programovací jazyk, určený především pro programování dynamických internetových stránek (aplikací).

LAMP je často používaná zkratka pro kombinaci operačního systému GNU/Linux, webového serveru Apache, databázového systému MySQL (případně PostgreSQL) a PHP.

Příklad PHP skriptu, který zobrazí slovo Ahoj:

<?php
  echo "Ahoj";
?>

Další informace viz manuálové stránky PHP.

Vývojová prostředí pro PHP

Nabízejí PHP dokumentaci, šablony a zejména usnadňují psaní skriptů (třídy, funkce, procedury).

 

Print

Funkce print stejně tak konstruktor echo slouží pro vypsání obsahu na obrazovku.

Print je o něco málo pomalejší než echo, ale zato vrací hodnotu True nebo False. Způsob použití se dále liší při výpisu proměnné.

<?php
  $text = print "Jak se mate?"; // s echo toto neni mozne
  if($text) {
    echo “Výpis úspěšný:)“;
  }
?>

 Funkce print_r umožňuje navíc i vypsat obsah pole:

<?php
  $pole = array ('a' => 'délka', 'b' => 'šířka', 'c' => array ('x', 'y', 'z'));
  print_r ($pole);
?>

Poslední aktualizace souboru

Zobrazení poslední aktualizace souboru číselně:

<?
  /* aktualni soubor */
  $file = $_SERVER['SCRIPT_FILENAME'];
  /* cas zmeny souboru */
  $update = filemtime($file);
  /* aktualizace ciselne */
  echo "<p>Poslední aktualizace: " .date('d. n. Y – H:i\'s"', $update). "</p>";
?>

Zobrazení poslední aktualizace souboru slovně (české slovní zobrazení měsíce a dne v týdnu):

<?php
  /* aktualni cas */
  echo "<p>Nyní je " .date('l d. m. Y H:i\'s"'). ".</p>";
  /* aktualni soubor */
  $file = $_SERVER['SCRIPT_FILENAME'];
  /* cas zmeny souboru */
  $update = filemtime($file);
  /* aktualizace ciselne */
  echo "<p>Poslední aktualizace: " .date('d. n. Y – H:i\'s"', $update). "<br />";
  /* aktualizace slovne */
  $months = array('leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');
  $days = array('pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota', 'neděle');
  echo "Poslední aktualizace: " .$days[date('w', $update) - 1] ." ". date('j', $update). ". " .$months[date('n', $update) - 1] . date(' Y – H:i\'s"', $update). "</p>";
?>

 

Cvičení 8

PřílohaVelikost
php-1.zip1.82 MB
php-2.zip1.94 KB
php-3.zip5.47 KB

Datum

Český formát datumu:

<?php
  // Czech date
  $en = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
  $cz = array("ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince");
  $date = str_replace($en, $cz, date("j. F Y"));
  $datePlusOneDay = str_replace($en, $cz, date("j. F Y", strtotime('+1 day')));
  $dateMo = str_replace($en, $cz, date("j. F Y", strtotime('monday this week')));      
  $dateTu = str_replace($en, $cz, date("j. F Y", strtotime('tuesday this week')));
  $dateWe = str_replace($en, $cz, date("j. F Y", strtotime('wednesday this week')));
  $dateMoNext = str_replace($en, $cz, date("j. F Y", strtotime('monday next week')));
?>

Zobrazení intervalu mezi datumy ve dnech:

<?php
  $dateA = date_create('2014-11-12');
  $dateB = date_create('2014-10-13');
  $interval = date_diff($dateA, $dateB);
  echo $interval->format('%R%a days');
?>

Náhodná čísla

rand – generuje náhodná celá čísla v rozsahu 0-32767 (Windows):

<?php
  echo rand() . "\n";
  echo rand(3, 12); // cela cisla v rozsahu 3 az 12
?>

mt_rand – generuje náhodná celá čísla přibližně 4x rychleji než funkce rand

<?php
  echo mt_rand() . "\n";
  echo mt_rand(3, 12); // cela cisla v rozsahu 3 az 12
?>

Textové řetězce

Při zjišťování délky řetězce pozor na diakritiku např.:

  • funkce strlen není "UTF-8 fiendly"
    print strlen('Tomáš Daněk'); // 14 :(
  • existuje ovšem alternativní funkce mb_strlen u které stačí pouze nastavit správné kódování
    print mb_strlen('Tomáš Daněk', 'utf-8'); // 11

Trvalé přesměrování

Trvalé přesměrování URL adresy bez ztráty pozice ve vyhledávačích (úspěch není ovšem nikdy zaručen):

  1. Pokud možno, tak URL neměňte!
  2. Koupit doménu a přesunout web (web by neměl být funkční na obou doménách současně).
  3. U nového webu opravit veškeré staré URL na nové – projít skripty a databázi (zkontrolovat linky např. pomocí Xenu).
  4. V Google Webmaster Tools si zajistit ověřený přístup ke staré i nové doméně.
  5. Pomocí .htaccess (301) přesměrovat VŠECHNY URL starého webu na jeho novou url adresu (ne jen homepage)!!! Níže uvedené pravidlo přesměruje všechny stránky původní domény na novou:
    • RewriteEngine on
      RewriteRule (.*) http://www.nova-domena.cz/$1 [R=301,QSA]
  6. U nového webu vygenerovat nový sitemap.xml http://www.sitemaps.org/protocol.html Adresu sitemap.xml uvést v robots.txt viz http://www.sitemaps.org/protocol.html#submit_robots a odeslat ho do Google http://www.google.com/addurl/ a na Seznam http://search.seznam.cz/pridej-stranku (u Seznamu mě více možností nenapadá) a přidat ji také do Google Webmaster Tools do sekce Site Configuration » Sitemaps.
  7. V Google Webmaster Tools nastavit Konfigurace -> Změna adresy (Site configuration » Change of address)
  8. Původní doménu nerušit. Ideálně ji nechat fungovat s přesměrováním “navždy”.
  9. Opravit nejdůležitější zpětné odkazy. Prý je ktomu možné využít i operátor “link:” viz https://support.google.com/webmasters/answer/55281?hl=en případně sekce Your site on the web » Links to your site v Google Webmaster Tools.
  10. Kontrolovat chyby – serverové chyby na staré i nové doméně zachytávat do errorlogů a kontrolovat zejména chyby 404. Obdobně v Google Webmaster Tools sledovat sekci "Diagnostics » Crawl Errors”.
  11. Nastavit a sledovat Google Analytics.

Nouzové řešení:

<?php
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://tomas.dankovi.info/");
  header("Connection: close"); // fix IE bug
?> 

 

Chybová hlášení

V případě hledání chyb nebo problémů v PHP skriptu je vhodné zapnout zobrazování chybových hlášení.

Změnu nastavení je možné provést několika způsoby:

  • pomocí souboru .htaccess
    • PHP 4
      <IfModule mod_php4.c>
        php_value error_reporting 2047
        php_flag display_errors 1
      </IfModule>
      
    • PHP 5
      <IfModule mod_php5.c>
        #php_value error_reporting 6143 # PHP 5.2 a méně
        php_value error_reporting 30719 # PHP 5.3 a více
        php_flag display_errors 1
      </IfModule>
      
  • pomocí funkce error_reporting
    • PHP 5
      <?php
        ini_set("display_errors", 1);
        error_reporting(E_ALL);
        $x = 2 / 0;  //chyba deleni nulou
      ?>
  • pomocí souboru .user.ini
  • zápisem chyb do souboru
Úroveň zobrazování chyb
Popis error_reporting() PHP4 PHP5 PHP5.3
Nezobrazovat hlášení (implicitní) 0 0 0 0
Zobrazovat všechna hlášení E_ALL 2047  6143 30719
Zobrazovat pouze chyby a varování E_ERROR | E_WARNING | E_PARSE 7 7 7
Všechna hlášení, kromě notice E_ALL ^ E_NOTICE 2039 6135 30711
Všechna hlášení, kromě deprecated E_ALL ^ E_DEPRECATED - - 22527

 

Ochrana e-mailu proti spamu

Níže uvedený skript nabízí základní ochranu e-mailu zveřejněném na webu proti spam robotům. Převádí text e-mailové adresy na HTML entity a zobrazuje jej pomocí JavaScriptu.

<?php
  // javascript antispam e-mail link
  function antispamlink($email, $title){
    $return = "<script type=\"text/javascript\"><!--\ndocument.write('<a href=\"' + 'mailto:' + '";
    $offset = 0;
    while ($offset >= 0) {
      $code1 .= '&#'.ordutf8($email, $offset).';';
    }
    $offset = 0;
    while ($offset >= 0) {
      $code2 .= '&#'.ordutf8($title, $offset).';';
    }
    $return .= $code1."' + '\">' + '".$code2."' + '<\/a>');\n--></script>";
    return $return;
  }
  // utf-8 characters to ASCII (ord function isn't UTF-8 fiendly)
  function ordutf8($string, &$offset) {
    $code = ord(substr($string, $offset,1));
    if ($code >= 128) {  //otherwise 0xxxxxxx
      if ($code < 224) $bytesnumber = 2;  //110xxxxx
      else if ($code < 240) $bytesnumber = 3;  //1110xxxx
      else if ($code < 248) $bytesnumber = 4;  //11110xxx
      $codetemp = $code – 192 – ($bytesnumber > 2 ? 32 : 0) – ($bytesnumber > 3 ? 16 : 0);
      for ($i = 2; $i <= $bytesnumber; $i++) {
        $offset ++;
        $code2 = ord(substr($string, $offset, 1)) – 128;  //10xxxxxx
        $codetemp = $codetemp*64 + $code2;
      }
      $code = $codetemp;
    }
    $offset += 1;
    if ($offset >= strlen($string)) $offset = -1;
    return $code;
  }
  // print e-mail with title
  echo antispamlink("info@dhosting.cz","Bc. Tomáš Daněk");
?>