Access
 sql >> база данни >  >> RDS >> Access

Защо трябва да използвате PHPs PDO за достъп до база данни

Много PHP програмисти се научиха как да имат достъп до бази данни, като използват разширенията MySQL или MySQLi. От PHP 5.1 има по-добър начин. PHP Data Objects (PDO) предоставя методи за подготвени изрази и работа с обекти, които ще ви направят много по-продуктивни!

CRUD генератори и рамки

Кодът на базата данни се повтаря, но е много важно да се оправи. Тук идват PHP CRUD генераторите и рамки – те ви спестяват време, като автоматично генерират целия този повтарящ се код, за да можете да се съсредоточите върху други части на приложението.

В CodeCanyon ще намерите CRUD генератори и рамки, които ще ви помогнат да доставяте продукти с изключително качество навреме. (CRUD е акроним за създаване, четене, актуализиране и изтриване – основните манипулации за база данни.)

  • PHP9 Полезни PHP CRUD генератори и рамки, налични на CodeCanyonFranc Lucas
  • PHP Бързо Създайте PHP CRUD интерфейс с PDO Advanced CRUD Generator ToolSajal Soni

Въведение в PDO

PDO—PHP Data Objects—са слой за достъп до база данни, осигуряващ единен метод за достъп до множество бази данни.

Той не отчита специфичния за базата данни синтаксис, но може да позволи процеса на превключване на бази данни и платформи да бъде доста безболезнен, просто чрез превключване на низа за връзка в много случаи.

Този урок не е предназначен да бъде пълно ръководство за SQL. Написано е основно за хора, които в момента използват mysql или mysqli разширение, за да им помогне да преминат към по-преносимия и мощен PDO.

Когато става въпрос за операции с база данни в PHP, PDO предоставя много предимства пред необработения синтаксис. Нека набързо изброим няколко:

  • абстракционен слой
  • обектно-ориентиран синтаксис
  • поддръжка на подготвени изявления
  • по-добра обработка на изключенията
  • защитени и многократно използвани API
  • поддръжка за всички популярни бази данни

Поддръжка на бази данни

