Jeronym.net

Tahák na PHP

PHP - PHP: Hypertext Preprocessor.

Užitečné odkazy

PHP a MYSQL bez předchozích znalostí

PHP a MySQL bez předchozích znalostí od Miloslav Ponkrác

Kapitola 1: Příprava

- statické vs. dynamické stránky - statické: i datum na stránce je pro ně nemožný.
- serverový vs. klientský skriptovací jazyk - klientský: efekty, animace, atd., serverový: komunikace s databází, poštou (tedy PHP). Další serverový skriptovací klienti: ASP, JSP, ASP.NET.

Kapitola 2: První krůčky v PHP

- echo '' (možno i " ") - výpis, i více, odděleno čárkou. Další řádek - použítí z HTML element br. Umí základní matematické operace.
- komentáře: // a # - jednořádkové, /* */ - víceřádkové.

Kapitola 3: Datové typy a proměnné

Datové typy

  • Textové řetězce
  • Čísla - celá, reálná. 0x před číslo - šestnácková sousta, 0 - osmičková. 12e3 = 12000.

- print_r() - tam kde přestává echo stačit. Vypisuje složitější datové typy.
- var_dump() - vypíše + ukáže o jaký datový typ se jedná.

Proměnné

- označujeme $.
- rušení proměnné - unset().
- názvy mohou obsahovat - písmena, čísla a podtržítko (_). Nesmí začínat číslovkou. Možno používat i české znaky (ale nedoporučuje se). Case sensitive.
- když chci do výpisu napsat speciální znak: zpětné lomítko \ před znak. \n - nový řádek, \t - tabulátor. Ještě se ale převádí přes HTML! a funguje jen ve dvojitých uvazovkách - ".
- použití proměnné s textovým řetězcem a přidání např. písmena ve výpisu - složené závory - { }, např. ${jmeno}.
- heredoc - <<<MMM, kde MMM je nějaký indentifikátor. Musí končit tím indentifikátorem na začátku řádky!
- spojování řetězců - tečkou .. .= připojení řetězce na konec textu (a rovnou tedy dělá řetězec např. u čísel).
- práce s jednotlivými znaky: $promenna[n], kde n je pořadí (od nuly).
- strlen() - délka stringu.

Kapitola 4: Podmínky

if

- úplný podmíněný příkaz:

  • if (podmínka)
  • příkaz, pokud je podmínka pravdivá;
  • else
  • příkaz, pokud je podmínka nepravdivá;

- neúplný podmíněný příkaz:

  • if (podmínka)
  • příkaz, pokud je podmínka pravdivá;
- die - okamžité ukončení skriptu. die("končím") - konec s hláškou končím.

Operátory porovnávání hodnot

  • == je rovno
  • != není rovno
  • <> není rovno
  • < je menší než
  • <= je menší nebo rovno než
  • > je větší než
  • >= je větší nebo rovno než

- bool, logický typ dat, boolean. Buď true nebo false.
- operátory porovnávání hodnot s kontrolou typu

  • === je rovno a jsou stejného typu
  • !== není rovno nebo nejsou stejného typu

- porovnání řetězců - dle ASCII, a také dle počtu znaků. A to i v případě např "10x"...
- porovnání text - číslo: pokud text obsahuje na začátku číslo, porovnává se s ním.

Logické operátory

  • ! negace. Rada - nešetřit závorkama.
  • and popř. && "a zároveň"
  • or popř. || "nebo", alespoň jedna podmínka pravdivá...

- využítí lenosti - pokud je u and první podmínka nepravdivá, dál už se tím nezaobírá. Pokud je u or první podmínka pravdivá, taky už to neřeší.

Kapitola 5: Matematické výpočty

Aritmetické operace

  • + sčítání
  • - odčítání
  • * násobení
  • / dělení. Pokud dělíme dvě celá čísla a výsledek může být taky celé číslo, je celé číslo. Zbytek reálné.
  • % zbytek po dělení

