Php pdo mysql жишээнүүд. PDO мэдээллийн сангийн холболт. Бэлтгэсэн, шууд хүсэлт

  • Орчуулга

Олон РНР хөгжүүлэгчид мэдээллийн сантай ажиллахдаа mysql болон mysqli өргөтгөлүүдийг ашиглаж дассан байдаг. Гэхдээ PHP-ийн 5.1 хувилбараас хойш илүү олон зүйл бий тохиромжтой арга- PHP мэдээллийн объектууд. Товчхондоо PDO гэж нэрлэгддэг энэ анги нь таны бүтээмжийг мэдэгдэхүйц сайжруулах объект, бэлтгэсэн мэдэгдлүүдтэй ажиллах аргуудыг өгдөг!

PDO-ийн танилцуулга

“PDO – PHP Data Objects нь санал болгодог давхарга юм бүх нийтийн аргаолон мэдээллийн сантай ажиллах."

Энэ нь янз бүрийн DBMS-ийн синтакс шинж чанаруудын талаархи санаа зовнилыг хөгжүүлэгчийн мэдэлд үлдээдэг боловч платформуудын хооронд шилжих үйл явцыг илүү өвдөлтгүй болгодог. Ихэнхдээ энэ нь зөвхөн мэдээллийн баазын холболтын мөрийг өөрчлөхийг шаарддаг.


Энэ нийтлэлийг mysql болон mysqli ашигладаг хүмүүст илүү хүчирхэг, уян хатан PDO руу шилжихэд нь туслах зорилгоор бичсэн болно.

DBMS-ийн дэмжлэг

Энэ өргөтгөл нь PDO драйвер байгаа өгөгдлийн сангийн удирдлагын аливаа системийг дэмжих боломжтой. Үүнийг бичиж байх үед дараах драйверууд бэлэн байна.
  • PDO_CUBRID (CUBRID)
  • PDO_DBLIB(FreeTDS/ Microsoft SQLСервер/Sybase)
  • PDO_FIREBIRD (Firebird/Interbase 6)
  • PDO_IBM (IBM DB2)
  • PDO_INFORMIX (IBM Informix динамик сервер)
  • 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_SQLSRV (Microsoft SQL Server)
  • PDO_4D (4D)
Гэсэн хэдий ч тэдгээр нь бүгд таны сервер дээр байдаггүй. Та боломжтой драйверуудын жагсаалтыг дараах байдлаар харж болно.
print_r(PDO::getAvailableDrivers());

Холболт