Разширението може да поддържа всяка база данни, за която е написан PDO драйвер. Към момента на писане на тази статия са налични следните драйвери за база данни:

  • 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 (Интерфейс за повикване на Oracle)
  • PDO_ODBC (ODBC v3 (IBM DB2, unixODBC и win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 и SQLite 2)
  • PDO_4D (D)

Всички тези драйвери не са непременно налични във вашата система; ето бърз начин да разберете кои драйвери имате:

print_r(PDO::getAvailableDrivers());

Свързване

Различните бази данни могат да имат малко различни методи за свързване. По-долу можете да видите метода за свързване с някои от най-популярните бази данни. Ще забележите, че първите три са идентични, различни от типа на базата данни — и тогава SQLite има собствен синтаксис.

опитайте { # MS SQL Server и Sybase с PDO_DBLIB $DBH =new PDO("mssql:host =$host;dbname=$dbname", $user, $pass); $DBH =нов PDO("sybase:host=$host;dbname=$dbname", $user, $pass); # MySQL с PDO_MYSQL $DBH =нов PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # База данни на SQLite $DBH =нов PDO("sqlite:my/database/path/database.db");}catch(PDOException $e) { echo $e->getMessage();}

Моля, обърнете внимание на блока try/catch. Винаги трябва да обвивате вашите PDO операции в try/catch и да използвате механизма за изключение – повече за това скоро. Обикновено ще направите само една връзка — има няколко изброени, за да ви покажат синтаксиса. $DBH означава „ръководител на база данни“ и ще се използва в този урок.

Можете да затворите всяка връзка, като зададете манипулатора на нула.

# затваряне на връзката$DBH =null;

Можете да получите повече информация за специфичните за базата данни опции и/или низове за връзка за други бази данни от PHP.net.

Изключения и PDO

PDO може да използва изключения за обработка на грешки, което означава, че всичко, което правите с PDO, трябва да бъде обвито в блок try/catch. Можете принудително да включите PDO в един от трите режима на грешка, като зададете атрибута на режима на грешка на новосъздадения манипулатор на базата данни. Ето синтаксиса:

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

Без значение какъв режим на грешка сте задали, грешка при свързване винаги ще доведе до изключение, а създаването на връзка винаги трябва да се съдържа в блок try/catch.

PDO::ERRMODE_SILENT

Това е режимът за грешка по подразбиране. Ако го оставите в този режим, ще трябва да проверите за грешки по начина, по който вероятно сте свикнали, ако сте използвали mysql или mysqli разширения. Другите два метода са по-подходящи за DRY програмиране.

PDO::ERRMODE_WARNING

Този режим ще издаде стандартно PHP предупреждение и ще позволи на програмата да продължи изпълнението. Полезно е за отстраняване на грешки.

PDO::ERRMODE_EXCEPTION

Това е режимът, който искате в повечето ситуации. Той задейства изключение, което ви позволява да обработвате грешките грациозно и да скривате данни, които могат да помогнат на някой да експлоатира вашата система. Ето пример за използване на изключенията:

# свържете се с базата данниtry { $DBH =new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); # Ъъъъъ! Въведете DELECT вместо SELECT! $DBH->prepare('DELECT name FROM people');}catch(PDOException $e) { echo "Съжалявам, Дейв. Боя се, че не мога да направя това."; file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);}

Има умишлена грешка в оператора за избор; това ще доведе до изключение. Изключението изпраща подробностите за грешката в регистрационен файл и показва приятелско (или не толкова приятелско) съобщение на потребителя.

Вмъкване и актуализиране

Вмъкването на нови данни (или актуализирането на съществуващи данни) е една от най-често срещаните операции с база данни. Използвайки PHP PDO, това обикновено е процес в две стъпки. Всичко обхванато в този раздел важи еднакво и за UPDATE и INSERT операции.

Ето пример за най-основния тип вложка:

# STH означава "Манипулатор на изявление"$STH =$DBH->prepare("INSERT INTO folks ( first_name ) values ​​('Cathy')");$STH->execute();

Можете също да извършите същата операция, като използвате exec() метод, с едно извикване по-малко. В повечето ситуации ще използвате по-дългия метод, за да можете да се възползвате от подготвените изявления. Дори ако ще го използвате само веднъж, използването на подготвени изрази ще ви помогне да се предпазите от атаки с инжектиране на SQL.

Подготвени изявления

Използването на подготвени изрази ще ви помогне да се предпазите от SQL инжекция.

Подготвеният оператор е предварително компилиран SQL оператор, който може да бъде изпълнен многократно чрез изпращане само на данните на сървъра. Той има допълнителното предимство, че автоматично прави данните, използвани в заместителите, защитени от атаки с инжектиране на SQL.

Вие използвате подготвено изявление, като включите заместители във вашия SQL. Ето три примера:един без заместители, един с неименувани заместители и един с именувани заместители.

# без заместители - готов за SQL инжекция!$STH =$DBH->prepare("INSERT INTO folks (name, addr, city) values ​​($name, $addr, $city)"); # unnamed placeholders$STH =$DBH->prepare("INSERT INTO folks (name, addr, city) values ​​(?, ?, ?)"); # named placeholders$STH =$DBH->prepare("INSERT INTO folks (name, addr, city) values ​​(:name, :addr, :city)");

Искате да избегнете първия метод; тук е за сравнение. Изборът за използване на именувани или неименувани заместители ще повлияе на начина, по който задавате данни за тези изрази.

Заместители без име

# присвоява променливи на всеки заместник, индексиран 1-3$STH->bindParam(1, $name);$STH->bindParam(2, $addr);$STH->bindParam(3, $city); # вмъкнете един ред$name ="Daniel"$addr ="1 Wicked Way";$city ="Arlington Heights";$STH->execute(); # вмъкнете друг ред с различни стойности$name ="Steve"$addr ="5 Circle Drive";$city ="Schaumburg";$STH->execute();

Тук има две стъпки. Първо, присвояваме променливи на различните заместители (редове 2-4). След това присвояваме стойности на тези заместители и изпълняваме оператора. За да изпратите друг набор от данни, просто променете стойностите на тези променливи и изпълнете оператора отново.

Изглежда ли това малко тромаво за изявления с много параметри? То е. Въпреки това, ако вашите данни се съхраняват в масив, има лесен пряк път:

# данните, които искаме да вмъкнем$data =array('Cathy', '9 Dark and Twisty Road', 'Cardiff'); $STH =$DBH->prepare("INSERT INTO folks (name, addr, city) values ​​(?, ?, ?)");$STH->execute($data);

Това е лесно!

Данните в масива се отнасят за заместващите по ред. $data[0] отива в първия заместител $data[1] вторият и т.н. Въпреки това, ако индексите на вашия масив не са в ред, това няма да работи правилно и ще трябва да индексирате отново масива.

Заместители с име

Вероятно можете да познаете синтаксиса, но ето един пример:

# първият аргумент е именуваното име на заместващо място - забележете named# заместителите винаги започват с двоеточие.$STH->bindParam(':name', $name);

Можете да използвате пряк път и тук, но той работи с асоциативни масиви. Ето един пример:

# данните, които искаме да вмъкнем$data =array( 'name' => 'Cathy', 'addr' => '9 Тъмно и изкривено', 'city' => 'Кардиф'); # прекият път!$STH =$DBH->prepare("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");$STH->execute($data); 

Ключовете на вашия масив не трябва да започват с двоеточие, но в противен случай трябва да съвпадат с посочените заместители. Ако имате масив от масиви, можете да ги повторите и просто да извикате execute с всеки масив от данни.

Друга приятна характеристика на именувани контейнери е възможността да вмъквате обекти директно във вашата база данни, като приемем, че свойствата съвпадат с наименуваните полета. Ето примерен обект и как бихте изпълнили вмъкването си:

# прост обектен клас човек { public $name; публичен $addr; публичен $city; функция __construct($n,$a,$c) { $this->name =$n; $this->addr =$a; $този->град =$c; } # etc ...} $cathy =нов човек('Cathy','9 Dark and Twisty','Cardiff'); # ето забавната част:$STH =$DBH->prepare("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");$STH->execute((array)$ Кати);

Прехвърляне на обекта към масив в execute означава, че свойствата се третират като ключове за масиви.

Избиране на данни

Данните се получават чрез ->fetch() , метод на вашия манипулатор на изявление. Преди да извикате fetch, най-добре е да кажете на PDO как искате да бъдат извлечени данните. Имате следните опции:

  • PDO::FETCH_ASSOC : връща масив, индексиран по име на колона.
  • PDO::FETCH_BOTH (по подразбиране): връща масив, индексиран както по име на колона, така и по номер.
  • PDO::FETCH_BOUND : присвоява стойностите на вашите колони на променливите, зададени с ->bindColumn() метод.
  • PDO::FETCH_CLASS : присвоява стойностите на вашите колони на свойствата на посочения клас. Той ще създаде свойствата, ако съответстващи свойства не съществуват.
  • PDO::FETCH_INTO : актуализира съществуващ екземпляр на посочения клас.
  • PDO::FETCH_LAZY :комбинира PDO::FETCH_BOTH /PDO::FETCH_OBJ , създавайки имената на променливите на обекта, както се използват.
  • PDO::FETCH_NUM : връща масив, индексиран по номер на колона.
  • PDO::FETCH_OBJ : връща анонимен обект с имена на свойства, които съответстват на имената на колоните.

В действителност има три, които ще обхванат повечето ситуации: FETCH_ASSOCFETCH_CLASS и FETCH_OBJ . За да зададете метода за извличане, се използва следният синтаксис:

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

Можете също да зададете типа на извличане директно в ->fetch() извикване на метод.

FETCH_ASSOC

Този тип извличане създава асоциативен масив, индексиран по име на колона. Това трябва да е доста познато на всеки, който е използвал разширенията mysql/mysqli. Ето пример за избор на данни с този метод:

# използвайки метода за бърз достъп ->query() тук, тъй като в оператора select няма стойности на променлива#.$STH =$DBH->query('ИЗБЕРЕТЕ име, адрес, град от хора'); # задаване на режим на извличане$STH->setFetchMode(PDO::FETCH_ASSOC); while($row =$STH->fetch()) { echo $row['name'] . "\н"; echo $row['addr'] . "\н"; echo $row['city'] . „\n“;}

Цикълът while ще продължи да преминава през набора от резултати един ред по ред, докато завърши.

FETCH_OBJ

Този тип извличане създава обект от std клас за всеки ред извлечени данни. Ето един пример:

# създаване на изявлението$STH =$DBH->query('ИЗБЕРЕТЕ име, адрес, град от хора'); # задаване на режим на извличане$STH->setFetchMode(PDO::FETCH_OBJ); # показване на резултатитеwhile($row =$STH->fetch()) { echo $row->name . "\н"; echo $row->addr . "\н"; echo $row->city . „\n“;}

FETCH_CLASS

Свойствата на вашия обект се задават ПРЕДИ да бъде извикан конструкторът. Това е важно.

Този метод на извличане ви позволява да извличате данни директно в клас по ваш избор. Когато използвате FETCH_CLASS , свойствата на вашия обект са зададени BEFORE конструкторът се извиква. Прочетете това отново - важно е. Ако свойства, съответстващи на имената на колоните, не съществуват, тези свойства ще бъдат създадени (като публични) за вас.

Това означава, че ако вашите данни се нуждаят от някаква трансформация, след като излязат от базата данни, тя може да бъде извършена автоматично от вашия обект при създаването на всеки обект.

Като пример си представете ситуация, при която адресът трябва да бъде частично засенчен за всеки запис. Можем да направим това, като оперираме с това свойство в конструктора. Ето един пример:

class secret_person { public $name; публичен $addr; публичен $city; публичен $other_data; function __construct($other ='') { $this->address =preg_replace('/[a-z]/', 'x', $this->address); $това->други_данни =$други; }}

Тъй като данните се извличат в този клас, адресът има всички малки букви a-z букви, заменени с буквата x . Сега използването на класа и осъществяването на тази трансформация на данни е напълно прозрачно:

$STH =$DBH->query('ИЗБЕРЕТЕ име, адрес, град от хора');$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person'); while($obj =$STH->fetch()) { echo $obj->addr;}

Ако адресът беше „5 Rosebud“, ще видите „5 Rxxxxxx“ като ваш изход. Разбира се, може да има ситуации, в които искате конструкторът да бъде извикан преди присвояването на данните. PDO ви покрива и за това.

$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'secret_person');

Сега, когато повторите предишния пример с този режим на извличане (PDO::FETCH_PROPS_LATE ), адресът не да бъде скрит, тъй като конструкторът е извикан и свойствата са присвоени.

И накрая, ако наистина трябва, можете да предавате аргументи на конструктора, когато извличате данни в обекти с PDO:

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

Ако трябва да предадете различни данни на конструктора за всеки обект, можете да зададете режима на извличане вътре в fetch метод:

$i =0;while($rowObj =$STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) { // прави неща $i++}

Някои други полезни методи

Въпреки че това не е предназначено да обхване всичко в PDO (това е огромно разширение!), има още няколко метода, които ще искате да знаете, за да правите основни неща със PDO.

$DBH->lastInsertId();

 ->lastInsertId() Методът винаги се извиква на манипулатора на базата данни, а не на манипулатора на израза, и ще върне автоматично увеличения идентификатор на последния вмъкнат ред от тази връзка.

$DBH->exec('ИЗТРИВАНЕ ОТ хора, КЪДЕ 1');$DBH->exec("SET time_zone ='-8:00'");

 ->exec() методът се използва за операции, които не могат да върнат данни, различни от засегнатите редове. По-горе са два примера за използване на метода exec.

$safe =$DBH->цитат($unsafe);

 ->quote() метод цитира низове, така че да са безопасни за използване в заявки. Това е вашият резервен вариант, ако не използвате подготвени оператори.

$rows_affected =$STH->rowCount();

 ->rowCount() метод връща цяло число, указващо броя на редовете, засегнати от операция. В поне една известна версия на PDO методът не работеше с избрани изрази. Въпреки това, той работи правилно във версия PHP 5.1.6 и по-нова.

Ако имате този проблем и не можете да надстроите PHP, можете да получите броя на редовете със следното:

$sql ="ИЗБЕРЕТЕ БРОЙ(*) ОТ хора";if ($STH =$DBH->query($sql)) { # проверете броя на редовете if ($STH->fetchColumn()> 0) { # дайте истински избор тук, защото има данни! } else { echo "Няма редове, съответстващи на заявката."; }}

PHP CRUD генератори от CodeCanyon

Можете да си спестите часове време, като намерите PHP CRUD генератор от CodeCanyon и го използвате във вашите проекти. Ето пет от най-популярните изтегляния, които можете да започнете да използвате в момента.

1. Многофункционално приложение Laravel:Sximo 6

Builder Sximo 6 е базиран на най-популярните рамки. Той също така получи нова актуализация за 2021 г., което го прави възможно най-лесен за използване и богат на функции. Някои от тези функции включват:

  • управление на таблици на база данни
  • шаблони за преден и заден край
  • редактор на модул MySQL
  • поддръжка на множество изображения и качване на файлове

Опитайте, ако искате да спестите време с CRUD PHP шаблон.

2. PDO Crud:Създател на формуляри и управление на база данни

Ето още един мощен CRUD PHP генератор. Този шаблон на PHP PDO код прави управлението на база данни добре. Но това не е всичко, което прави. Можете също да използвате PDO CRUD, за да създавате полезни формуляри директно от таблиците на вашата база данни. Това е полезна функция, която нямат много други опции.

3. Cicool:API за страница, формуляр, Rest и CRUD генератор

Cicool е друг многофункционален конструктор, който си струва да разгледате. Той не само предлага конструктор на CRUD, но също така има:

  • съставител на страници
  • съставител на формуляри
  • конструктор на API за почивка

Освен тези функции, можете също да добавите разширения към Cicool и лесно да персонализирате неговата тема.

4. PHP CRUD генератор

Лесен конструктор на административни панели? Проверете. Лесен за навигация интерфейс? Проверете. Задълбочен анализ на базата данни? Още една проверка. Този PHP CRUD генератор има всичко необходимо, за да създадете страхотни табла за управление и да съхранявате вашите данни. С различни функции за удостоверяване на потребители и управление на права, този PDO PHP шаблон си струва да се разгледа.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да групирате отчет в Access 2016

  2. АКТУАЛИЗИРАНО:Грешка причинява Microsoft Office 365 Build 2105 прекъсва достъпа на приложения

  3. Изграждане на база данни на Microsoft Access

  4. Присвояване на изображения на възли за изглед на дърво

  5. Разделяне на данни за широкомащабни приложения