- ++ inkrementace - zvětšení o jedničku. Před a nebo za proměnou? $a++ vydá výsledek ještě před přičtením, ++$a už po přičtení.
- -- dekrementace - zmenšení o jedničku.
- zkrácený zápis přiřazení - $a = $a + 3 je totožné s $a += 3, apod.

Kapitola 6: Cykly a konstrukce switch

Cykly

  • while (podminka)
  • příkaz, který se bude cyklicky opakovat

- break() - přerušení cyklu.
- do while - nejdřív příkaz, po té podmínka. Narozdíl od while se příkaz vykoná alespoň jednou.

  • for (počáteční podmínka; podmínka; příkaz který se vykoná po každém cyklu)
  • příkaz, který se bude cyklicky opakovat

Switch

- switch - např. pro testování různých hodnot... Jede hodnoty od toho case, který splňuje podmínku. Takže vhodné použít break, viz př.

  • switch(proměnná)
  • case 1:
  • echo "proměnná = 1";
  • break;
  • case 2:
  • echo "proměnná = 2";
  • break;

- default - další možnost, nenajde-li příslušný case.

Kapitola 7: Pole

- $pole = array (1, 2, 3);. Pole - neomezená velikost. Výčet - dobré var_dump().
- count($pole) - vrátí počet údajů v poli.
- práce s indexy - hranáte závorky - [ ]. Index pole n - $pole[n]. Zadání libovolného indexu, např. $pole=array(5=>20, 6=>10), nebo-li index=>hodnota. Indexem může být i řetězec. Přidám prvek bez indexu - dá nakonec.
- některé pole předdefinované. Např. $_SERVER: index HTTP_USER_AGENT - informace o prohlížeči, SERVER_SOFTWARE - informace o serveru.

  • foreach ($pole as $prvek)
  • příkaz pro každý prvek

- $prvek - dočasné jméno pro prvek s daným indexem. Chci-li znát i index, tak foreach ($pole as $index => $prvek).
- řetězec je také takové pole. Mohu tedy např. měnit znaky - $retezec[3].

Kapitola 8: Funkce

- může být s parametrem, nebo prázdná. Více parametrů - oddělím čárkou.
- print() - vypíše, co bude v závorce. phpinfo() - info o PHP konfiguraci, sleep(n) - počká n sekund.
- vlastní funkce:

  • function vlastni_funkce()
  • tělo vlastní funkce;

- popř. v závorkách vstupní parametr.
- return - vrací návratovou hodnotu a končí funkci.
- globální a lokální proměnné - globální mimo funkce, lokální uvnitř. Navzájem se nevidí...

Kapitola 9: Formuláře