Өөр өөр DBMS-тэй холбогдох аргууд нь бага зэрэг ялгаатай байж болно. Хамгийн алдартай хүмүүстэй холбогдох жишээг доор харуулав. Эхний гурав нь SQLite-ээс ялгаатай нь ижил төстэй синтакстай болохыг та анзаарах болно.
оролдоорой ( # MS SQL сервер болон PDO_DBLIB-ээр Sybase $DBH = new PDO("mssql:host=$host;dbname=$dbname", $user, $pass); $DBH = new PDO("sybase:host=$host" ;dbname=$dbname", $user, $pass); # PDO_MYSQL-ээр дамжуулан MySQL $DBH = шинэ PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # SQLite $DBH = new PDO("sqlite:my/database/path/database.db" catch(PDOException $e) ( echo $e->getMessage(); )
try/catch блок дээр анхаарлаа хандуулна уу - энэ нь үргэлж PDO-ийн бүх үйлдлүүдийг боож, онцгой байдлын механизмыг ашиглах нь зүйтэй юм (энэ талаар дараа дэлгэрэнгүй).

$DBH нь "өгөгдлийн сангийн бариул" гэсэн үг бөгөөд нийтлэлийн туршид хэрэглэгдэх болно.

Та хувьсагчийг null болгож дахин тодорхойлсноор аливаа холболтыг хааж болно.
# холболтыг хаадаг $DBH = null;
Төрөл бүрийн DBMS-ийн онцлог сонголтууд болон тэдгээрт холбогдох аргуудын талаарх дэлгэрэнгүй мэдээллийг php.net сайтаас авах боломжтой.

Үл хамаарах зүйлүүд ба PDO

PDO алдаан дээр үл хамаарах зүйлүүдийг гаргаж чаддаг тул бүх зүйл try/catch блок дотор байх ёстой. Холболт үүсгэсний дараа шууд PDO-г гурван алдааны горимд оруулж болно:
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Гэхдээ холбогдохыг оролдох үед гарсан алдаа нь үргэлж үл хамаарах зүйл үүсгэдэг гэдгийг тэмдэглэх нь зүйтэй.

PDO::ERRMODE_SILENT

Энэ бол анхдагч горим юм. Та mysql болон mysqli өргөтгөлүүдийн алдааг илрүүлэхийн тулд ойролцоогоор ижил зүйлийг ашиглах болно. Дараагийн хоёр горим нь DRY програмчлалд илүү тохиромжтой.

PDO::ERRMODE_WARNING

Энэ горим нь стандарт анхааруулга үүсгэж, скриптийг үргэлжлүүлэн ажиллуулах боломжийг олгоно. Дибаг хийхэд тохиромжтой.

PDO::ERRMODE_EXCEPTION

Ихэнх тохиолдолд энэ төрлийн скриптийн гүйцэтгэлийн хяналтыг илүүд үздэг. Энэ нь онцгой тохиолдол гаргаж, алдааг ухаалгаар зохицуулах, эмзэг мэдээллийг нуух боломжийг олгодог. Жишээлбэл, энд:
# өгөгдлийн сантай холбогдоно уу ( $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ; # Хараал ид! Би SELECT гэж бичлээ. "PDOErrors" .txt", $e->getMessage(), FILE_APPEND); )
SQL илэрхийлэлд үл хамаарах зүйл үүсгэх синтакс алдаа байна. Бид алдааны дэлгэрэнгүй мэдээллийг бүртгэлийн файлд бичиж, хэрэглэгчдэд ямар нэгэн зүйл тохиолдсоныг хүний ​​хэлээр сануулж чадна.

Оруулах, шинэчлэх

Шинэ өгөгдөл оруулах, одоо байгаа өгөгдлийг шинэчлэх нь мэдээллийн сангийн хамгийн түгээмэл үйлдлүүд юм. PDO-ийн хувьд энэ үйл явц нь ихэвчлэн хоёр үе шатаас бүрдэнэ. (Дараагийн хэсэг нь UPDATE болон INSERT хоёрын тухай юм)


Шинэ өгөгдөл оруулах энгийн жишээ:
# STH нь "Мэдэгдэлийн бариул" гэсэн утгатай $STH = $DBH->бэлтгэх("INSERT INTO folks (first_name) утгуудыг ("Cathy")"); $STH->execute();
Үнэн хэрэгтээ та нэг exec() аргаар ижил зүйлийг хийж болно, гэхдээ хоёр алхамт арга нь бэлтгэсэн мэдэгдлийн бүх ашиг тусыг өгдөг. Эдгээр нь SQL тарилгааас хамгаалахад тусалдаг тул нэг удаагийн асуулгад ч ашиглах нь зүйтэй юм.

Бэлтгэсэн мэдэгдэл

Бэлтгэсэн мэдэгдлүүдийг ашиглах нь SQL тарилгын эсрэг хамгаалалтыг бэхжүүлдэг.

Бэлтгэсэн мэдэгдэл нь зөвхөн өөр өөр багц өгөгдлийг сервер рүү илгээх замаар дахин дахин гүйцэтгэх боломжтой урьдчилан эмхэтгэсэн SQL мэдэгдэл юм. Нэмэлт ашиг тусЭнэ нь орлуулагчид ашигласан өгөгдлөөр дамжуулан SQL тарилга хийх боломжгүй юм.

Бэлтгэсэн мэдэгдлийн гурван жишээг доор харуулав.
# орлуулагчгүй - SQL тарилга хийх хаалга нээлттэй байна! $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгуудыг ($name, $addr, $хот)"); # нэргүй орлуулагч $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгуудыг (?, ?, ?)"); # нэрлэгдсэн орлуулагч $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгуудыг (:нэр, :addr, :хот)");
Эхний жишээ нь зөвхөн харьцуулах зорилгоор энд байгаа бөгөөд үүнээс зайлсхийх хэрэгтэй. Нэргүй болон нэрлэгдсэн орлуулагчдын хоорондох ялгаа нь өгөгдлийг бэлтгэсэн мэдэгдлүүд рүү хэрхэн дамжуулах явдал юм.

Нэргүй орлуулагч

# орлуулагч бүрт 1-ээс 3 хүртэлх индекс бүхий хувьсагчийг оноох $STH->bindParam(1, $name); $STH->bindParam(2, $addr); $STH->bindParam(3, $хот); # нэг мөр оруулах $name = "Даниел" $addr = "1 Муу зам"; $хот = "Арлингтон Хайтс"; $STH->execute(); # өөр мөр оруулах, өөр өөр өгөгдөлтэй $name = "Steve" $addr = "5 Circle Drive"; $хот = "Шаумбург"; $STH->execute();
Энд хоёр алхам байна. Эхнийх нь бид бүх орлуулагчдад хувьсагчдыг оноодог (мөр 2-4). Дараа нь бид эдгээр хувьсагчдад утгыг оноож, асуулга ажиллуулна. Шинэ багц өгөгдөл илгээхийн тулд хувьсагчийн утгыг өөрчилж, хүсэлтийг дахин ажиллуулна уу.

Хэрэв таны SQL илэрхийлэл олон параметртэй бол хувьсагч тус бүрд оноох нь маш тохиромжгүй юм. Ийм тохиолдолд та өгөгдлийг массив дотор хадгалж, дамжуулж болно:
# бидний оруулах өгөгдлийн багц $data = array("Cathy", "9 Dark and Twisty Road", "Cardiff"); $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгыг (?, ?, ?)"); $STH->гүйцэтгэх($өгөгдөл);
Эхний орлуулагчийн оронд $ өгөгдөл, хоёр дахь орлуулагчийн оронд $ өгөгдөл гэх мэтийг оруулах болно. Гэхдээ болгоомжтой байгаарай: хэрэв таны индексүүд эвдэрсэн бол энэ нь ажиллахгүй болно.

Нэрлэсэн орлуулагч

# эхний аргумент нь орлуулагчийн нэр # энэ нь ихэвчлэн хоёр цэгээр эхэлдэг # хэдийгээр тэдгээргүйгээр ажилладаг боловч $STH->bindParam(":name", $name);
Энд та массив дамжуулж болно, гэхдээ энэ нь ассоциатив байх ёстой. Түлхүүрүүд нь таны таамаглаж байгаагаар орлуулагчдын нэр байх ёстой.
# бидний оруулах өгөгдөл $data = array("name" => "Cathy", "addr" => "9 Dark and Twisty", "city" => "Cardiff"); $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгуудыг (:нэр, :addr, :хот)"); $STH->гүйцэтгэх($өгөгдөл);
Нэрлэсэн орлуулагчийг ашиглахад тохиромжтой талуудын нэг бол өмчийн нэр нь параметрийн нэртэй таарч байвал өгөгдлийн санд шууд объект оруулах боломж юм. Жишээлбэл, та дараах байдлаар өгөгдөл оруулах боломжтой.
# энгийн объектын ангийн хүнд зориулсан анги ( public $name; public $addr; public $city; function __construct($n,$a,$c) ( $this->name = $n; $this->addr = $ a ; $this->city = $c ) # гэх мэт... ) $cathy = new person("Cathy","9 Dark and Twisty","Cardiff"); # мөн энд сонирхолтой хэсэг байна $STH = $DBH->prepare("INSERT INTO folks (нэр, хаяг, хот) утгуудыг (:нэр, :addr, :хот)"); $STH->execute((массив)$cathy);
Execute() үед объектыг массив болгон хөрвүүлэх нь шинж чанаруудыг массивын түлхүүр гэж үзэхэд хүргэдэг.

Өгөгдлийн түүвэрлэлт



Өгөгдлийг ->fetch() аргыг ашиглан татаж авч болно. Үүнийг дуудахаасаа өмнө тэдгээрийг ямар хэлбэрээр шаардаж байгаагаа тодорхой зааж өгөхийг зөвлөж байна. Хэд хэдэн сонголт байна:
  • 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_ASSOC, FETCH_CLASS, FETCH_OBJ. Өгөгдлийн форматыг тодорхойлохын тулд дараах синтаксийг ашиглана уу.
$STH->setFetchMode(PDO::FETCH_ASSOC);
Мөн ->fetch() аргыг дуудахдаа үүнийг шууд тохируулж болно.

FETCH_ASSOC

Энэ форматыг үүсгэдэг ассоциатив массивбаганын нэрсийг индекс болгон бичнэ. Энэ нь mysql/mysqli өргөтгөлүүдийг ашигладаг хүмүүст танил байх ёстой.
# Энэ нь орлуулагчгүй ердийн асуулга тул # та query() аргыг нэн даруй ашиглаж болно $STH = $DBH->query("Нэр, хаяг, хотыг хүмүүсээс SELECT"); # дуудах горимыг тохируулах $STH->setFetchMode(PDO::FETCH_ASSOC); while($row = $STH->fetch()) ( echo $row["name"]. "\n"; echo $row["addr"]. "\n"; echo $row["хот"] "\n" ;
while() гогцоо нь бүх асуулгын үр дүнг давтах болно.

FETCH_OBJ

Энэ төрлийн өгөгдөл цуглуулах нь мөр бүрт std ангийн жишээг үүсгэдэг.
# асуулга үүсгэх $STH = $DBH->query("Нэр, хаяг, хотыг хүмүүсээс сонго"); # дуудах горимыг сонгох $STH->setFetchMode(PDO::FETCH_OBJ); # үр дүнг хэвлэх зуур($row = $STH->fetch()) ( echo $row->name. "\n"; echo $row->addr. "\n"; echo $row->city . " \ n";)

FETCH_CLASS

fetch_class ашиглах үед өгөгдлийг заасан ангийн тохиолдлуудад бичдэг. Энэ тохиолдолд бүтээгчийг дуудахаас өмнө объектын шинж чанаруудад утгыг оноодог. Хэрэв баганын нэрэнд таарах нэртэй шинж чанарууд байхгүй бол тэдгээр нь автоматаар үүсгэгдэх болно (хүрээг нь нийтэд нээлттэй).

Хэрэв таны өгөгдөл өгөгдлийн сангаас хүлээн авсны дараа шууд заавал боловсруулалт хийх шаардлагатай бол түүнийг анги үүсгэгч дээр хэрэгжүүлж болно.

Жишээлбэл, та тухайн хүний ​​оршин суугаа хаягийн нэг хэсгийг нуух шаардлагатай нөхцөл байдлыг авч үзье.
ангийн нууц_хүн ( нийтийн $нэр; нийтийн $addr; нийтийн $хот; нийтийн $бусад_өгөгдөл; функц __construct($бусад = "") ( $this->addr = preg_replace("//", "x", $this-> addr); $ this-> other_data = $ other;
Объект үүсгэх үед бүх жижиг латин үсгийг x-ээр солих ёстой. Шалгацгаая:
$STH = $DBH->query("Хүмүүсээс нэр, хаяг, хотыг сонго"); $STH->setFetchMode(PDO::FETCH_CLASS, "нууц_хүн"); while($obj = $STH->fetch()) ( echo $obj->addr; )
Хэрэв мэдээллийн сан дахь хаяг нь '5 Rosebud' шиг байвал гаралт нь '5 Rxxxxxx' болно.

Мэдээжийн хэрэг, заримдаа та утгыг оноохоос өмнө бүтээгчийг дуудахыг хүсэх болно. PDO үүнийг бас зөвшөөрдөг.
$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, "нууц_хүн");
Одоо та өмнөх жишээг дуусгасан нэмэлт сонголт(PDO::FETCH_PROPS_LATE), утгыг бичсэний дараа юу ч болохгүй тул хаягийг өөрчлөхгүй.

Эцэст нь, хэрэв шаардлагатай бол та объектыг үүсгэхдээ аргументуудыг шууд бүтээгчид дамжуулж болно:
$STH->setFetchMode(PDO::FETCH_CLASS, "нууц_хүн", массив("зүйлс"));
Та объект бүрт өөр өөр аргументуудыг дамжуулж болно:
$i = 0; while($rowObj = $STH->fetch(PDO::FETCH_CLASS, "нууц_хүн", массив($i))) ( // ямар нэг зүйл хий $i++; )

Бусад ашигтай аргууд

Хэдийгээр энэ нийтлэл нь PDO-тэй ажиллах бүх талыг хамарч чадахгүй (мөн оролдоогүй) боловч (энэ нь маш том модуль юм!), дараах цөөн хэдэн функцийг дурдахгүйгээр орхиж болохгүй.
$DBH-> lastInsertId();
->lastInsertId() арга нь хамгийн сүүлд оруулсан бичлэгийн id-г буцаана. Энэ нь үргэлж өгөгдлийн сангийн объект (энэ өгүүлэлд $DBH гэж нэрлэдэг) дээр дуудагддаг бөгөөд илэрхийлэлтэй объект дээр ($STH) биш гэдгийг тэмдэглэх нь зүйтэй.
$DBH->exec("1-д байгаа хүмүүсээс УСТГАХ"); $DBH->exec("SET цагийн бүс = "-8:00"");
->exec() аргыг тэдгээрийн нөлөөлөлд өртсөн бичлэгийн тооноос өөр ямар ч өгөгдөл буцаадаггүй үйлдлүүдэд ашигладаг.
$safe = $DBH->quote($аюулгүй);
->quote() арга нь мөрийн өгөгдөлд ишлэлүүдийг байрлуулснаар тэдгээрийг асуулгад ашиглахад аюулгүй байдаг. Хэрэв та бэлтгэсэн мэдэгдлийг ашиглахгүй бол ашигтай.
$rows_affected = $STH->rowCount();
->rowCount() арга нь үйл ажиллагаанд оролцсон бичлэгийн тоог буцаана. Харамсалтай нь энэ функц нь PHP 5.1.6 хүртэл SELECT асуулгатай ажиллахгүй байсан. Хэрэв PHP хувилбарыг шинэчлэх боломжгүй бол бичлэгийн тоог дараах байдлаар авч болно.
$sql = "ХҮМҮҮСЭЭС COUNT(*) СОНГОХ"; if ($STH = $DBH->query($sql)) ( # бичлэгийн тоог шалгана уу if ($STH->fetchColumn() > 0) ( # өгөгдөл олдсон тул эндээс бүрэн сонголт хийнэ үү! ) else ( # хүсэлтийг хангасан өгөгдөл олдсонгүй гэсэн мессеж хэвлэх) )

Дүгнэлт

Энэ материал нь та нарын заримд mysql болон mysqli өргөтгөлүүдээс шилжихэд тусална гэж найдаж байна.

мета шошго (5)

Хааяа би мэдээллийн санд холбогдох тухай асуултуудыг харж байна.
Ихэнх хариултууд нь би үүнийг яаж хийдэг вэ, эсвэл би зүгээр л зөв хариулж чадахгүй байна. Ямар ч байсан; Миний хийж байгаа арга надад тохирсон учраас би энэ тухай хэзээ ч бодож байгаагүй.

Гэхдээ энд нэг галзуу бодол байна; Магадгүй би энэ бүхнийг буруу хийж байгаа байх, хэрэв тийм бол; Өгөгдлийн санд хэрхэн зөв холбогдох талаар мэдэхийг үнэхээр хүсч байна MySQL өгөгдөл-тай PHP ашигланболон PDO болон бэлэн болгох.

Би үүнийг яаж хийх вэ:

Нэгдүгээрт, энд минийх байна файлын бүтэц (Таслагдсан) :

Public_html/ * index.php * initialize/ -- load.initialize.php -- configure.php -- sessions.php

index.php
Хамгийн дээд талд би шаардаж байна("initialize/load.initialize.php"); ,

load.initialize.php

# сайтын тохиргоо шаардлагатай("configure.php"); # мэдээллийн санд холбогдох шаардлагатай("root/somewhere/connect.php"); // аюулгүй байдлыг сайжруулах үүднээс энэ файлыг public_html-ээс гадуур байрлуулсан. # foreach ангиудыг оруулах (glob("assets/classes/*.class.php") $class_filename)( include($class_filename); ) # foreach функцуудыг оруулах (glob("assets/functions/*.func.php") $func_filename)( include($func_filename); ) # бариулын сешн шаардлагатай("sessions.php");

Хичээл оруулах илүү сайн эсвэл илүү зөв арга байгааг би мэдэж байгаа ч энэ нь юу байсныг санахгүй байна. Одоохондоо үүнийг судлах цаг гараагүй байна, гэхдээ энэ нь автоматаар ачаалагдсан зүйл байсан гэж би бодож байна. тиймэрхүү зүйл...

configure.php
Энд би үндсэндээ заримыг нь дарж байна php.ini-properties болон сайтын бусад глобал тохиргоог хийх

connect.php
Би бусад ангиуд боломжтой байхаар ангийн холболтыг тохируулсан өргөжүүлэхэнэ...

Анги холболт_pdo ( хамгаалагдсан $dbh; нийтийн функц __construct() ( оролдох ( $db_host = " "; // хостын нэр $ db_name = " "; // өгөгдлийн сангийн нэр $ db_user = " "; // хэрэглэгчийн нэр $ user_pw = " "; // нууц үг $con = new PDO("mysql:host=".$db_host."; dbname=".$db_name, $db_user, $user_pw $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->exec("SET CHARACTER SET utf8" // бүх sql хүсэлтийг UTF-8 гэж буцаана) catch (PDOException $err) ( "холболт амжилтгүй болбол гэмгүй алдааны мессеж"; $err->getMessage() .
"; file_put_contents("PDOErrors.txt",$err, FILE_APPEND); // public_html die(); // холболтыг дуусгах ) ) нийтийн функц dbh() ($this->dbh буцаана) алдааны бүртгэлд зарим мэдээллийг бичнэ үү. ) ) # хялбар хандахын тулд мэдээллийн баазын зохицуулагчийг var-д оруулна уу $con = new connect_pdo();

Би саяхан OOP-г сурч эхэлсэн бөгөөд mysql-ийн оронд PDO ашиглаж байгаа тул асар их сайжруулах боломж байгаа гэдэгт би үнэхээр итгэж байна.
Тиймээс би эхлэгчдэд зориулсан хэд хэдэн зааварчилгааг дагаж, өөр өөр зүйл туршиж үзсэн ...

sessions.php
Энгийн сессүүдийг зохицуулахаас гадна би сессийн зарим ангиудыг дараах байдлаар эхлүүлдэг:

Хэрэв (!isset($_SESSION["sqlQuery"]))( session_start(); $_SESSION["sqlQuery"] = шинэ sqlQuery(); )

Тиймээс энэ анги хаа сайгүй байдаг. Энэ нь тийм ч сайн туршлага биш байж магадгүй (?)...
Ямар ч байсан энэ арга нь надад хаа сайгүй хийх боломжийг олгодог:

Echo $_SESSION["sqlQuery"]->getAreaName("county",9); // гаралт: Aust-Agder (мэдээллийн санд тухайн id бүхий мужийн нэр)

Миний дотор ангиМинийхийг өргөтгөсөн sqlQuery Анги connect_pdo , миний мэдээллийн сан дахь асуулгыг зохицуулдаг getAreaName нийтийн функцтэй.
Миний бодлоор их цэвэрхэн.

Дур булаам шиг ажилладаг
Тиймээс би үүнийг үндсэндээ ингэж хийдэг.
Мөн би ангиас өөрийн DB-ээс ямар нэгэн зүйл авах шаардлагатай бол үүнтэй төстэй зүйлийг хийдэг.

$id = 123; $sql = "Миний Хүснэгтээс ХААНА id = :id-с хүссэнээ сонго"; $qry = $con->бэлтгэх($sql); $qry -> bindParam(":id", $id, PDO::PARAM_INT); $qry -> гүйцэтгэх(); $ авах = $ qry-> татаж авах (PDO :: FETCH_ASSOC);

Учир нь би холболтыг доторх хувьсагч руу оруулж байна connect_pdo.php, Би зүгээр л лавлаж байна, би явахад бэлэн байна. Энэ нь ажилладаг. Би хүлээгдэж буй үр дүнд хүрч байна ...

Гэхдээ үүнээс үл хамааран; Намайг эндээс явах эсэхийг хэлж өгвөл би үнэхээр их баярлах болно. Үүний оронд би сайжруулахын тулд өөрчлөх боломжтой эсвэл өөрчлөх ёстой зүйлээ өөрчлөх хэрэгтэй болно ...

Би сурахыг үнэхээр хүсч байна ...

Хариултууд

$dsn = "mysql:host=таны_host_name;dbname=таны_db_нэр_энд"; // хостын нэр болон мэдээллийн сангийн нэрийг тодорхойлох $username = "та"; // хэрэглэгчийн нэрийг тодорхойлох $pwd = "таны_нууц үг"; // нууц үг оруулах оролдлого ( $db = new PDO($dsn, $username, $pwd); ) catch (PDOException $e) ( $error_message = $e->getMessage(); echo "алдаа олдсон тул үүнийг харуулж байна. "; гарах(); )

Би саяхан үүнтэй төстэй хариулт/асуултыг өөрөө бодож оллоо. Хэн нэгэн сонирхож байгаа бол би үүнийг хийсэн:

args = func_get_args();

) нийтийн функц __call($method, $args) ( if (empty($this->db)) ( $Ref = new \ReflectionClass("\PDO"); $this->db = $Ref->newInstanceArgs($) this->args ) буцаах call_user_func_array(array($this->db, $method), $args) );

Үүнийг дуудахын тулд та зөвхөн энэ мөрийг өөрчлөх хэрэгтэй:

$DB = шинэ \Номын сан\PDO(/* ердийн аргументууд */);

Хэрэв та үүнийг ашигладаг бол зөвлөмжийн төрөл (\Library\PDO$DB).

Энэ нь үнэхээр хүлээн зөвшөөрөгдсөн хариулт болон таныхтай төстэй юм; гэхдээ энэ нь мэдэгдэхүйц давуу талтай. Энэ кодыг анхаарч үзээрэй:

Хэдийгээр энэ нь ердийн PDO шиг харагдаж болох ч (зөвхөн тэр \Номын санд л өөрчилдөг) аль нь ч байсан эхний аргыг дуудах хүртэл объектыг эхлүүлэхгүй. PDO объектыг бий болгох нь бага зэрэг үнэтэй тул үүнийг илүү оновчтой болгодог. Энэ бол ил тод анги буюу Сүнс гэж нэрлэгддэг хэлбэр юм. Та $DB-г ердийн PDO жишээ шиг харж, дамжуулж, ижил үйлдлүүдийг хийж болно.

Би дэлхийн хэмжээнд өөрийн DB холболтод хандахын тулд $_SESSION ашиглахгүй байхыг зөвлөж байна.

Та хэд хэдэн зүйлийн аль нэгийг хийж болно (за хамгийн муу нь хамгийн сайндадлагажигч):

  • Өөрийн функц болон ангиудын доторх global $dbh ашиглан $dbh-д хандах
  • Синглон бүртгэлийг ашиглаад дэлхийн хэмжээнд хандах, жишээ нь:

    $registry = MyRegistry::getInstance(); $dbh = $registry->getDbh();

    Өгөгдлийн сангийн зохицуулагчийг шаардлагатай ангиудад нэмнэ үү:

    Анги MyClass ( нийтийн функц __construct($dbh) ( /* ... */ ) )

Гэсэн хэдий ч энэ нь арай илүү дэвшилтэт бөгөөд хүрээгүйгээр илүү "утас" шаарддаг. Тиймээс хэрэв хараат байдлын тарилга танд хэтэрхий төвөгтэй байвал глобал хувьсагчийн цуглуулгын оронд синглтон бүртгэлийг ашиглаарай.

Зорилтот

Миний харж байгаагаар энэ тохиолдолд таны зорилго хоёр талтай:

  • өгөгдлийн сан бүрийн хувьд дан/дахин ашиглах боломжтой холболт үүсгэж, хадгалах
  • холболт зөв тохируулагдсан эсэхийг шалгана уу

Шийдэл

$provider = function() ( $instance = new PDO("mysql:......;charset=utf8", "хэрэглэгчийн нэр", "нууц үг"); $instance->setAttribute(PDO::ATTR_ERRMODE, PDO: :ERRMODE_EXCEPTION $instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, худал); $ үйлдвэр = шинэ StructureFactory ($ үйлчилгээ үзүүлэгч);

Дараа нь өөр файлд эсвэл ижил файлын доор:

$something = $factory->create("Ямар нэгэн зүйл"); $foobar = $factory->create("Foobar");

Үйлдвэр өөрөө иймэрхүү харагдах ёстой.

Class StructureFactory ( protected $provider = null; protected $connection = null; public function __construct( дуудаж болох $provider) ( $this->provider = $provider; ) public function create($name) ( if ($this->холболт = == null) ( $this->холболт = call_user_func($this->provider); ) шинэ $name($this->холболт) буцаана)

Ингэснээр та зөвхөн шаардлагатай үед холболт үүсгэх боломжтой төвлөрсөн бүтэцтэй болно. Энэ нь мөн PHP-ийн нэгжийг шалгах, засвар үйлчилгээ хийх үйл явцыг хөнгөвчлөх бөгөөд энэ код нь дараах тэмдэгтүүдэд урвуу зураас нэмнэ: \x00 , \n , \r , \ , " , " болон \x1a . SQL шахах боломжийг багасгахын тулд оролтын утгыг параметр болгон дамжуулна уу.

  • Хамгийн дэвшилтэт арга бол PDO ашиглах явдал юм.
  • Энэ танд тусална гэж найдаж байна.

    Дараах асуултыг анхаарч үзээрэй.

    $iId = mysql_real_escape_string("1 OR 1=1"); $sSql = "СОНГОХ * Хүснэгтээс WHERE id = $iId";

    mysql_real_escape_string() энд хамгаалахгүй. Хэрэв та асуулга дотор хувьсагчийнхаа эргэн тойронд ганц хашилт ("") ашигладаг бол энэ нь таныг үүнээс хамгаалдаг. Доорх шийдлийг доор харуулав.

    $iId = (int) mysql_real_escape_string("1 OR 1=1"); $sSql = "СОНГОХ * Хүснэгтээс WHERE id = $iId";

    Энэ асуултад сайн хариултууд байна.

    PDO ашиглах нь хамгийн сайн сонголт гэдгийг би санал болгож байна.

    Засварлах:

    mysql_real_escape_string() нь PHP 5.5.0-аас хойш хуучирсан. Mysqli эсвэл PDO аль нэгийг ашиглана уу.

    mysql_real_escape_string()-ийн өөр хувилбар нь юм

    Мөр mysqli_real_escape_string (mysqli $link , string $escapestr)

    Жишээ:

    $iId = $mysqli->real_escape_string("1 OR 1=1"); $mysqli->query("SELECT * FROM table WHERE id = $iId");

    PDO (PHP Data Objects) нь PHP-д зориулсан өргөтгөл бөгөөд янз бүрийн мэдээллийн санд хандах энгийн интерфэйс юм. Энгийн бөгөөд товчоор хэлбэл, PHP-д PDO ашиглан янз бүрийн төрлийн мэдээллийн сантай холбогддог.

    Энэ зааварт бид MySQL мэдээллийн сантай холбогдох болно, учир нь энэ нь хамгийн түгээмэл мэдээллийн сан юм.

    Өгөгдлийн санд холбогдож байна

    Өгөгдлийн сангийн сервер нь нэртэй бөгөөд хэрэглэгчид холбогдох боломжтой, өөрөөр хэлбэл холбогдохын тулд нэвтрэх, нууц үг ашиглах шаардлагатай гэдгийг та мэдэх ёстой.

    Өгөгдлийн сантай хэрхэн холбогдож болох жишээ:

    $db = шинэ PDO("mysql:host=$host;dbname=$db", $хэрэглэгч, $pas);

    Хэрэв та PDO-г сонирхож байгаа бол таны мэдлэг хангалттай бөгөөд энэ синтаксийг танд тайлбарлах шаардлагагүй гэж бодож байна.

    Тиймээс бидэнд мэдээллийн санд хандах холболтын объект байна.

    Онцгой байдлын зохицуулалт

    PDO-г ашиглах үед би try(...)catch(...) бүтцийг ашиглан холболтын алдааг олохыг зөвлөж байна. Ийм кодын жишээ энд байна:

    Оролдоод үзээрэй ( $db = new PDO("myql:host=$host;dbname=$dbname", $user, $pass); ) catch(PDOException $e) ( echo "Танд алдаа байна: ".$e-> getMessage()."
    "; echo "Он шугаманд: ".$e->getLine(); )

    Алдаа засах талаар янз бүрийн санал бодол байдаг, жишээлбэл try(...)catch(...) бүтцийг ашиглахыг хүн бүр үргэлж зөвлөдөггүй. Гол нь PHP ямар ч байсан дэлгэцэн дээр алдааны мэдэгдлийг хэвлэх тул энэ код нь шаардлагагүй болно. Хэдийгээр та жишээлбэл, гүйлгээгээ буцаахыг хүсч байгаа бол энэ бүтэц нь танд ашигтай байх болно, гэхдээ доороос илүү ихийг хэлэх болно.

    PDO, query аргыг ашиглан мэдээллийн сангаас мэдээлэл авах

    Өгөгдлийн сангаас сонгохын тулд бид асуулгын аргыг ашигладаг бөгөөд SQL асуулгын мөрийг дамжуулдаг.

    $db->query("Хэрэглэгчдээс СОНГОХ *");

    Энэ синтакс нь бүх төрлийн мэдээллийн санд ажиллах болно гэдгийг бүү мартаарай.

    Мөн SQL асуулгад дамжуулагдсан мэдээллийн аюулгүй байдлын талаар бүү мартаарай. PDO нь mysql_real_escape_string() функцийн аналогтой - иш татах арга.

    $login = $db->quote($_POST["нэвтрэх"]); $sql = "Нэвтрэх = $нэвтрэх"; $үр дүн = $db->асуулга($sql);

    Үр дүнг боловсруулах, FETCH болон FETCHALL аргууд.

    Одоо бид $res хувьсагчийн үр дүнг массив болгон хөрвүүлэх хэрэгтэй. Үүнийг тогтмол дамжуулдаг FETCH аргыг ашиглан хийдэг.

    $res = $db->асуулга($sql); $үр дүн = $res->FETCH(PDO::FETCH_NUM); // дугаарлагдсан $үр дүн = $res->FETCH(PDO::FETCH_ASSOC); // ассоциатив $үр дүн = $res->FETCH(PDO::FETCH_BOTH); // ассоциатив ба хамт дугаарлагдсан $үр дүн = $res->FETCH(PDO::FETCH_OBJ); // объектын төрөл $үр дүн = $res->FETCH(PDO::FETCH_LAZY); // бүх төрлийн нэг дор

    Мэдээжийн хэрэг, FETCH_LAZY тогтмол нь скриптийг удаашруулдаг тул үүнийг ашиглахгүй байхыг зөвлөж байна.

    FETCH арга нь үр дүнгээс нэг бичлэгийг буцаана. Хэрэв та бүх бичлэгийг сэргээхийг хүсвэл FETCHALL аргыг ашиглах ёстой. Дараа нь FETCHALL-ийг ашигласны үр дүнд гарсан үр дүнг жишээнд үзүүлсэн шиг foreach давталтаар боловсруулна.

    $query = $db->query("Хэрэглэгчдээс СОНГОХ *"); $үр дүн = $query->FETCHALL(PDO::FETCH_ASSOC); foreach($arry гэсэн үр дүн) ( echo $arry["нэр"] ."
    "; }

    FETCH_CLASS тогтмол

    FETCH_CLASS тогтмол нь тусгай тайлбар шаарддаг бөгөөд энэ нь өгөгдлийн сангийн асуулгын үр дүнгээс урьдчилан үүсгэсэн ангийг бөглөх боломжийг олгодог.

    FETCH_CLASS тогтмолыг ашигласан жишээг харцгаая:

    Ангийн хэрэглэгч ( нийтийн $ нэвтрэх; нийтийн $ нэвтрүүлэх; нийтийн функц showInfo() ( echo "
    " . $ this-> pass."
    " . " : " . $this->нэвтрэх ."
    "; ) ) $үр дүн = $stmt->FETCHALL(PDO::FETCH_CLASS, "Хэрэглэгч"); foreach($хэрэглэгчийн үр дүн) ( $user->showInfo(); )

    Нэг чухал дүрмийг бүү мартаарай - үүсгэсэн анги дахь шинж чанаруудын нэр нь мэдээллийн сан дахь талбаруудын нэртэй ижил байх ёстой.

    Бэлтгэсэн илэрхийлэл

    Хэрэв таны SQL асуулга хувьсагчийг агуулж байвал бэлтгэсэн илэрхийллийг ашиглах ёстой.

    PDO бэлтгэсэн мэдэгдлүүд нь хэрэглэгчийн үүсгэсэн хувьсагчдыг агуулсан SQL асуулгыг гүйцэтгэх цорын ганц найдвартай арга учраас PHP өгөгдлийн объектуудыг ашиглах гол шалтгаан болдог.

    PDO дахь бэлтгэсэн илэрхийлэл нь хувьсагчийг тусгай тэмдэглэгээ - орлуулагчаар сольсон ердийн SQL асуулга юм.

    Нэрлэсэн орлуулагч

    Эхлээд нэрлэсэн орлуулагчийг харцгаая, түүний синтакс жишээ нь: :email.

    Орлуулагч ашиглан INSERT асуулгын жишээг харцгаая.

    $stmt = $db->prepare("INSERT INTO мессеж (мэйл, мессеж) VALUES (:email, :message)");

    Энэ жишээнд хүсэлтийн хувьсагчийн оронд бид хоёр орлуулагч ашигласан (:email, :message)").

    $stmt = $db->prepare("INSERT INTO мессеж (мэйл, мессеж) VALUES (:email, :message)"); $stmt->bindParam(":имэйл", $и-мэйл); $stmt->bindParam(":мессеж", мессеж); $email = "И-мэйл №1"; $message = "Зарим мессежийн текст"; $stmt->execute(); $email = "И-мэйл №2"; $message = "Зарим мессежийн текст"; $stmt->execute();

    SQL асуулга бэлтгэхийн тулд бид үүнийг бэлтгэх() аргаар бичдэг болохыг анхаарна уу. Дараа нь аль орлуулагч ямар хувьсагчийг холбохыг зааж өгөхийн тулд bindParam() аргыг ашиглана. SQL хайлтыг гүйцэтгэхийн тулд бид execute() аргыг дууддаг.

    Тиймээс, бэлтгэсэн илэрхийлэлтэй ажиллах дарааллыг алхам алхмаар дахин харуулав.

    1. Бид бэлтгэл () аргыг гүйцэтгэсний үр дүнг $stmt хувьсагч руу онооно.
    2. bindParam() аргыг ашиглан бид хувьсагч болон орлуулагчийг холбодог.
    3. Хувьсагчдад утгыг оноох.
    4. execute() аргыг ашиглан бид мэдээллийн бааз руу асуулга гүйцэтгэдэг.

    Энэ синтаксийг бичиж болно

    $stmt = бэлтгэх("ХЭРЭГЛЭГЧДҮҮДЭЭС НЭРИЙГ ХААНА и-мэйл = :и-мэйл СОНГОХ"); $stmt->execute(массив("имэйл" => $имэйл));

    Эндээс харахад массивыг execute() арга руу шилжүүлэх ёстой бөгөөд үүнд товчлуурууд нь орлуулагчдын нэртэй тохирч байх ёстой.

    Дашрамд хэлэхэд bindParam() арга нь bindValue() гэсэн ижил утгатай.

    Нэргүй орлуулагч

    Одоо нэргүй орлуулагчтай ажиллахыг харцгаая.

    $stmt = бэлтгэх("ХЭРЭГЛЭГЧДҮҮДЭЭС НЭРИЙГ ХААНА и-мэйл СОНГОХ =?") $stmt->execute(массив($имэйл));

    Энэ синтакс дээр орлуулагч:нэрийг бичихийн оронд түүний бичлэгийн өөр хэлбэрийг зааж өгсөн болно - асуултын тэмдэг:? .

    Энд $email массивын утгуудыг нэг нэгээр нь орлуулагчдад оноох болно:? , гэхдээ бидний жишээнд зөвхөн нэг орлуулагч байна.

    bindParam() аргыг ашиглан нэргүй орлуулагч ашиглах өөр нэг жишээ энд байна:

    $stmt = $db->prepare("Нийтлэлд INSERT INSERT (гарчиг, текст) VALUES (?, ?)"); $stmt->bindParam(1, $имэйл); $stmt->bindParam(2, $мессеж); $email = "И-мэйл №1"; $message = "Зарим мессежийн текст"; $stmt->execute(); $email = "И-мэйл №2"; $message = "Зарим мессежийн текст"; $stmt->execute();

    Өгөгдлийн санд оруулах exec() арга

    Хэрэв бид мэдээллийн санд ямар нэгэн зүйл бичихийг хүсвэл PDO::exec() аргыг ашиглаж болно.

    $sql = "INSERT INTO (нэвтрэх, нууц үг) VALUES ($login, $нууц үг)"; $үр дүн = $db->exec($sql);

    Хэрэв энэ асуулгыг гүйцэтгэсэн бол $result хувьсагч нь хүснэгтэд нөлөөлсөн мөрүүдийн тоог агуулна.

    PDO::exec() нь INSERT асуулга гүйцэтгэдэг боловч өгөгдлийн сангаас мэдээлэл авах боломжгүй. Үүнийг PDO::query() аргаар гүйцэтгэдэг. PDO::exec() нь зөвхөн SQL хайлтыг ажиллуулж, гүйцэтгэх явцад оролцсон мөрийн тоог буцаадаг бөгөөд SELECT мэдэгдлийн үр дүнг буцаадаггүй.

    PDO нь мэдээллийн сантай ажилладаг. Хэрэв та зарим төрлийн мэдээллийн сантай ажиллах боломжгүй бол php.ini руу орж өргөтгөл=php_pdo_(өгөгдлийн сангийн нэр)-ээр эхэлсэн мөрүүдийг хайж, тайлбарыг арилгана уу.

    Эхлэгчдэд зориулсан Php: Дуудлага хийх функцууд, Хичээл 34! https://www.youtube.com/watch?v=2NwLHXUoXcw https://www.youtube.com/watch?v=GMzI6jR_bE4 https://www.youtube.com/watch?v=gFJsBQIqpto PHP 9-р хичээлийн давталт https:// ://www.youtube.com/watch?v=gLAeJcKkd6c http://php.net/manual/ru/mysqli-result.fetch-array.php /* түүвэрлэлтийн үр дүнг арилгах */ mysqli_free_result($result); /* холболтыг хаах */ mysqli_close($link); http://myrusakov.ru/sql-osnovy.html Сайн нийтлэл: https://ru.wikipedia.org/wiki/Join_(SQL) OOP PHP. Өргөтгөлийн хэрэгслүүд Мэтт Зандстрагийн "PHP. Объектууд, загварууд ба програмчлалын техникүүд" номын "Өргөтгөлийн хэрэгслүүд" бүлэг. https://www.youtube.com/watch?v=6L2bxtTBCRo

    http://phpfaq.ru/pdo#intro - энд сайн нийтлэл байна. Үл хамаарах зүйлийн талаар чухал мэдээлэл байна.

    Үүнийг илүү энгийнээр тайлбарласан болно: http://myrusakov.ru/php-data-objects.html

    Видео: https://www.youtube.com/watch?v=ACUiBH5qV0U&list=PLr_acfJGVcirEijJXmKxj8QGkWkKb-Tj-&nohtml5=False


    2018 оны 6-р сарын 3 Андрей Чернышов Орчуулгын заавар 1737 0

    PDO нь PHP Data Objects гэсэн үгийн товчлол юм: энэ нь объект ашиглан мэдээллийн сантай ажиллахад зориулагдсан РНР өргөтгөл юм. Үүний нэг давуу тал нь тодорхой мэдээллийн сантай шууд холбогддоггүй явдал юм: түүний интерфэйс нь MySQL, SQLite, PostgreSQL, Microsoft SQL Server зэрэг хэд хэдэн өөр орчинд хандах боломжийг олгодог.

    Энэхүү гарын авлага нь PDO-ийн талаархи бүрэн тоймыг өгөх, өгөгдлийн сан үүсгэх, холбогдохоос эхлээд хамгийн тохиромжтой хайлт хийх аргыг сонгох, бэлтгэсэн асуулга хэрхэн үүсгэхийг харуулах, алдаа гарч болзошгүй горимуудыг тайлбарлах хүртэл алхам алхмаар уншигчдад хүргэх зорилготой юм.

    Туршилтын мэдээллийн сан, хүснэгт үүсгэх

    Юуны өмнө бид мэдээллийн сан үүсгэх болно:

    нарны_системийг ӨГӨГДӨЛИЙН САН БҮТЭЭХ; Нарны_систем ДЭЭР БҮХ ЭРХ АВЧ ОЛГОНО.* "testuser"@"localhost"-д "testpassword"-аар тодорхойлогддог;

    Бид solar_system мэдээллийн сан дахь тестийн нууц үг ашиглан хэрэглэгчдэд бүх эрхийг олгосон. Одоо хүснэгт үүсгэж, зарим мэдээллээр дүүргэцгээе.

    нарны_системийг ашиглах; CREATE TABLE гаригууд (id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), нэр VARCHAR(10) NOT NULL, color VARCHAR(10) NOT NULL); INSERT INTO гаригууд(нэр, өнгө) VALUES("дэлхий", "цэнхэр"), ("Ангараг", "улаан"), ("бархасбадь", "хачин");

    DSN (Өгөгдлийн эх сурвалжийн нэр) холболтын тодорхойлолт

    Одоо бид мэдээллийн сантай болсон тул DSN-ийг тохируулах хэрэгтэй. DSN нь Data Source Name гэсэн үгийн товчлол бөгөөд өгөгдлийн сантай холбогдоход шаардлагатай мэдээллийн багц бөгөөд DSN нь мөр хэлбэртэй байна. Синтакс нь таны холбогдох өгөгдлийн сангаас хамаарч өөр өөр байдаг ч бид MySQL/MariaDB ашиглаж байгаа тул дараах зүйлийг тохируулах шаардлагатай.

    • Холболтод ашигласан драйверын төрөл;
    • Өгөгдлийн сан ажиллаж байгаа үндсэн компьютерийн нэр;
    • Холболтын порт (заавал биш);
    • Өгөгдлийн сангийн нэр;
    • Кодчилол (заавал биш).

    Манай тохиолдолд мөрийн формат дараах байдалтай байна (бид үүнийг $dsn хувьсагчд хадгалах болно):

    $dsn = "mysql:host=localhost;port=3306;dbname=solar_system;charset=utf8";

    Юуны өмнө бид мэдээллийн сангийн угтвар эсвэл мэдээллийн сангийн угтварыг тохируулдаг. Энэ тохиолдолд бид MySQL/MariaDB төрлийн мэдээллийн сантай холбогдож байгаа тул mysql ашиглаж байна. Дараа нь бид угтварыг шугамын үлдсэн хэсгээс хоёр цэгээр тусгаарлаж, дараагийн хэсэг бүрийг бусад хэсгээс цэгтэй таслалаар тусгаарлав.

    Дараагийн хоёр хэсэгт бид мэдээллийн бааз ажиллаж байгаа хостын нэр, холболтод ашигласан портыг зааж өгсөн. Хэрэв порт заагаагүй бол өгөгдмөл портыг ашиглана, энэ тохиолдолд 3306. Өгөгдлийн сангийн нэр тэмдэглэгдсэний дараа шууд .

    PDO объект үүсгэх

    Одоо манай DSN бэлэн болсон тул бид PDO объектыг үүсгэж эхэлнэ. PDO бүтээгч нь DSN мөрийг эхний параметр болгон, мэдээллийн сангийн хэрэглэгчийн нэрийг хоёр дахь параметр болгон, нууц үгийг гурав дахь параметр болгон, нэмэлт тохиргооны массивыг дөрөв дэх параметр болгон ашигладаг.

    $сонголтууд = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]; $pdo = шинэ PDO($dsn, "туршигч", "туршилтын нууц үг", $сонголт);

    SetAttribute() аргыг ашиглан объект үүсгэсний дараа тохиргоог хийж болно:

    $pdo->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    Алдаа харахын тулд PDO-г тохируулж байна

    PDO::ATTR_ERRMODE-д ашиглах боломжтой зарим сонголтуудыг харцгаая. Эдгээр сонголтууд нь алдаа гарах үед PDO хэрхэн ажиллахыг тодорхойлдог тул маш чухал юм. Боломжит сонголтууд:

    PDO::ERRMODE_SILENT

    Өгөгдмөл сонголт. PDO нь зүгээр л алдааны код болон алдааны мессежийг илгээх болно. Тэдгээрийг errorCode() болон errorInfo() аргуудыг ашиглан олж авч болно.

    PDO::ERRMODE_EXCEPTION

    Энэ сонголтыг миний бодлоор ашиглахыг зөвлөж байна. Үүний тусламжтайгаар PDO нь алдааны код, мэдээлэл гаргахаас гадна скриптийн гүйцэтгэлийг тасалдуулах PDOException-ийг шидэх бөгөөд энэ нь PDO гүйлгээнд бас тустай (бид үүнийг дараа нь харах болно).

    PDO::ERRMODE_WARNING

    Энэ сонголтоор PDO нь PDO::ERRMODE_SILENT шиг алдааны код болон мессежийг харуулах боловч скриптийг тасалдуулахгүй АНХААРУУЛГА анхааруулах болно.

    Өгөгдмөл дээж авах аргыг тохируулах

    Өөр нэг чухал тохиргоог PDO::DEFAULT_FETCH_MODE тогтмол ашиглан зохицуулдаг. Энэ нь танд хүсэлтийн үр дүнг авахад ашиглагдах fetch() аргын анхдагч үйлдлийг тохируулах боломжийг олгоно. Энд хамгийн түгээмэл хэрэглэгддэг сонголтууд байна:

    PDO::FETCH_BOTH

    Үүнийг ашиглах үед олж авсан үр дүнг бүхэл тоо болон баганын нэрээр индексжүүлнэ. Үүнийг гаригуудын хүснэгтээс мөр авах аргад ашиглах нь дараах үр дүнг өгнө.

    $stmt = $pdo->query("Гаригуудаас СОНГОХ *"); $үр дүн = $stmt->татаж авах(PDO::FETCH_BOTH);

    Массив ( => 1 => 1 => дэлхий => дэлхий => цэнхэр => цэнхэр)

    PDO::FETCH_ASSOC

    Энэ тогтмолын тусламжтайгаар үр дүн нь түлхүүр бүр баганын нэр байх ассоциатив массив руу бичигдэх бөгөөд утга тус бүр нь мөр дэх тодорхой утгыг илэрхийлэх болно.

    $stmt = $pdo->query("Гаригуудаас СОНГОХ *"); $үр дүн = $stmt->татаж авах(PDO::FETCH_ASSOC);

    Массив ( => 1 => дэлхий => цэнхэр)

    PDO::FETCH_NUM

    PDO::FETCH_NUM тогтмолыг ашигласнаар бид 0 индексжүүлсэн массивыг авна:

    Массив ( => 1 => дэлхий => цэнхэр)

    PDO::FETCH_COLUMN

    Энэ тогтмол нь баганаас зөвхөн утгыг авахад тустай бөгөөд арга нь энгийн нэг хэмжээст массив доторх бүх үр дүнг буцаана. Жишээлбэл, энд хүсэлт байна:

    Массив ( => Дэлхий => Ангараг => Бархасбадь)

    PDO::FETCH_KEY_PAIR

    Энэ тогтмол нь хоёр баганаас утгыг авах шаардлагатай үед хэрэг болно. fetchAll() арга нь үр дүнг ассоциатив массив болгон буцаана. Энэ массивт эхний баганын өгөгдлийг түлхүүр хэлбэрээр, хоёр дахь баганаас утгыг зааж өгнө.

    $stmt = $pdo->query("Гаригуудаас нэр, өнгө СОНГОХ"); $үр дүн = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

    Энэ тогтмол нь баганаас зөвхөн утгыг авахад тустай бөгөөд арга нь энгийн нэг хэмжээст массив доторх бүх үр дүнг буцаана. Жишээлбэл, энд хүсэлт байна:

    Массив ( => цэнхэр => улаан => хачин)

    PDO::FETCH_OBJECT

    PDO::FETCH_OBJECT тогтмолыг ашиглах үед татагдсан мөр бүрт нэргүй объект үүснэ. Түүний (нийтийн) шинж чанаруудыг баганатай ижил нэрлэх бөгөөд асуулгын үр дүнг утга болгон ашиглах болно. Дээрхтэй ижил асуулгад энэ аргыг ашигласнаар дараах үр дүн гарна.

    $үр дүн = $stmt->татаж авах(PDO::FETCH_OBJ);

    stdClass Объект ( => дэлхий => цэнхэр)

    PDO::FETCH_CLASS

    Өмнөх тогтмолын нэгэн адил энэ нь баганын утгыг объектын шинж чанаруудад өгөх боловч энэ тохиолдолд бид объектыг үүсгэхэд ашиглагдах одоо байгаа ангиудыг тохируулах ёстой. Үзүүлэхийн тулд эхлээд бид анги үүсгэнэ:

    Class Planet ( private $name; private $color; public function setName($planet_name) ( $this->name = $planet_name; ) public function setColor($planet_color) ( $this->color = $planet_color; ) public function getName () ( $this->нэрийг буцаана; ) нийтийн функц getColor() ( $this->өнгө буцаана; ))

    Кодын энгийн байдалд анхаарлаа хандуулах хэрэггүй, бидний үүсгэсэн Planet классыг илүү сайн харцгаая: энэ нь хувийн шинж чанартай бөгөөд анги нь байгуулагчгүй. Одоо үр дүнд хүрэхийг хичээцгээе.

    PDO::FETCH_CLASS-тай fetch()-г ашиглахдаа өгөгдлийг татахын өмнө объект дээр setFetchMode() аргыг ашиглах ёстой, жишээлбэл:

    $stmt = $pdo->query("Гаригуудаас нэр, өнгө СОНГОХ"); $stmt->setFetchMode(PDO::FETCH_CLASS, "Гариг");

    Бид PDO::FETCH_CLASS тогтмолыг setFetchMode() аргын эхний аргумент болгон, хоёр дахь аргумент болгон объектыг үүсгэхэд ашигласан ангийн нэрийг (манай тохиолдолд “Planet”) зааж өгсөн. Одоо кодыг ажиллуулъя:

    $planet = $stmt->fetch();

    Үүний үр дүнд Planet объект гарч ирнэ:

    Var_dump($planet);

    Гаригийн объект ( => дэлхий => цэнхэр)

    "Planet" анги нь тодорхой бүтээгчгүй байсан тул шинж чанарыг тодорхойлоход ямар ч асуудал гараагүй; гэхдээ тухайн ангид шинж чанараа тохируулж, өөрчилдөг бүтээгч байвал яах вэ? Утга нь бүтээгчийг ажиллуулахаас өмнө өгөгдсөн тул тэдгээрийг дарж бичих болно.

    PDO нь FETCH_PROPS_LATE тогтмолыг өгөхөд тусалдаг: ашиглах үед объектыг үүсгэсний дараа утгыг онооно. Жишээ:

    Class Planet ( private $name; private $color; public function __construct($name = сар, $өнгө = саарал) ( $this->name = $name; $this->color = $color; ) public function setName($ гаригийн_нэр) ( $this->нэр = $planet_name; ) нийтийн функц setColor($planet_color) ( $this->color = $planet_color; ) нийтийн функц getName() ( $this->нэрийг буцаана; ) нийтийн функц getColor() ($this->өнгө буцаана;))

    Бид Planet ангидаа нэр болон өнгө гэсэн хоёр аргумент авах бүтээгчийг бий болгохын тулд өөрчилсөн. Эдгээр аргументууд нь сар, саарал гэсэн үндсэн утгуудтай бөгөөд хэрэв өөр утгыг өгөөгүй бол тэдгээрийг тохируулна гэсэн үг юм.

    Энэ тохиолдолд, хэрэв бид FETCH_PROPS_LATE-г ашиглаагүй бол мэдээллийн сангаас ямар утгыг авсан ч бүх шинж чанарууд нь үндсэн хэвээр байх болно, учир нь объект үүсгэх явцад тэдгээрийг дарж бичих болно. Үүнийг шалгахын тулд дараах асуулгыг ажиллуулъя:

    $stmt = $pdo->query("Нэр, өнгө ХААНА нарны_системээс СОНГОХ нэр = "дэлхий""); $stmt->setFetchMode(PDO::FETCH_CLASS, "Гариг"); $planet = $stmt->fetch();

    Одоо Planet объектыг харцгаая, түүний шинж чанаруудтай ямар үнэ цэнэ тохирч байгааг шалгацгаая.

    Var_dump($planet);

    object(Planet)#2 (2) ( ["нэр":"Гараг":хувийн]=> мөр(4) "сар" ["өнгө":"Гараг":хувийн]=> мөр(4) "саарал" )

    Хүлээгдэж буйчлан мэдээллийн сангаас олж авсан утгуудыг анхдагч утгуудаар дарж бичсэн. Одоо бид FETCH_PROPS_LATE тогтмол (мөн өмнөхтэй ижил асуулга) ашиглан асуудлын шийдлийг харуулах болно.

    $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Гариг"); $planet = $stmt->fetch(); var_dump($planet);

    Class Planet ( private $name; private $color; public function __construct($name, $color) ( $this->name = $name; $this->color = $color; ) [...] )

    Одоо бүтээгчийн аргумент шаардлагатай байгаа тул бид дараахыг ажиллуулна:

    $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Гараг", ["сар", "саарал"]);

    Энэ тохиолдолд бидний тодорхойлсон параметрүүд нь зөвхөн объектыг алдаагүй ажиллуулахад шаардлагатай үндсэн утгуудын үүрэг гүйцэтгэдэг: тэдгээрийг мэдээллийн сангаас авсан утгуудаар дарж бичнэ.

    Олон объектыг татаж авах

    Мэдээжийн хэрэг, fetch() аргыг ашиглан эсвэл давталтаар дамжуулан олон үр дүнг нэг дор объект хэлбэрээр авах боломжтой.

    while ($planet = $stmt->fetch()) ( // Үр дүнтэй холбоотой зүйл )

    Эсвэл бүх үр дүнг нэг дор авах боломжтой. Энэ тохиолдолд, өмнө дурьдсанчлан, fetchAll() аргыг ашиглахдаа та дуудах горимыг тухайн аргыг ажиллуулахаас өмнө биш, харин ажиллаж байх үед нь зааж өгөх хэрэгтэй болно.

    $stmt->fetchAll(PDO::FETCH_CLASS|PDO_FETCH_PROPS_LATE, "Гараг", ["сар", "саарал"]);

    PDO::FETCH_INTO

    Энэ тогтмолыг ашиглах үед PDO нь шинэ объект үүсгэхгүй, харин байгаа объектын шинж чанарыг шинэчилдэг, гэхдээ энэ нь нийтэд нээлттэй эсвэл объект дотор __set() аргыг ашигласан тохиолдолд л шинэчлэгддэг.

    Шууд хүсэлтийн эсрэг бэлтгэсэн

    PDO нь асуулгатай ажиллах хоёр аргатай: шууд, илүү найдвартай нь бэлтгэгдсэн.

    Шууд хүсэлтүүд

    Шууд асуулга ашиглах хоёр үндсэн арга байдаг: query() ба exec() . Эхнийх нь PDOStatemnt объектыг үүсгэдэг бөгөөд түүнд fetch() эсвэл fetchAll() аргуудаар хандаж болно: хэрэв та тэдгээрийг SELECT гэх мэт хүснэгт өөрчлөгдөхгүй тохиолдолд ашигладаг бол.

    Харин хоёр дахь арга нь асуулгад өөрчилсөн мөрийн дугаарыг буцаана: бид үүнийг INSERT, DELETE эсвэл UPDATE гэх мэт мөрүүдийг орлуулах тохиолдолд ашигладаг. Шууд асуулга нь асуулгад хувьсагч байхгүй, аргын аюулгүй байдалд эргэлзээгүй тохиолдолд л хэрэглэгдэх ёстой.

    Бэлтгэсэн асуулга

    PDO нь хоёр үе шаттай бэлтгэсэн асуулгыг дэмждэг: эдгээр нь асуулга нь хувьсагчтай үед хэрэг болдог бөгөөд бэлтгэл () арга нь бидэнд шаардлагатай бүх ажлыг хийх тул ерөнхийдөө аюулгүй байдаг. Хувьсагчдыг хэрхэн ашиглаж байгааг харцгаая. Бид гаригуудын шинж чанарыг Гарагуудын хүснэгтэд оруулахыг хүсч байна гэж төсөөлөөд үз дээ. Эхлээд хүсэлтээ бэлдье:

    $stmt = $pdo->prepare("InSERT INTO гаригуудад(нэр, өнгө) VALUES(?, ?)");

    Өмнө дурьдсанчлан, бид хувьсагчдын түр зуурын утгуудыг ашиглан SQL асуулга аргумент болгон авах бэлтгэл () аргыг ашигладаг. Түр зуурын утгууд нь хоёр төрлийн байж болно: байрлалын болон нэрлэсэн.

    Байршил

    Ашиглах уу? Байршлын түр зуурын утгуудын хувьд код нь илүү товч боловч бид execute() аргын аргумент болгон өгсөн массив дахь баганын нэрстэй ижил дарааллаар оруулах өгөгдлийг зааж өгөх ёстой:

    $stmt->execute([$planet->нэр, $planet->өнгө]);

    Хувийн болгосон

    Нэрлэсэн орлуулагчийг ашигласнаар бидэнд тодорхой дараалал хэрэггүй, гэхдээ үр дүнд нь бид илүү олон код авдаг. Бид execute() аргыг ажиллуулахдаа өгөгдлийг ассоциатив массив хэлбэрээр өгөх ёстой бөгөөд түлхүүр бүр нь ашигласан түр зуурын утгын нэр бөгөөд холбогдох утга нь асуулгад хийгдэж байгаа утга юм. Жишээлбэл, өмнөх хүсэлт нь:

    $stmt = $pdo->prepare("INSERT INTO гаригуудад(нэр, өнгө) VALUES(:нэр, :өнгө)"); $stmt->execute(["нэр" => $planet->нэр, "өнгө" => $planet->өнгө]);

    Reading() болон execute() аргуудыг хоёуланг нь мэдээллийн сангаас мэдээллийг өөрчлөх эсвэл зүгээр л татаж авах асуулгад ашиглаж болно. Эхний тохиолдолд бид мэдээлэл авахын тулд дээр дурдсан татах аргуудыг ашигладаг бол хоёр дахь тохиолдолд бид rowCount() аргыг ашигладаг.

    bindValue() болон bindParam() аргууд

    bindValue() болон bindParam() аргуудыг хүсэлтэнд оруулах утгыг өгөхийн тулд ашиглаж болно. Эхнийх нь өгөгдсөн хувьсагчийн утгыг хүсэлтийг бэлтгэхэд ашигласан байрлалын эсвэл нэртэй түр зуурын утгатай холбодог. Өмнөх тохиолдлыг жишээ болгон авч үзвэл бид дараахь зүйлийг хийх болно.

    $stmt->bindValue("нэр", $planet->нэр, PDO::PARAM_STR);

    Бид $planet->name-ийн утгыг түр зуурын утгатай холбодог:name . bindValue() болон bindParam() аргуудын аль алиныг нь ашигласнаар бид мөн тохирох PDO тогтмолыг ашиглан хувьсагчийн төрлийг гурав дахь аргумент болгон зааж өгч болохыг анхаарна уу, энэ тохиолдолд PDO::PARAM_STR .

    Оронд нь bindParam()-г ашигласнаар бид хувьсагчийг асуулга бэлтгэхэд ашигласан тохиромжтой түр зуурын утгатай холбож чадна. Энэ тохиолдолд хувьсагч нь лавлагаатай байх ба execute() аргыг ажиллуулж байх үед түүний утгыг түр зуурын болгож өөрчилнө гэдгийг анхаарна уу. Синтакс нь сүүлийн үеийнхтэй ижил байна:

    $stmt->bindParam("нэр", $planet->нэр, PDO::PARAM_STR)

    Бид хувьсагчийг утгыг нь биш, $planet->name -д холбосон:name! Дээр дурдсанчлан, солих нь execute() аргыг ажиллуулах үед л хийгдэх тул түр зуурын утгыг тухайн үед хувьсагчийн утгаар солих болно.

    PDO гүйлгээ

    Гүйлгээ нь олон асуулга явуулах үед тогтвортой байдлыг хадгалах боломжийг олгодог. Бүх асуулга нь багц хэлбэрээр хийгдэх бөгөөд тэдгээр нь амжилттай болсон тохиолдолд л мэдээллийн санд хэрэгжинэ. Гүйлгээ нь бүх мэдээллийн сантай ажиллахгүй бөгөөд бүх SQL бүтэцтэй ажиллахгүй, учир нь тэдгээрийн зарим нь асуудал үүсгэдэг.

    Гайхалтай бөгөөд хачирхалтай жишээ болгон хэрэглэгч гаригуудын жагсаалтыг сонгох ёстой гэж төсөөлөөд үз дээ, шинэ сонголт хийх болгондоо та шинийг оруулахаасаа өмнө өмнөхийг нь мэдээллийн сангаас устгах хэрэгтэй болно. Устгасан ч оруулаагүй бол яах вэ? Бид гариггүй хэрэглэгчтэй болно! Үндсэндээ гүйлгээг дараах байдлаар хэрэгжүүлнэ.

    $pdo->beginTransaction(); оролдоорой ( $stmt1 = $pdo->exec("Гаригуудаас УСТГАХ"); $stmt2 = $pdo->бэлтгэх("INSERT INTO гаригуудад(нэр, өнгө) VALUES (?,?)"); foreach ($planets as $planet) ( $stmt2->execute([$planet->getName(), $planet->getColor()]); ) $pdo->commit() ) catch (PDOException $e) ( $pdo-> rollBack ();

    Юуны өмнө, PDO объект дээрх beginTransaction() арга нь хүсэлтийг автоматаар гүйцэтгэхийг идэвхгүй болгож, дараа нь хүсэлтийг шаардлагатай дарааллаар эхлүүлнэ. Энэ үед, хэрэв PDOException тохиолдоогүй бол хүсэлтүүд автоматаар commit() аргаар дамждаг, эс тэгвээс гүйлгээг rollBack() аргаар цуцалж, автоматаар гүйцэтгэнэ.

    Ийм маягаар олон хүсэлт гаргаснаар үргэлж тогтвортой байх болно. Энэ нь маш ойлгомжтой боловч PDO гүйлгээг зөвхөн PDO::ATTR_ERRMODE-д PDO::ERRMODE_EXCEPTION гэж тохируулсан ашиглаж болно.

    Өгөгдлийн сангийн холболт PDO ангийн жишээг үүсгэх үед тохируулагдана. Ямар драйвер сонгох нь хамаагүй; Та үргэлж PDO анги ашиглах хэрэгтэй болно. Түүний бүтээгч нь өгөгдлийн сангийн эх сурвалжийг (DSN гэгддэг) зааж өгөх параметрүүдийг, хэрэглэгчийн нэр, нууц үгийн нэмэлт параметрүүдийг хүлээн зөвшөөрдөг.

    MySQL холболт:

    $dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass);

    Хэрэв ямар нэгэн холболтын алдаа гарвал үл хамаарах зүйл гарч ирнэ: PDOException ангийн объект. Хэрэв та энэ нөхцөл байдлыг шийдвэрлэхийг хүсвэл үүнийг барьж болно, эсвэл set_exception_handler()-ээр тохируулсан глобал онцгой байдлын зохицуулагчийн хувьд үүнийг орхиж болно.

    Холболтын алдааг зохицуулах:

    оролдоорой ( $dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass); foreach($dbh->query('SELECT * from FOO') $row) ( print_r($) row ) $dbh = null; ) catch (PDOException $e) ( die("Алдаа! Энэ бол энд байна... ".$e->getMessage()); )

    Анхаар:Хэрэв та PDO бүтээгчийн шидсэн үл хамаарах зүйлийг барьж чадахгүй бол zend хөдөлгүүрийн хийсэн үндсэн үйлдэл нь скриптийг зогсоож, ул мөрийг харуулах явдал юм. Энэ новш нь мэдээллийн сантай харилцах бүх нарийн ширийн зүйлийг илчлэх болно. Тэр нь хэрэглэгчийн нэр, нууц үг зэрэг мэдээллийн сангийн холболтын дэлгэрэнгүй мэдээллийг харуулах болно!Энэ үл хамаарах зүйлийг тодорхой (мэдэгдэлээр дамжуулан) олж авах нь танаас хамаарна барьж үзээрэй), эсвэл set_exception_handler()-ээр дамжуулан далд хэлбэрээр.

    Өгөгдлийн сантай холболт амжилттай болсны дараа энэ нь PDO объектын жишээний бүх хугацаанд идэвхтэй хэвээр байна. Холболтыг хаахын тулд та объектыг устгах ёстой бөгөөд үүний үлдсэн бүх лавлагаа устгагдсан байх ёстой - энэ нь тухайн объектыг агуулсан хувьсагчид NULL утгыг оноож болно. Хэрэв та үүнийг тодорхой хийхгүй бол скриптээс гарах үед PHP автоматаар холболтыг хаах болно.

    Холболтыг хаах:

    $dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass);

    // Бид энд ямар нэг зүйл хийж байна: ... // Тэгээд одоо, анхаарал: холболтын төгсгөл!

    $dbh = null;

    Олон вэб програмууд нь мэдээллийн баазын серверүүдтэй байнгын холболт үүсгэх нь ашигтай байдаг. Байнгын холболтууд нь скриптээс гарах үед хаагдахгүй, харин өөр скрипт ижил холболтын итгэмжлэлүүдийг ашиглан холболт хүсэх үед кэшд хадгалагдаж, дахин ашиглагддаг. Байнгын холболтын кэш нь скрипт нь мэдээллийн сантай холбогдох бүрд шинэ холболт үүсгэх нэмэлт ачааллаас зайлсхийж, вэб програмуудыг хурдан ажиллуулахад хүргэдэг.

    Байнгын холболтыг тохируулах:$dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => үнэн)); Санаж байгаарай:Хэрэв та байнгын холболтыг ашиглахыг хүсвэл тохируулах ёстой PDO::ATTR_PERSISTENT PDO ангиллын бүтээгч рүү дамжуулсан драйверийн сонголтуудын массив дахь. Объектыг үүсгэсний дараа энэ атрибутыг PDO::setAttribute()-аар тохируулснаар драйвер байнгын холбоосыг ашиглахгүй. Мөн түүнчлэн, энэ тохиолдолд та PDOStatement ангийг зарим хэрэгцээнд зориулан сунгах боломжгүй болно, жишээлбэл.

    Заавар