Pokud ve spolupráci s databází MariaDB (svobodný nástupce MySQL) využíváte programovací jazyk PHP verze => 8.4 (rok 2025) a k MariaDB přistupujete přes objektové rozhraní mysqli, můžete využívat speciálních objektových metod tohoto rozhraní, které práci s transakcemi zastřešují. Navíc je žádoucí v transakcích používat parametrizované dotazy.
Základem objektového přístupu k rozhraní mysqli a transakcím v PHP jsou tyto klíčové prvky:
$mysqli = new mysqli("localhost", "testik", "testik", "testik"); // přihlášení uživatele k databázi //============ zde transakce začíná ==============
Transakce jsou důležitým nástrojem pro zajištění konzistence dat v databázi. Umožňují seskupit více databázových operací do jednoho celku, který se buď celý provede, nebo se neprovedou žádné z jeho částí. Chcete-li používat transakce, musíte používat tabulky typu InnoDB. Jde o zachování integrity databáze. Zjednodušeně se to přirovnává k převodům peněz u bankovních účtů. Pokud odešleme nějakou čásku na bankovní účet příjemce, nejdříve se nám odečte částka z účtu a poté se přičte na účet příjemce. Ale co když po odečtení částky z našeho účtu se něco pokazí a částka se na účet příjemce nepřipíše? V takovém případě by odeslaná částka byla ztracena, zmizela. Je jasné, že takový případ nesmí nikdy nastat, v takovém případě je nutno používat transakce.
ACID
Transakce by měly splňovat takzvaná ACID pravidla. Tato zkratka je složena z počátečních písmen 4 vlastností správné transakce (angl. atomicity - A, consistency - C, isolation - I, durability - D):
atomicita - znamená že se operace provede celá, nebo vůbec. Neexistuje možnost že se provede pouze část
izolovanost - pokud běží více transakcí zároveň, neovlivňují se
trvalost - změny provedené transakcí jsou trvale uložené
Všechna pravidla ACID splňuje v PHP objektové mysqli rozhraní nad databází MariaDB (používá i google).
Příklad implementace transakce v PHP objektově s mysqli
Pro praktické vyzkoušení transakcí je třeba si v PHPMyadmin vytvořit databázi "testik", uživatele "testik" s heslem "testik", tabulky "ucty" a "prevody". V tabulce převody budou uložené všechny uskutečněné transakce. Samozřejmě to vytváříme na lokálním notebooku (PC), ne na serveru.
SQL pro vytvoření tabulky v konzoli nebo například v MyPHPadmin:
// zapsání do tabulky provedených transakcí, tento zkrácený zápis parametrizovaného dotazu je možno použít od PHP 8.2 $parametry = array($ucet_odesilatele,$ucet_prijemce,$castka); $mysqli->execute_query("INSERT INTO prevody (z_uctu_id, na_ucet_id, castka) values (?, ?, ?)", $parametry);
$mysqli->commit(); // potvrdit transakci } catch (Exception $e) { $mysqli->rollback(); // zrušit transakci echo "Něco se pokazilo, transakce byla zrušena! ".$e->getMessage()."<br>".$e->getTraceAsString()."<br>"; } // ================ ukončení transakce ====================
} // KONEC zpracování odeslaných dat z formuláře echo "<br>zobrazení zůstatků na účtech"; $vysledek = $mysqli->query("select * from ucty"); echo "<table class=\"tb_vypis\">\n"; echo "<tr><th>ucet_id</th><th>klient</th><th>aktualni_zustatek Kč</th></tr>"; // hlavička while ($zaznam = $vysledek->fetch_assoc()) { echo "<tr><td class=\"vypis_vpravo\">".$zaznam['ucet_id']."</td><td>".$zaznam['klient']."</td><td class=\"vypis_vpravo\">".number_format($zaznam['aktualni_zustatek'],2,',',' ')."</td></tr>"; } echo "</table>\n";
echo "<br>výpis převodů, transakcí"; $vysledek = $mysqli->query("select date_format(cas,'%d.%m.%Y %H:%i:%s') as 'čas',z_uctu_id as 'z účtu',klient,na_ucet_id as 'na účet',CONCAT(FORMAT(castka, 2, 'cs_CZ'),' Kč') as 'částka' from prevody join ucty on prevody.z_uctu_id=ucty.ucet_id order by prevod_id desc limit 20"); echo "<table class=\"tb_vypis\">\n"; echo "<tr><th>čas</th><th>z účtu</th><th>klient</th><th>".htmlspecialchars('->')."</th><th>na účet</th><th>částka</th></tr>"; // hlavička while ($zaznam = $vysledek->fetch_assoc()) { echo "<tr><td>".$zaznam['čas']."</td><td class=\"vypis_vpravo\">".$zaznam['z účtu']."</td><td>".$zaznam['klient']."</td><td>".htmlspecialchars('->')."</td><td class=\"vypis_vpravo\">".$zaznam['na účet']."</td><td class=\"vypis_vpravo\">".$zaznam['částka']."</td></tr>"; } echo "</table>\n";
$mysqli->close(); // ukončení spojení k MariaDB echo "</body>\n"; echo '</html>'; ?>
Provedete potřebné databázové operace uvnitř bloku try-catch.
Pokud vše proběhne v pořádku, uložíte změny voláním $mysqli->commit().
V případě chyby vrátíte databázi do předchozího stavu voláním $mysqli->rollback().
Tento přístup zajistí, že se buď všechny operace provedou, nebo se neprovedou žádné.
U výše uvedeného výpisu php kódu je třeba si všimnout u přihlašování k databázi ošetření chyb pomocí vyjímek. Často se stává, že vývojáři sice tvoří kód v objektovém stylu, ale zapomínají na ošetření chyb pomocí vyjímek. Místo toho používají zastaralý způsob ošetření chyb v objektovém programování pomocí návratové hodnoty funkce, což je špatně! Pro názornost takového špatného kódu si uvedeme příklad:
$conn = new mysqli(DB_HOST, DB_USER, PASVORTO, DATABAZE); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
Správné ošetření chybného přihlášení k databázi pomocí vyjímky
try { $mysqli = new mysqli(DB_HOST, DB_USER, PASVORTO, DATABAZE); // přihlášení uživatele k databázi if ($mysqli->character_set_name()!="utf8mb4") { $mysqli->set_charset("utf8mb4"); } // zjištění / změna kódování } catch (Exception $e) { exit("Do databáze se nelze připojit!<br />".$e->getMessage()); // při chybě ukončení s výpisem chybové hlášky }
ošetřená vyjímka
Na řádku 57 v souboru "index.php" je úmyslná chyba (místo '...ucty3...' má být '...ucty...'). Tímto se při zadání účtů a částky ve formuláři vyvolá vyjímka a její ošetření. Transakce je tím zrušena - stornována.
Objektové zpracování chybného přihlášení, ošetření zadávání a zobrazování českého formátu čísel (částek, zůstatků a měny), české zobrazování datumů, zpracování vyjímek
MySQLi objektově v PHP (ošetření PHP vyjímek v objektovém programování) Objektové zpracování přihlášení do databáze pomocí ošetření PHP vyjímek, ošetření transakcí pomocí vyjímek (commit = potvrzení transakce, rollback = zrušení transakce). try { ... } catch (Exception $e) { $mysqli->rollback(); ".$e->getMessage()."<br>"; }
Návod na zkrácený zápis parametrizovaného dotazu s execute_query Je možno používat execute_query() od PHP 8.2 a vyšší.
zadávání českého formátu čísel, částek // konverze českého čísla na number mariaDB standard PHP: $zdroj = array(" ",","); $cil = array("","."); $castka = str_replace($zdroj, $cil, $castka);
zobrazování českého formátu čísel, částek PHP: number_format($zaznam['aktualni_zustatek'],2,',',' ') SQL: CONCAT(FORMAT(castka, 2, 'cs_CZ'),' Kč') as 'částka'
české zobrazování datumů SQL: select date_format(cas,'%d.%m.%Y %H:%i:%s') as 'čas'
Upozornění
Interní funkce PHP používají hlavně hlášení chyb, výjimky používají pouze moderní objektově orientovaná rozšíření. Chyby však lze snadno převést na výjimky pomocí ErrorException. Tato technika však funguje pouze s nefatálními chybami.
Error exception
function exceptions_error_handler($severity, $message, $filename, $lineno) { throw new ErrorException($message, 0, $severity, $filename, $lineno); } set_error_handler('exceptions_error_handler');
Předali data tajným službám Americké bezpečnostní agentuře (NSA) předali data Microsoft, Yahoo, Google, Facebook...
Itálie preferuje open source Italský parlament schválil zákon, který nařizuje státním institucím pořizovat otevřený software před komerčním. To znamená LINUX místo MS-WINDOWS, LIBRE OFFICE místo MS OFFICE atd.
14.12. 2025 11:29:45
Redakční systém MRS
10 nečastějších zranitelností WEBU
Esperanto - univerzální mezinárodní jazyk
Kryptografie okolo nás - kniha popisuje využití kryptografie v běžném životě
SMS zdarma - posílání SMS zdarma
proč LINUX
základy LINUXU
Přepsání disku náhodnými daty
Software na úřadech - jeho otevřené alternativy
Řekněte sbohem Microsoftu
Rychlost připojení - změřte si svoji rychlost
SEO servis
Jak psát web
Zákony - občanský, autorský, obchodní zákoník atd.