- viz HTML. (form - action="adresa" method="post", input type=text" name="jmeno", input type"submit" value="odeslat"...)
- strana PHP např. $jmeno=$_POST["jmeno"], popř. $_GET.
MP: formulář na téže stránce - isset() té dané proměnné. EDIT: Lepší použít !empty().

Kapitola 10: Práce s textem a regulární výrazy

- . tečka - zastupuje písmeno. Např. .ost může být kost, dost, most...
- [] - výčet znaků... [kd]ost - kost, dost. Také jde použít [A-Z] [0-9].
- [^] stříška - všechno krom nějakého znaku. [^k]ost - všechny krom kost.
- []* - libovolné opakování. [0-9] - třeba 23, 12345... může se opakovat i nulakrát!
- + - stejně jako *, ale musí být alespoň jednou.
- ? - předcházející znak libovolný... móda? - mód, móda.
- pozicování:
- ^ - začátek řádku.
- $ - konec řádku.
- seskupování: (), (ahoj)*.
- ereg(regul_vyraz, text) - porovnává a vrací hodnotu typu bool. eregi() - stejné, ale nerozlišuje malá a velká písmena.

Kapitola 11: Vkládání souborů

- include "soubor.php" - vkládání souboru - obsahu.
- require "" - stejné jako include "", ale pokud nenajde soubor, hlásí fatal error a skript se předčasně ukončí.
- include_once, require_once - vloží soubor pouze jednou (i když je napsáno víckrát).

Kapitola 12: Základy databází MySQL

- DBMS - DataBase Management System (CZ - SŘBD) - různé cenové relace, některé (za určitých podmínek) zdarma: Firebird, PostgreSQL, MySQL.
- SQL - Structured Query Language.
- založení databáze v phpMyAdmin - vytvořit databázi - název + utf8_czech_ci.
- více položek oddělujeme čárkou.
- SELECT - žádáme o data.
- SELECT seznam_sloupců FROM seznam_tabulek. Např. SELECT * FROM nazev_tabulky - zobrazí všechny záznamy v tabulce.
- FROM z tabulky... * - data ze všech sloupců. Ale * raději nepoužívat a pečlivě vše vypsat (v praxi se občas tabulky rozšíří o další sloupec a zbytečně by se přenášely data).
- ORDER BY sloupce - seřazení podle (i více sloupců). Na konci: ASC vzestupně, DESC sestupně.
- LIMIT počet_řádků - omezení výpisu. LIMIT 2,3 - přeskočí první dvě a vypíše další 3. Použití výhradně s ORDER BY.
- WHERE odfiltrování. Např. WHERE jmeno='Petr'.

Kapitola 13: MySQL v PHP

- mysqli = MySQL improved.
- mysqli_connect (adresa, jméno, heslo, databáze, port) - připojení k databázi.
- MP: připojení k databázi (u WEDOS) funguje jen na daných stránkách. Takže testy na localhost, zbytek nahrát a pak zkoušet.
- odpojení - mysqli_close (proměnná_databáze). Mělo by následovat na konci skriptu - slušný styl, ač by se odpojilo samo.
- zaslání dotazu: $dotaz=mysqli_query($db_spojeni, SQL PŘÍKAZ). Nic nevypíše.
- ochrana proti chybám:

  • if (!$vysledek)
  • die ('Chyba v příkazu SQL: '.mysqli_error($db_spojeni));

- převzetí dat, po řádkách - mysqli_fetch_array($vysledek). Více řádků - použití while ($radek = mysqli_fetch_array($dotaz)). Vrací hodnoty ve formě pole.

- praktické převzetí sloupce z řádku:
  • if (!$radek)
  • die ('Chyba');
  • $jmeno = $radek['jmeno']
  • echo $jmeno;

- MP: nastavení kódování (správné zobrazení znaků) viz. MySQL 4.1 – kódování: mysqli_query($db_spojeni, "SET CHARACTER SET utf8");
Před každým projektem vždy dobře navrhnout tabulku.
- INSERT - přidávání nových dat. INSERT INTO tabulka(seznam sloupců) VALUES (seznam hodnot).
- mysql_real_escape_string - escapuje speciální znaky v SQL dotazu. Použít jako ochrana při vkládání do SQL!
- MP: smazání celé tabulky v databázi: TRUNCATE TABLE table_name viz. Stackoverflow.
- MP: DATE_SUB("2017-06-15", INTERVAL 10 DAY) - sníží datum o interval a vrátí ho.

Kapitola 14: Odesílání e-mailů

- odesílání z localhost - nutno nastavit php.ini a sendmail.ini, viz Stackoverflow a také odstranit středníky! Restart XAMPPu.
- $prikaz = mail($emailova_adresa, 'Předmět', "Text","Hlavička");
- víceřádkový mail - řádkování pomocí \n. Použít dvojité závorky!
- více příjemců - oddělím čárkou.
- nastavení odesílatele - "hlavičky": $hlavicka="From:mail@neco.cz\n"; a poté vložit do funkce mail().
- možno využít na formulář pro psaní e-mailu autorovi.
- nastavení diakritiky - v hlavičce: Content-Type:text/html;charset=utf-8 (viz Stackoverflow), např. $hlavicka = "From:odesílatel@seznam.cz\nContent-Type:text/html;charset=utf-8\n"; a po té používat br element (typ - html).
- výsledný jednoduchý kód může vypadat tedy nějak takto:

  • $email = "prijemce@neco.cz";
  • $hlavicka = "From:odesílatel@seznam.cz\nContent-Type:text/html;charset=utf-8\n";
  • $vysledek = mail($email, "předmět", "text","$hlavicka");
  • if ($vysledek) {...

Kapitola 15: Sdílení dat mezi webovými stránkami

- session_start() - začátek sezení na stránku - ještě před !DOCTYPE html!!!.
- pak ukládám proměnné a přistupuji k nim pomoci $_SESSION_proměnná.
- změna doby session - (XAMMP - session.gc_maxlifetime v php.ini, v kódu - manuálně, např. pomocí proměnné timeout - viz. BYTES.



Moje postřehy

- date() - datum. Formát - např. date('d-m-Y'). Když chci třeba jen den, tak date("d").
- sleep(int seconds) - spánek programu... jakoby se načítalo.
- ovlivnění jazyka HTML - přerušení PHP skriptu a vložení CSS stylu (style). Nebo také - přerušit HTML a vložit proměnou pomocí echo.
- time() - Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
- nadřezený adresář - ../...
- řazení multidimenzionálního pole: array_multisort - řadí dle prvního sloupec. Více sloupců? Vytvořím pole, které obsahuje jen daný sloupec. Funkcí foreach "vyzobám" potřebný sloupec. Pak seřadím pomocí array_multisort($serazeneHodnotySloupce, $poleCoChciSeradit).

  • $arraySortPrice = array();
  • foreach ($products as $arrayEntry) {
  • $arraySortPrice[] = $arrayEntry["price"];
  • }
  • array_multisort($arraySortPrice, $products);
  • print_r($products);

- při použití CSS jako PHP (styles.php) - vložit /*<style>/**/!!! Takovej hack.
- date formáty čas: H:i:s - 18:47:25.
- date_default_timezone_set('Europe/Prague') - nastavení časového pásma. Jiné timezones.
- password_hash - vytvoří otisk hesla (bezpečné uložení).
- error: cannot modify header - žádné jiné header ani echo před header...



Nějaké výpisky z ITnetwork

- když dáme text do apostrofů ', zobrazí se přesně co je tam udáno. I názvy proměnných, odřádkování a tak. Hodí se, když třeba potřebujeme užít uvozovky.
- do uvozovek můžeme rovnou vkládat proměnné.
- array_sum($pole) - součet prvků v poli.
- $_GET, $_POST superglobální pole. Vhodné např. pro podstránky.
- $pole = array('indexpole' => array ('indexpolevpoli' => 'prvek') - např. když potřebuji více prvků o více hodnotách...
- ternární výraz: $jmeno = (isset($_POST['jmeno'])) ? $_POST['jmeno'] : ''; - pokud splněna podmínka, vloží do výrazu...
- vypsání pouze proměnné v PHP skriptu - zkrácená direktiva <?=.
- útok XSS (Cross Site Scripting) - vkládání HTML kódu do formuláře. Obrana - htmlspecialchars() před každým vypsáním do html!
- formuláře přes table...
- přesunutí na jinou lokaci - header('Location: stranka.php'); a pak exit; (ukončení skriptu). Ale žádný output před header! Také možnost použití adresy s GET - předám parametry.

Stránky s obsahem via PHP

- odkazy pomocí: href="index.php?stranka=domu", či "$stranka . '/index.php'"
- různé if - jestli není nastavena, tak "domů", pak preg_match('/^[a-z0-9]+$/', $stranka) pro ochranu, file_exists('odkaz/'.$stranka.'.html')...
- krom require a include také file_get_contents('podstranky/' . $_GET['stranka'] . '.html');. Ale může nechtěně vypsat i větev... Nebezpečné.

- pow - mocnina.
- array_push - přidání na konec pole, array_search hledání v poli.
- přístup k 2D poli: $pole[][].
- práce s textem - začínají prefixem mb_ = MultiByte.
- mb_internal_encoding("UTF-8") - nastavení kódování UTF-8.
- mb_strlen() - délka textu.
Nutno používat mb_! Jinak počítá špatně (např. Č = 2 znaky).
- mb_strtoupper() - převede na malá písmena.
- mb_strpos() - porovnání řetězce s podřetězcem. Vrací 0 v případě, že je podřetězec na první pozici a false v případě, že nebyl nalezen.
- mb_strrpos() - navíc "r", jako reverse. Hledá od konce...
- mb_substr($text, 6, 4); - vezme podřetězec od 7 znaku, 4 znaky dlouhý. Používat i pro konkrétní jeden znak. Nepracovat s textem jako s polem (nepodporuje UTF-8).
- str_replace('@', '(zavináč)', $adresa); - nahrazení.
- strtr($text_k_oprave, $slovnik) - nahrazení ze slovníku. Slovník - pole.
- explode() - rozdělí řetězec na prvky pole podle nějakého spojovníku (tzv. glue). implode() zas spojí.

Další důležité funkce pro práci s textem:

  • mb_strtolower - převede všechna písmena v rětězci na malá.
  • trim - odstraní bílé místo na okolo řetězce.
  • htmlspecialchars - převede speciální znaky v textu na HTML entity.
  • htmlspecialchar­s_decode - převede entity v textu zpět na speciální znaky.
  • strip_tags - odstraní z daného řětězce HTML tagy.
  • nl2br - nahradí konce řádků (\n) tagem
  • hash - vypočítá otisk (hash) řetězce, což budeme potřebovat pro ukládání hesel.

Vlastní funkce

- přehlednost.
- DRY - Do not Repeat Yourself. Odsouzení duplikování kódu. Zabalení do funkce.
- možnost použití knihoven.
- function nazev() {} - mělo by být psáno camelCasem. Měla by dělat jednu věc (2 věci, 2 funkce). Dobré psát v imperativu. Vstup: function nazev($a, $b) {}.
- bere jen co je na vstupu. Nepoužívat global...
- návratová funkce:

  • function() {
  • return $promenna
  • }

- MP - MySQL: SELECT DATE_FORMAT(datum, '%Y-%m-%d') nazev FROM - vezme jen DATE z DATETIME sloupce "datum". "nazev" - název pro uložení v poli.

Knihovny

- "vložení" funkce do souboru pomocí require, popř. require_once.

Databáze v PHP pro začátečníky

- INT - celá čísla, VARCHAR - krátký text, DATE - datum.
- klíč - PRIMARY, zaškrnutí A_I. Nastavení tzv. primárního klíče tabulky. Klíče nám pomáhá identifikovat položku v tabulce (třeba při mazání).
- možno dodatečně přidat sloupec...
- databázové ovladače jsou 3. Zastaralé mysql, pak mysqli a ještě PDO.

OOP v PHP

Objektově orientované programování v PHP.
- class Třída {} - definuji.
- mohu vkládat function.
- __construct(vstupni parametry) - konstruktor třídy. Také __destruct()

Knihovny

- framework - soubor knihoven.

Použítí Composeru

  • Nainstalovat Composer
  • Vytvořit composer.json v kořenovém adresáři (přes cmd - v kořenovém adresáři composer init) (návod ITnetwork)
  • Stažení požadované knihovny: composer require hoa/regex
  • require knihovny v projektu (soubor index.php) - require_once __DIR__ . '/composer/autoload_real.php';

PHP a MYSQL bez předchozích znalostí

PHP 6, MySQL, Apache

Vytváříme webové aplikace

1 Konfigurování instalace

- "AMP" - Apache, MySQL, PHP.
- nastavení databáze MySQL - oprávnění: SHOW COLUMNS FROM user FROM mysql. Zadaní uživatelé: SELECT user, host FROM mysql.user. Bezpečnost - odeberu (delete) prázdného uživatele localhost. Přidání uživatelé - tzv. GRANT.