sql >> Databáze >  >> RDS >> Access

Proč byste měli používat PHP PDO pro přístup k databázi

Mnoho programátorů PHP se naučilo, jak přistupovat k databázím pomocí rozšíření MySQL nebo MySQLi. Od PHP 5.1 existuje lepší způsob. PHP Data Objects (PDO) poskytují metody pro připravené příkazy a práci s objekty, díky kterým budete mnohem produktivnější!

Generátory a rámce CRUD

Databázový kód se opakuje, ale je velmi důležité, aby byl správný. Zde přichází na řadu generátory a frameworky PHP CRUD – šetří vám čas automatickým generováním celého tohoto opakujícího se kódu, takže se můžete soustředit na jiné části aplikace.

Na CodeCanyon najdete generátory a rámce CRUD, které vám pomohou dodávat produkty vynikající kvality včas. (CRUD je zkratka pro vytváření, čtení, aktualizaci a mazání – základní manipulace s databází.)

  • Užitečné PHP CRUD generátory a rámce PHP9 dostupné na CodeCanyonFranc Lucas
  • PHPrychle vytvořte rozhraní PHP CRUD s nástroji PDO Advanced CRUD Generator ToolSajal Soni

Úvod do CHOP

PDO – PHP Data Objects – jsou vrstvou pro přístup k databázi, která poskytuje jednotnou metodu přístupu k více databázím.

Nezohledňuje syntaxi specifickou pro databázi, ale může umožnit, aby byl proces přepínání databází a platforem poměrně bezbolestný, jednoduše tím, že v mnoha případech přepnete připojovací řetězec.

Tento tutoriál není zamýšlen jako úplný návod na SQL. Je napsán především pro lidi, kteří aktuálně používají mysql nebo mysqli rozšíření, které jim pomůže přejít na přenosnější a výkonnější PDO.

Pokud jde o databázové operace v PHP, PDO poskytuje mnoho výhod oproti surové syntaxi. Pojďme si jich rychle uvést:

  • abstrakce vrstva
  • objektově orientovaná syntaxe
  • podpora připravených výpisů
  • lepší zpracování výjimek
  • zabezpečená a opakovaně použitelná rozhraní API
  • podpora všech oblíbených databází

Podpora databáze

