KMI/WEBA Webové aplikace: Seminář 04

PHP a MySQL

Jazyk PHP podporuje práci s celou řadou různých databází. Nejběžněji se, zejména v případě menších projektů, využívají MySQL a MariaDB databáze. Přestože jsou mezi MySQL a MariaDB rozdíly, mají mnoho společného. Pro jednoduchost se omezíme pouze na MySQL databázi.

Správa databáze

Databázi je možné spravovat přímo prostřednictvím příkazové řádky nebo klienta (pokud je k dispozici). Při použité ve webovém prostředí se často využívají jednoduché administrační nástroje jako například phpMyAdmin nebo velmi populární český projekt Adminer (oba jsou napsány v jazyce PHP). Správu databáze si samozřejmě můžeme naprogramovat sami, ale typicky se struktura databáze vytváří při vývoji a po nasazení se příliš nemění.

Propojení PHP a MySQL databáze

Pokud využíváme LAMP balíček, máme již MySQL databázi nainstalovanou a její podpora je v PHP aktivní. V jiných případech je obvykle nutné databázi nainstalovat a aktivovat mysqli rozšíření. Případně je možné využít i jiné (například PDO). Rozšíření se spravují v souboru php.ini. Následuje příklad připojení k databázi.

Připojení k databázi

<?php
  // připojení k lokální databázi (UNIX socket)
  $db_host = 'localhost'; // $db_host = '127.0.0.1'; // pro TCP/IP spojení
  $db_user = 'root';
  $db_password = 'root';
  $db_db = 'test';
  //$db_port = 8889; // pro TCP/IP spojení

  $mysqli = new mysqli(
    $db_host,
    $db_user,
    $db_password,
    $db_db,
    //$db_port // pro TCP/IP spojení
  );

  if ($mysqli->connect_error) {
    echo 'Error: '.$mysqli->connect_error;
    exit();
  }

  echo 'Success: A proper connection to MySQL was made.';
  echo '
'; echo 'Host information: '.$mysqli->host_info; echo '
'; echo 'Protocol version: '.$mysqli->protocol_version; $mysqli->close(); ?>

Dodejme, že výše uvedený kód ukazuje objektový přístup. mysqli rozšíření umožňuje pracovat s databází i čistě procedurálně. pdo je pouze objektové.

Dotaz na databázi

<?php
  // dotaz na databázi
  $query_result = $mysqli->query("SELECT * FROM users;"); 

  // výpis výsledků (převod na asociativní pole, lze i jinak)
  while ($row = $query_result->fetch_assoc()) {
    echo $row['id'], $row['name'], $row['surname'], $row['date'];
  }
?>

Ošetření vstupů

<?php
  // pozor, velmi nebezpečné hrozí SQL injection (např. 1' OR '1=1)
  $name = $_POST['name'] ?? null;
  $surname = $_POST['surname'] ?? null;

  if($name && $surname) {
    $mysqli->query("INSERT INTO users (name, surname, date) VALUES ('$name', '$surname', now());");
    echo $mysqli->error; 
  }
?>

Ošetření vstupů je možné provést pomocí funkce real_escape_string().

<?php
  // bezpečné řešení
  $name = $mysqli->real_escape_string($_POST['name']) ?? null;
  $surname = $mysqli->real_escape_string($_POST['surname']) ?? null;
?>

Případně je možné využít funkci prepare().

<?php 
  $name = $_POST['name'] ?? null;
  $surname = $_POST['surname'] ?? null;

  if($name && $surname) {
    $query = $mysqli->prepare("INSERT INTO users (name, surname, date) VALUES ('?', '?', now());");
    $query->bind_param("ss", $name, $surname);
    $query->execute();
  }
?>

Zadání

  1. úkol 1

    Rozšiřte administrační rozhraní o správu uživatelů. Je tedy třeba:

    • navrhnout vhodnou strukturu databáze;
    • v sekci users implementovat: výpis existujících uživatelů; přidání nového uživatele; editaci a smazání stávajících uživatelů (poznámka: výpis implementujte pomocí tabulky; na konci každého řádku, budou tlačítka s příslušnými operacemi);
    • přehled (výpis) posledních 10 přihlášených uživatelů v sekci dashboard.

    Uživatelé budou mít: jméno, příjmení, e-mail (slouží jako login), telefon, pracovnu (krátký text), popisek (delší text), heslo a příznak, zda jsou či nejsou správci. Pouze správci budou smět libovolně měnit uživatele.

  2. úkol 2

    Rozšiřte administrační rozhraní o autentizaci. Je tedy třeba: upravit přihlášení tak, aby ověřovalo přihlašovací údaje oproti databázi uživatelů.

  3. úkol 3 (dobrovolný)

    K výpisu všech uživatelů přidejte stránkování.

  4. úkol 4 (dobrovolný)

    Rozšiřte funkcionalitu tak, že přihlášený uživatel, který není správce, bude moci editovat své údaje.

  5. úkol 5 (dobrovolný)

    Vyzkoušejte administrační rozhraní phpMyAdmin a Adminer.