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í
-
ú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.
-
ú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ů.
-
úkol 3 (dobrovolný)
K výpisu všech uživatelů přidejte stránkování.
-
úkol 4 (dobrovolný)
Rozšiřte funkcionalitu tak, že přihlášený uživatel, který není správce, bude moci editovat své údaje.
-
úkol 5 (dobrovolný)
Vyzkoušejte administrační rozhraní phpMyAdmin a Adminer.