Rozšíření může podporovat jakoukoli databázi, pro kterou byl napsán ovladač PDO. V době psaní tohoto článku jsou k dispozici následující ovladače databáze:

  • PDO_DBLIB (FreeTDS/Microsoft SQL Server/Sybase)
  • PDO_FIREBIRD (Firebird/Interbase 6)
  • PDO_IBM (IBM DB2)
  • PDO_INFORMIX (IBM Informix Dynamic Server)
  • PDO_MYSQL (MySQL 3.x/4.x/5.x)
  • PDO_OCI (Rozhraní volání Oracle)
  • PDO_ODBC (ODBC v3 (IBM DB2, unixODBC a win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 a SQLite 2)
  • PDO_4D (D)

Všechny tyto ovladače nemusí být nutně k dispozici ve vašem systému; zde je rychlý způsob, jak zjistit, které ovladače máte:

print_r(PDO::getAvailableDrivers());

Připojování

Různé databáze mohou mít mírně odlišné způsoby připojení. Níže vidíte způsob připojení k některým z nejpopulárnějších databází. Všimnete si, že první tři jsou identické, kromě typu databáze – a SQLite má svou vlastní syntaxi.

zkuste { # MS SQL Server a Sybase s PDO_DBLIB $DBH =nové PDO("mssql:host] =$hostitel;dbname=$dbname", $user, $pass); $DBH =new PDO("sybase:host=$host;dbname=$dbname", $user, $pass); # MySQL s PDO_MYSQL $DBH =nové PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # SQLite Database $DBH =new PDO("sqlite:my/database/path/database.db");}catch(PDOException $e) { echo $e->getMessage();}

Všimněte si prosím bloku try/catch. Vždy byste měli své operace PDO zabalit do pokusu/úlovku a použít mechanismus výjimek – více o tom brzy. Obvykle vytvoříte pouze jedno připojení – je jich několik, které vám ukáží syntaxi. $DBH je zkratka pro 'database handle' a bude používána v tomto tutoriálu.

Jakékoli připojení můžete ukončit nastavením úchytu na hodnotu null.

# zavřít spojení$DBH =null;

Další informace o možnostech specifických pro databáze a/nebo připojovacích řetězcích pro jiné databáze můžete získat z PHP.net.

Výjimky a CHOP

PDO může používat výjimky ke zpracování chyb, což znamená, že vše, co děláte s PDO, by mělo být zabaleno do bloku try/catch. PDO můžete vynutit do jednoho ze tří chybových režimů nastavením atributu chybového režimu na nově vytvořeném popisovači databáze. Zde je syntaxe:

$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );$DBH->setAttribute( PDO::::setAttribute( PDO:::::ERRMODE_EXCEPTION );

Bez ohledu na to, jaký režim chyby nastavíte, chybové připojení vždy vyvolá výjimku a vytvoření připojení by mělo být vždy obsaženo v bloku try/catch.

PDO::ERRMODE_SILENT

Toto je výchozí chybový režim. Pokud jej necháte v tomto režimu, budete muset zkontrolovat chyby způsobem, na který jste pravděpodobně zvyklí, pokud jste použili mysql nebo mysqli rozšíření. Další dvě metody jsou vhodnější pro programování DRY.

PDO::ERRMODE_WARNING

Tento režim vydá standardní varování PHP a umožní programu pokračovat v provádění. Je to užitečné pro ladění.

PDO::ERRMODE_EXCEPTION

Toto je režim, který chcete ve většině situací. Vyvolá výjimku, která vám umožní elegantně zpracovat chyby a skrýt data, která by mohla někomu pomoci zneužít váš systém. Zde je příklad využití výjimek:

# připojení k databázitry { $DBH =new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); # A JÉ! Místo SELECT zadali DELECT! $DBH->prepare('DELECT name FROM people');}catch(PDOException $e) { echo "Omlouvám se, Dave. Obávám se, že to nedokážu."; file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);}

V příkazu select je záměrná chyba; to způsobí výjimku. Výjimka odešle podrobnosti o chybě do souboru protokolu a zobrazí uživateli přátelskou (nebo ne tak přátelskou) zprávu.

Vložit a aktualizovat

Vkládání nových dat (nebo aktualizace stávajících dat) je jednou z běžnějších databázových operací. Při použití PHP PDO se obvykle jedná o dvoukrokový proces. Vše, co je uvedeno v této části, platí stejně pro UPDATEINSERT operace.

Zde je příklad nejzákladnějšího typu vložky:

# STH znamená "Popis prohlášení"$STH =$DBH->prepare("INSERT INTO folks ( first_name ) values ​​( 'Cathy' )");$STH->execute();

Stejnou operaci můžete provést také pomocí exec() s jedním voláním méně. Ve většině situací budete používat delší metodu, abyste mohli využít připravené příkazy. I když jej budete používat pouze jednou, použití připravených příkazů vám pomůže ochránit se před útoky SQL injection.

Připravené výpisy

Použití připravených příkazů vás ochrání před injekcí SQL.

Připravený příkaz je předkompilovaný příkaz SQL, který lze provést vícekrát odesláním pouze dat na server. Má další výhodu v tom, že automaticky chrání data použitá v zástupných symbolech před útoky SQL injection.

Připravený příkaz použijete zahrnutím zástupných symbolů do vašeho SQL. Zde jsou tři příklady:jeden bez zástupných symbolů, jeden s nepojmenovanými zástupnými symboly a jeden s pojmenovanými zástupnými symboly.

# žádné zástupné symboly - zralé pro SQL Injection!$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​($name, $addr, $city)"); # unnamed placeholders$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​(?, ?, ?)"); # named placeholders$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​(:name, :addr, :city)");

Chcete se vyhnout první metodě; je to tady pro srovnání. Volba použití pojmenovaných nebo nepojmenovaných zástupných symbolů ovlivní, jak nastavíte data pro tyto příkazy.

Nepojmenované zástupné symboly

# přiřaďte proměnné každému zástupnému symbolu, indexované 1-3$STH->bindParam(1, $name);$STH->bindParam(2, $addr);$STH->bindParam(3, $city); # vložit jeden řádek$name ="Daniel"$addr ="1 Wicked Way";$city ="Arlington Heights";$STH->execute(); # vložte další řádek s různými hodnotami$name ="Steve"$addr ="5 Circle Drive";$city ="Schaumburg";$STH->execute();

Jsou zde dva kroky. Nejprve přiřadíme proměnné k různým zástupným symbolům (řádky 2–4). Poté těmto zástupným symbolům přiřadíme hodnoty a provedeme příkaz. Chcete-li odeslat další sadu dat, stačí změnit hodnoty těchto proměnných a provést příkaz znovu.

Zdá se vám to u příkazů se spoustou parametrů trochu nepraktické? To je. Pokud jsou však vaše data uložena v poli, existuje jednoduchá zkratka:

# data, která chceme vložit$data =array('Cathy', '9 Dark and Twisty Road', 'Cardiff'); $STH =$DBH->prepare("INSERT INTO people (jméno, adresa, město) hodnoty (?, ?, ?)");$STH->execute($data);

To je snadné!

Data v poli platí pro zástupné symboly v pořadí. $data[0] přejde do prvního zástupného symbolu $data[1] druhý atd. Pokud však vaše indexy pole nejsou v pořádku, nebude to fungovat správně a budete muset pole přeindexovat.

Pojmenované zástupné symboly

Syntaxi pravděpodobně uhodnete, ale zde je příklad:

# prvním argumentem je jméno pojmenovaného zástupného symbolu - upozornění jmenované# zástupné symboly vždy začínají dvojtečkou.$STH->bindParam(':name', $name);

Zde můžete také použít zkratku, ale ta funguje s asociativními poli. Zde je příklad:

# data, která chceme vložit$data =array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' ); # zkratka!$STH =$DBH->prepare("INSERT INTO people (name, addr, city) value (:name, :addr, :city)");$STH->execute($data); 

Klíče vašeho pole nemusí začínat dvojtečkou, ale jinak musí odpovídat pojmenovaným zástupným symbolům. Pokud máte pole polí, můžete je iterovat a jednoduše zavolat execute s každým polem dat.

Další příjemnou funkcí pojmenovaných zástupných symbolů je možnost vkládat objekty přímo do databáze za předpokladu, že vlastnosti odpovídají pojmenovaným polím. Zde je příklad objektu a jak byste provedli vložení:

# a simple objectclass person { public $name; public $addr; veřejné $město; funkce __construct($n,$a,$c) { $toto->jmeno =$n; $this->addr =$a; $toto->město =$c; } # atd ...} $cathy =nová osoba('Cathy','9 Dark and Twisty','Cardiff'); # tady je ta zábavná část:$STH =$DBH->prepare("INSERT INTO people (name, addr, city) value (:name, :addr, :city)");$STH->execute((array)$ cathy);

Přetypování objektu do pole v execute znamená, že vlastnosti jsou považovány za klíče pole.

Výběr dat

Data se získávají pomocí ->fetch() , metoda zpracování vašeho příkazu. Před voláním funkce fetch je nejlepší sdělit PDO, jak chcete data načíst. Máte následující možnosti:

  • PDO::FETCH_ASSOC : vrátí pole indexované podle názvu sloupce.
  • PDO::FETCH_BOTH (výchozí): vrací pole indexované podle názvu i čísla sloupce.
  • PDO::FETCH_BOUND : přiřadí hodnoty vašich sloupců proměnným nastaveným pomocí ->bindColumn() metoda.
  • PDO::FETCH_CLASS : přiřadí hodnoty vašich sloupců vlastnostem pojmenované třídy. Pokud odpovídající vlastnosti neexistují, vytvoří vlastnosti.
  • PDO::FETCH_INTO : aktualizuje existující instanci pojmenované třídy.
  • PDO::FETCH_LAZY :kombinuje PDO::FETCH_BOTH /PDO::FETCH_OBJ , vytváří názvy proměnných objektu tak, jak jsou používány.
  • PDO::FETCH_NUM : vrátí pole indexované číslem sloupce.
  • PDO::FETCH_OBJ : vrátí anonymní objekt s názvy vlastností, které odpovídají názvům sloupců.

Ve skutečnosti existují tři, které pokrývají většinu situací: FETCH_ASSOCFETCH_CLASSFETCH_OBJ . K nastavení metody načítání se používá následující syntaxe:

$STH->setFetchMode(PDO::FETCH_ASSOC);

Můžete také nastavit typ načtení přímo v ->fetch() volání metody.

FETCH_ASSOC

Tento typ načtení vytvoří asociativní pole indexované podle názvu sloupce. To by mělo být docela známé každému, kdo používá rozšíření mysql/mysqli. Zde je příklad výběru dat touto metodou:

# pomocí metody shortcut ->query(), protože v příkazu select nejsou žádné hodnoty proměnných#.$STH =$DBH->query('SELECT jméno, adresa, město od lidí'); # nastavení režimu načítání$STH->setFetchMode(PDO::FETCH_ASSOC); while($row =$STH->fetch()) { echo $row['name'] . "\n"; echo $row['addr'] . "\n"; echo $row['city'] . "\n";}

Smyčka while bude nadále procházet sadu výsledků jeden řádek po druhém, dokud nebude dokončena.

FETCH_OBJ

Tento typ načtení vytvoří objekt třídy std pro každý řádek načtených dat. Zde je příklad:

# vytvoření příkazu$STH =$DBH->query('SELECT jméno, adresa, město od lidí'); # nastavení režimu načítání$STH->setFetchMode(PDO::FETCH_OBJ); # zobrazení výsledků while($row =$STH->fetch()) { echo $row->name . "\n"; echo $row->addr . "\n"; echo $row->city . "\n";}

FETCH_CLASS

Vlastnosti vašeho objektu jsou nastaveny PŘED zavoláním konstruktoru. To je důležité.

Tato metoda načítání vám umožňuje načítat data přímo do třídy podle vašeho výběru. Když používáte FETCH_CLASS , vlastnosti vašeho objektu jsou nastaveny BEFORE je volán konstruktor. Přečtěte si to znovu – je to důležité. Pokud vlastnosti odpovídající názvům sloupců neexistují, tyto vlastnosti vám budou vytvořeny (jako veřejné).

To znamená, že pokud vaše data potřebují nějakou transformaci poté, co vyjdou z databáze, může to být provedeno automaticky vaším objektem při vytváření každého objektu.

Jako příklad si představte situaci, kdy je potřeba adresu u každého záznamu částečně zakrýt. Mohli bychom to udělat tak, že budeme s touto vlastností pracovat v konstruktoru. Zde je příklad:

class secret_person { public $name; public $addr; veřejné $město; veřejná $jiná_data; function __construct($other ='') { $this->address =preg_replace('/[a-z]/', 'x', $this->address); $this->other_data =$other; }}

Při načítání dat do této třídy má adresa všechna malá písmena a-z písmena nahrazena písmenem x . Nyní je použití třídy a provedení transformace dat zcela transparentní:

$STH =$DBH->query('SELECT jméno, adresa, město od lidí');$STH->setFetchMode(PDO::FETCH_CLASS, 'tajná_osoba'); while($obj =$STH->fetch()) { echo $obj->addr;}

Pokud by adresa byla '5 Rosebud', uvidíte jako výstup '5 Rxxxxxx'. Samozřejmě mohou nastat situace, kdy chcete, aby byl konstruktor volán před přiřazením dat. PDO to také kryje.

$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'tajná_osoba');

Nyní, když zopakujete předchozí příklad s tímto režimem načítání (PDO::FETCH_PROPS_LATE ), adresa nebude být zakrytý, protože byl zavolán konstruktor a byly přiřazeny vlastnosti.

Nakonec, pokud to opravdu potřebujete, můžete konstruktoru předat argumenty při načítání dat do objektů s PDO:

$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person', array('stuff'));

Pokud potřebujete předat konstruktoru různá data pro každý objekt, můžete nastavit režim načítání uvnitř fetch metoda:

$i =0;while($rowObj =$STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) { // dělat věci $i++}

Některé další užitečné metody

I když to není myšleno tak, aby pokrylo vše v PDO (je to obrovské rozšíření!), existuje několik dalších metod, které budete chtít znát, abyste mohli dělat základní věci s PDO.

$DBH->lastInsertId();

 ->lastInsertId() metoda je vždy volána na popisovači databáze, nikoli na popisovači příkazu, a vrátí automaticky zvýšené id posledního vloženého řádku tímto připojením.

$DBH->exec('DELETE FROM people WHERE 1');$DBH->exec("SET time_zone ='-8:00'");

 ->exec() metoda se používá pro operace, které nemohou vrátit data jiná než dotčené řádky. Výše uvedené jsou dva příklady použití metody exec.

$safe =$DBH->quote($unsafe);

 ->quote() metoda uvozuje řetězce, takže je lze bezpečně použít v dotazech. Toto je vaše záložní řešení, pokud nepoužíváte připravené příkazy.

$rows_affected =$STH->rowCount();

 ->rowCount() metoda vrací celé číslo udávající počet řádků ovlivněných operací. Minimálně v jedné známé verzi PDO metoda nefungovala s vybranými příkazy. Ve verzi PHP 5.1.6 a vyšší však funguje správně.

Pokud máte tento problém a nemůžete upgradovat PHP, můžete získat počet řádků následujícím způsobem:

$sql ="SELECT COUNT(*) FROM people";if ($STH =$DBH->query($sql)) { # zkontrolovat počet řádků if ($STH->fetchColumn()> 0) { # zde vydejte skutečný výběr, protože existují data! } else { echo "Dotazu neodpovídají žádné řádky."; }}

Generátory PHP CRUD od CodeCanyon

Můžete si ušetřit hodiny času tím, že najdete generátor PHP CRUD od CodeCanyon a použijete ho ve svých projektech. Zde je pět nejoblíbenějších stahování, které můžete začít používat právě teď.

1. Víceúčelová aplikace Laravel:Sximo 6

Tvůrce Sximo 6 je založen na nejpopulárnějších frameworkech v okolí. Obdržela také novou aktualizaci pro rok 2021, díky čemuž je její použití co nejjednodušší a nejbohatší na funkce. Některé z těchto funkcí zahrnují:

  • správa databázových tabulek
  • front-end a back-end šablony
  • editor modulu MySQL
  • podpora nahrávání více obrázků a souborů

Zkuste to, pokud chcete ušetřit čas pomocí šablony CRUD PHP.

2. PDO Crud:Tvůrce formulářů a správa databází

Zde je další výkonný CRUD PHP generátor. Tato šablona kódu PHP PDO dělá dobře správu databáze. Ale to není vše, co dělá. Můžete také použít PDO CRUD k vytvoření užitečných formulářů přímo z vašich databázových tabulek. Je to užitečná funkce, kterou mnoho jiných možností nemá.

3. Cicool:Page, Form, Rest API a CRUD Generator

Cicool je další víceúčelový stavitel, který stojí za pozornost. Nejen, že nabízí CRUD builder, ale má také:

  • nástroje pro tvorbu stránek
  • nástroj pro tvorbu formulářů
  • Tvůrce rozhraní rest API

Kromě těchto funkcí můžete do Cicool také přidat rozšíření a snadno upravit jeho motiv.

4. PHP CRUD generátor

Snadný správce panelů? Šek. Snadno ovladatelné rozhraní? Šek. Hloubková analýza databáze? Další kontrola. Tento generátor PHP CRUD má vše, co potřebujete k vytváření skvělých řídicích panelů a ukládání dat. Díky různým funkcím ověřování uživatelů a správy práv se tato šablona PDO PHP vyplatí vyzkoušet.


  1. Mysql:Vyberte řádky z tabulky, které nejsou v jiné

  2. Tipy pro poskytování výkonu databáze MySQL – část první

  3. Jak funguje funkce Power() v PostgreSQL

  4. Sémantika ResultSet#getDate().