Pdo php skript 2 marta bajariladi. PHP PDO - ma'lumotlar bazalari bilan to'g'ri ishlash



meta teg kalit so'zlariga misol (4)

Maqsad

Ko'rib turganimdek, bu holda sizning maqsadingiz ikki xil:

  • har bir ma'lumotlar bazasi uchun bir martalik / qayta ishlatiladigan ulanishni yaratish va qo'llab-quvvatlash
  • ulanish to'g'ri sozlanganligiga ishonch hosil qiling

Yechim

$ provayder = funktsiya () ($ misol = yangi PDO ("mysql: ......; charset = utf8", "foydalanuvchi nomi", "parol")); $ instance-> setAttribute (PDO :: ATTR_ERRMODE, PDO: $ ERRMODE_EXCEPTION); $ instance-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, noto'g'ri); $ instansiyasini qaytarish;); $ zavod = yangi StructureFactory ($ provayder);

Keyin boshqa faylda yoki pastda xuddi shu faylda:

$ nimadir = $ zavod-> yaratish ("nimadir"); $ foobar = $ zavod-> yaratish ("Foobar");

Zavodning o'zi shunday bo'lishi kerak:

Class StructureFactory (himoyalangan $ provayder = null; himoyalangan $ ulanish = null; umumiy funktsiya __construct (chaqiriladigan $ provayder) ($ this-> provayder = $ provayder;) umumiy funktsiyani yaratish ($ nomi) (agar ($ this-> aloqa = == null) ($ this-> connection = call_user_func ($ this-> provider);) yangi $ nomini qaytarish ($ this-> ulanish);))

Shunday qilib, ulanish faqat kerak bo'lganda yaratilishini ta'minlaydigan markazlashtirilgan tuzilishga ega bo'lishingiz mumkin. Bu shuningdek, qurilmani tekshirish va texnik xizmat ko'rsatish jarayonini osonlashtiradi.

Bunday holda, provayder yuklash bosqichida topiladi. Ushbu yondashuv, shuningdek, JBga ulanish uchun foydalanadigan konfiguratsiyani aniqlash mumkin bo'lgan aniq manzilni beradi.

Iltimos, shuni biling juda soddalashtirilgan misol... Shuningdek, siz quyidagi ikkita videoni tomosha qilishingiz mumkin:

Shuningdek, men PDO -dan foydalanish bo'yicha to'g'ri qo'llanmani o'qishni tavsiya qilaman (Internetda yomon o'quv jurnallari mavjud).

Vaqti -vaqti bilan ma'lumotlar bazasiga ulanish haqidagi savollarni ko'raman.
Javoblarning aksariyati men qanday qilayotganim emas, yoki men to'g'ri javob bera olmayman. Har holda; Men bu haqda hech o'ylamagan edim, chunki bu usul men uchun ishlaydi.

Lekin bu erda aqldan ozgan fikr bor; Balki men hammasini noto'g'ri qilyapman, agar shunday bo'lsa; Men bazaga qanday qilib to'g'ri ulanishni bilmoqchiman MySQL ma'lumotlari PHP va PDO -dan foydalaning va uni mavjud qiling.

Men buni shunday qilaman:

Birinchidan, bu mening fayl tuzilmam (yechib olingan) :

Public_html / * index.php * ishga tushirish / - load.initialize.php - configure.php - session.php

index.php
Eng yuqori qismida men talab qilaman ("initialize / load.initialize.php"); ,

load.initialize.php

# sayt konfiguratsiyasi talab qilinadi ("configure.php"); # ma'lumotlar bazasiga ulanish talab qilinadi ("root / somewhere / connect.php"); // bu fayl xavfsizligi uchun public_html tashqarisida joylashtirilgan. # $ class_filename sifatida foreach (glob ("aktivlar / sinflar / *. class.php") sinflarini o'z ichiga oladi. $ func_filename sifatida) (o'z ichiga oladi ($ func_filename);) # ishlov berish seanslari talab qilinadi ("session.php");

Men darslarni qo'shishning yaxshiroq yoki to'g'ri yo'li borligini bilaman, lekin bu nima ekanligini eslay olmayman. Hali o'rganishga vaqtim yo'q, lekin menimcha, bu avtomatik yuklangan narsa edi. shunga o'xshash narsa ...

configure.php
Bu erda men, asosan, ayrimlarini bekor qilyapman php.ini-saytning xususiyatlari va boshqa global parametrlarini sozlash

ulanish.php
Men boshqa sinflar bo'lishi uchun sinfga ulanganman kengaytirish bu ...

Connect_pdo klassi (himoyalangan $ dbh; umumiy funktsiya __construct () (harakat qilib ko'ring ($ db_host = ""; // hostname $ db_name = ""; // ma'lumotlar bazasi nomi $ db_user = ""; // foydalanuvchi nomi $ user_pw = ""; // parol $ con = yangi 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"); // barcha SQL so'rovlarini UTF-8 sifatida qaytarish) catch (PDOException $ err) (echo "ulanish uzilib qolsa, zararsiz xato xabari"; $ err-> getMessage () . "
"; file_put_contents (" PDOErrors.txt ", $ err, FILE_APPEND); // public_html die (); // aloqani uzish) tashqarisidagi xato jurnaliga ba'zi tafsilotlarni yozing dbh () (qaytarish $ this-> dbh ;)) # osonroq kirish uchun ma'lumotlar bazasi ishlovchilarini varga qo'ying $ con = new connect_pdo (); $ con = $ con-> dbh (); //

Bu erda men yaqinda OOPni o'rganishni boshlaganimdan va mysql o'rniga PDO -dan foydalanganim uchun katta yaxshilanish uchun joy borligiga ishonaman.
Shunday qilib, men yangi boshlanuvchilarning bir nechta darslarini kuzatib, turli narsalarni sinab ko'rdim ...

seanslar.php
Muntazam mashg'ulotlarni o'tkazishdan tashqari, men sessiyada ba'zi darslarni boshlayman:

Agar (! Isset ($ _ SESSION ["sqlQuery"]))) (session_start (); $ _SESSION ["sqlQuery"] = new sqlQuery ();)

Shunday qilib, bu sinf hamma joyda mavjud. Bu unchalik bo'lmasligi mumkin yaxshi amaliyot (?) ...
Qanday bo'lmasin, bu yondashuv menga hamma joyda bajarishga imkon beradi:

Echo $ _SESSION ["sqlQuery"] -> getAreaName ("okrug", 9); // natijalar: Aust-Agder (ma'lumotlar bazasida bu identifikatorli tuman nomi)

Mening ichimda sinf sqlQuery meniki Sinf connect_pdo, menda ma'lumotlar bazasidagi so'rovni bajaradigan getAreaName umumiy funktsiyasi mavjud.
Juda toza, menimcha.

Joziba kabi ishlaydi
Shunday qilib, men asosan shunday qilaman.
Bundan tashqari, men har doim sinfdan DB dan biror narsa olishim kerak bo'lsa, men shunga o'xshash narsani qilaman:

$ id = 123; $ sql = "MyTable WHERE -dan xohlagan narsani tanlang id =: id"; $ qry = $ con-> tayyorlang ($ sql); $ qry -> bindParam (": id", $ id, PDO :: PARAM_INT); $ qry -> bajarish (); $ get = $ qry-> olish (PDO :: FETCH_ASSOC);

Men ulanishni ichidagi o'zgaruvchiga kiritganim uchun ulash_pdo.php Men shunchaki havola qilaman va men borishga tayyorman. Ishlayapti. Men kutilgan natijalarni olaman ...

Lekin bunga qaramay; Agar men bu erdan chiqsam, menga aytsangiz, men juda minnatdor bo'lardim. Buning o'rniga, men yaxshilashim kerak bo'lgan yoki o'zgartirishim kerak bo'lgan joylarni o'zgartirishim kerak edi va hokazo.

Men haqiqatan ham o'rganishni xohlayman ...

$ dsn = "mysql: host = your_host_name; dbname = your_db_name_here"; // xost nomi va ma'lumotlar bazasi nomini belgilang $ username = "you"; // foydalanuvchi nomini belgilang $ pwd = "your_password"; // parolni sinab ko'ring ($ db = yangi PDO ($ dsn, $ foydalanuvchi nomi, $ pwd);) catch (PDOException $ e) ($ error_message = $ e-> getMessage (); echo "bu xato topilganligi uchun ko'rsatiladi "; Chiqish ();)

Men yaqinda shunga o'xshash javob / savol bilan keldim. Men kimdir qiziqsa, men shunday qildim:

args = func_get_args (); ) umumiy funktsiya __call ($ method, $ args) (if (bo'sh ($ this-> db))) ($ Ref = new \ ReflectionClass ("\ PDO"); $ this-> db = $ Ref-> newInstanceArgs ($ this-> args);) call_user_func_array (array ($ this-> db, $ method), $ args);))

Qo'ng'iroq qilish uchun siz faqat ushbu qatorni o'zgartirishingiz kerak:

$ JB = yangi \ Kutubxona \ PDO ( / * oddiy argumentlar * /);

Agar siz uni ishlatayotgan bo'lsangiz, yozing (\ Library \ PDO $ DB).

Bu aslida qabul qilingan javobga o'xshaydi va sizniki; ammo, bu muhim afzalliklarga ega. Ushbu kodni ko'rib chiqing:

$ JB = yangi \ Kutubxona \ PDO ( / * args * /); $ STH = $ DB-> tayyorgarlik ("SELECT * FROM of users WHERE user =?"); $ STH-> bajaring (qator (25)); $ Foydalanuvchi = $ STH-> olish ();

Oddiy PDOga o'xshab ko'rinishi mumkin (u faqat \ kutubxona \ tomonidan o'zgartiriladi), lekin nima bo'lishidan qat'i nazar, siz birinchi usulni chaqirmaguningizcha, ob'ekt aslida ishga tushirilmaydi. Bu uni optimallashtiradi, chunki PDO ob'ektini yaratish biroz qimmatga tushadi. Bu shaffof sinf yoki "Ghost" deb nomlangan shakl. Siz $ DB ga oddiy PDO misoli kabi munosabatda bo'lishingiz, uni o'tkazib yuborishingiz, xuddi shu operatsiyalarni bajarishingiz va h.k.

Dunyo bo'ylab JB ulanishiga kirish uchun $ _SESSION dan foydalanmaslikni taklif qilaman.

Siz bir nechta narsadan birini qilishingiz mumkin (yaxshi eng yaxshisi uchun eng yomoni amaliyotchi):

  • $ Dbh -ga global $ dbh funktsiyalari va sinflarida kirish
  • Yagona ro'yxatga olish kitobidan foydalaning va unga butun dunyo bo'ylab kiring, masalan:

    $ ro'yxatga olish kitobi = MyRegistry :: getInstance (); $ dbh = $ ro'yxatga olish kitobi-> getDbh ();

    Ma'lumotlar bazasi ishlovchisini kerakli sinflarga joylashtiring:

    MyClass klassi (__construct umumiy funktsiyasi ($ dbh) ( / * ... * /))

Biroq, bu biroz ilg'or va ramkasiz ko'proq "simlarni" talab qiladi. Shunday qilib, agar qaramlik in'ektsiyasi siz uchun juda murakkab bo'lsa, global to'plamlar o'rniga singleton reestridan foydalaning.

Sizning ishingizni samaraliroq qiladigan iboralarni tayyorlash va ob'ektlar bilan ishlash usullarini taqdim etadi!

PDOga kirish

"PDO - PHP Data Objects - bu ma'lumotlar bazasiga kirish qatlami bo'lib, u har xil ma'lumotlar bazalariga kirishning yagona usullarini ta'minlaydi."

Ma'lumotlar bazasi sintaksisidan mustaqil va ko'p hollarda ulanish satrini o'zgartirib, boshqa ma'lumotlar bazasi turiga va platformasiga osongina o'tish imkonini beradi.

Bu dars bilan ishlash jarayonining tavsifi emas SQL... Bu kengaytmalarni ishlatadiganlar uchun mo'ljallangan mysql yoki mysqli ularga kuchliroq va ko'chma PDOga o'tishga yordam berish.

Ma'lumotlar bazasini qo'llab -quvvatlash

Kengaytma PDO drayveri mavjud bo'lgan har qanday ma'lumotlar bazasini qo'llab -quvvatlaydi. Hozirgi vaqtda quyidagi turdagi ma'lumotlar bazalari uchun drayverlar mavjud:

  • 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 Call Interface)
  • PDO_ODBC (ODBC v3 (IBM DB2, unixODBC va win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 va SQLite 2)
  • PDO_4D (4D)

Tizim ishlashi uchun faqat kerakli drayverlarni o'rnatish kifoya. Tizimda mavjud bo'lgan haydovchilar ro'yxatini quyidagicha olishingiz mumkin.

Print_r (PDO :: getAvailableDrivers ());

Ulanish

Turli xil ma'lumotlar bazalarida ulanish usullari biroz boshqacha bo'lishi mumkin. Bir nechta mashhur ma'lumotlar bazalariga ulanish usullari quyida ko'rsatilgan. Siz ko'rishingiz mumkinki, dastlabki uchtasi bir -biriga o'xshash va faqat SQLite o'ziga xos sintaksisga ega.


harakat qilib ko'ring (# MS SQL Server va Sybase bilan PDO_DBLIB $ DBH = yangi PDO ("mssql: host = $ host; dbname = $ dbname, $ user, $ pass"); $ DBH = yangi PDO ("sybase: host = $ host ; dbname = $ dbname, $ user, $ pass "); PDO_MYSQL bilan # MySQL $ DBH = yangi PDO (" mysql: host = $ host; dbname = $ dbname ", $ user, $ pass); # SQLite $ DBH = yangi PDO ("sqlite: my / database / path / database.db");) catch (PDOException $ e) (echo $ e-> getMessage ();)

Blokka e'tibor bering urinib ko'ring / ushlang- har doim PDO operatsiyalarini blokga o'rash kerak urinib ko'ring / ushlang va istisno mexanizmidan foydalaning. Odatda faqat bitta aloqa o'rnatiladi, bizning misolimizda sintaksisni ko'rsatish uchun bir nechta ulanishlar ko'rsatilgan. $ DBH ma'lumotlar bazasiga ishlov beruvchini o'z ichiga oladi va bizning darsliklarimizda qo'llaniladi.

Tutqichni o'rnatib, har qanday ulanishni yopishingiz mumkin null.

# Ulanishni yoping $ DBH = null;

PHP.net docs -dan turli xil ma'lumotlar bazalari uchun maxsus variantlar va ulanish satrlari haqida ko'proq bilib olishingiz mumkin.

Istisno va PDO

PDO xatolarni tuzatish uchun istisnolardan foydalanishi mumkin. Bu shuni anglatadiki, barcha PDO operatsiyalari blokda bo'lishi kerak urinib ko'ring / ushlang... PDO uchta darajadagi xatolarni keltirib chiqarishi mumkin, xatolarni nazorat qilish darajasi ma'lumotlar bazasi tavsifi uchun xatolarni nazorat qilish rejimi atributini o'rnatish orqali tanlanadi:

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

O'rnatilgan monitoring darajasidan qat'i nazar, ulanish xatosi har doim istisnolarni keltirib chiqaradi va shuning uchun uni har doim blokga kiritish kerak. urinib ko'ring / ushlang.

PDO :: ERRMODE_SILENT

Standart xatolarni nazorat qilish darajasi. Bu darajada xatolar kengaytmalardagi kabi yaratiladi. mysql yoki mysqli... Xatolarni nazorat qilishning boshqa ikki darajasi DRY (O'zingizni takrorlamang) dasturlash uslubiga ko'proq mos keladi.

PDO :: ERRMODE_WARNING

Xatolarni nazorat qilishning ushbu darajasida standart PHP ogohlantirishlari ishlab chiqariladi va dastur bajarilishini davom ettirishi mumkin. Bu daraja disk raskadrovka uchun qulay.

PDO :: ERRMODE_EXCEPTION

Xatolarni nazorat qilishning bu darajasi ko'p hollarda qo'llanilishi kerak. Xatolarni tozalash va kimdir sizning tizimingizni buzishiga yordam beradigan ma'lumotlarni yashirish imkonini beradigan istisnolar qo'yiladi. Quyida istisnolarning afzalliklarini ko'rsatadigan misol keltirilgan:

# Ma'lumotlar bazasiga ulanishga urinib ko'ring ($ DBH = yangi PDO ("mysql: host = $ host; dbname = $ dbname", $ user, $ pass); $ DBH-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION) ; # SELECT o'rniga DELECT yozish xato bilan! $ DBH-> tayyorlang ("Odamlardan FOYDALANING");) catch (PDOException $ e) (echo "Kechirasiz. Lekin operatsiyani bajarib bo'lmadi."; File_put_contents ("PDOErrors") .txt ", $ e-> getMessage (), FILE_APPEND);)

Bu erda SELECT bayonotida ataylab xato bor. Bu istisno qiladi. Istisno jurnal fayliga xatoning tavsifini yuboradi va foydalanuvchiga xabarni ko'rsatadi.

Ma'lumotlarni kiritish va yangilash

Yangi ma'lumotlarni kiritish yoki mavjud ma'lumotlarni yangilash - ma'lumotlar bazasida eng ko'p ishlatiladigan operatsiyalardan biri. PDO ishlatilganda, u ikki bosqichga bo'linadi. Ushbu bobda tasvirlangan hamma narsa ikkala operatsiyaga ham tegishli. YANGILASH va KIRITMOQ.


Ma'lumot kiritishning eng ko'p ishlatiladigan turiga misol:

# STH-bu "davlat dastasi" $ STH = $ DBH-> tayyorlash ("INSERT INTO to folks (first_name) values ​​(" Cathy ")"); $ STH-> execute ();

Albatta, siz ushbu operatsiyani usul yordamida bajarishingiz mumkin exec (), Qo'ng'iroqlar soni esa birdan kam bo'ladi. Ammo tayyorlangan bayonotlardan foydalanish uchun uzoqroq usulni qo'llash yaxshiroqdir. Agar siz ularni faqat bir marta ishlatmoqchi bo'lsangiz ham, tayyorlangan bayonotlar tizimingizga qilingan hujumlardan himoyalanishga yordam beradi.

Tayyor ifodalar

Tayyorlangan bayonotlar oldindan tuzilgan SQL bayonotlari bo'lib, ularni serverga faqat ma'lumotlarni yuborish orqali ko'p marta bajarish mumkin. Ular SQL shablon hujumlaridan himoyalanish shaklidagi ma'lumotlarni avtomatik ravishda to'ldirishning qo'shimcha afzalliklariga ega.

Siz shablonlarni SQL kodingizga qo'shib, tayyorlangan bayonotlardan foydalanishingiz mumkin. Quyida 3 ta misol keltirilgan: bittasida shablon yo'q, biri noma'lum, biri shablonli.

# shablon yo'q - SQL in'ektsiya hujumlariga ochiq! $ STH = $ DBH -> ("odamlarga INSERT INTO (ism, manzil, shahar) qiymatlari ($ nomi, $ addr, $ shahar)"); $ nomlanmagan # andoza $ STH = $ DBH -> ("Odamlarga (ism, adr, shahar) qiymatlarni kiritish (?,?,?); # nomli andozalar $ STH = $ DBH -> (" Odamlarga INSERT INTO , addr, city) qiymati (: nomi ,: addr ,: shahar) ");

Birinchi usulni ishlatishdan qochish kerak. Nomlangan yoki nomlanmagan shablonlarni tanlash bu iboralar uchun ma'lumotlarni qanday o'rnatishingizga ta'sir qiladi.

Nomlanmagan shablonlar

# har bir shablonga 1 dan 3 gacha indekslangan $ STH-> bindParam (1, $ name) o'zgaruvchilarini tayinlash; $ STH-> bindParam (2, $ addr); $ STH-> bindParam (3, $ shahar); # Bir qatorni kiriting $ name = "Dima" $ addr = "Lizyukov ko'chasi."; $ shahar = "Moskva"; $ STH-> execute (); # Boshqa qatorni kiriting $ name = "Senya" $ addr = "Kommunistik o'lik"; $ shahar = "Butrus"; $ STH-> execute ();

Operatsiya ikki bosqichda amalga oshiriladi. Birinchi qadam shablonlarga o'zgaruvchilarni tayinlashdir. Keyin o'zgaruvchilarga qiymatlar beriladi va ifoda bajariladi. Ma'lumotlarning keyingi qismini yuborish uchun siz o'zgaruvchilar qiymatlarini o'zgartirishingiz va ifodani qayta bajarishingiz kerak.

Ko'p parametrli iboralar uchun biroz qiyin ko'rinadi? Albatta. Ammo, agar sizning ma'lumotlaringiz qatorda saqlansa, unda hamma narsa juda qisqa bo'ladi:

# Qo'shiladigan ma'lumotlar $ data = array ("Monya", "Unut-me-nots", "Zakutaysk"); $ STH = $ DBH -> ("INSERT INTO to people (name, addr, city) values ​​(?,?,?)"); $ STH-> bajarish ($ ma'lumotlar);

Jadvaldagi ma'lumotlar tartibda shablonlarga almashtiriladi. $ ma'lumotlar birinchi shablonga, $ ma'lumotlar ikkinchisiga o'tadi va hokazo. Ammo, agar massiv boshqa tartibda indekslangan bo'lsa, unda bunday operatsiya to'g'ri bajarilmaydi. Siz andozalar tartibining va massivdagi ma'lumotlar tartibining izchilligini kuzatib borishingiz kerak.

Nomlangan shablonlar

Nomlangan shablonni ishlatishga misol:

# Birinchi funktsiya argumenti-bu nomlangan shablonning nomi

Siz qisqartmalardan foydalanishingiz mumkin, lekin ular bog'langan massivlar bilan ishlaydi. Misol:

# Kiritiladigan ma'lumotlar $ data = array ("name" => "Mishel", "addr" => "Kuznechniy ko'chasi", "city" => "Cnjkbwf"); # $ STH = $ DBH -> qisqartmasi ("INSERT INTO to people (name, addr, city) value (: name ,: addr ,: city)")); $ STH-> bajarish ($ ma'lumotlar);

Jadval kalitlariga ikkita nuqta kerak emas, lekin ular shablon nomlariga mos kelishi kerak. Agar siz bir qator massivlardan foydalanayotgan bo'lsangiz, uni aylanib o'tishingiz va qo'ng'iroq qilishingiz mumkin ijro etmoq har bir ma'lumotlar to'plami uchun.

Nomlangan andozalarning yana bir yaxshi xususiyati - bu xususiyatlar va maydon nomlari mos kelganda, ob'ektlarni to'g'ridan -to'g'ri ma'lumotlar bazasiga kiritish. Misol:

# Oddiy ob'ektli sinf odami (public $ name; public $ addr; public $ city; __construct ($ n, $ a, $ c) ($ this-> name = $ n; $ this-> addr = $ a; $ bu-> shahar = $ c;) # va hokazo ...) $ cathy = yangi odam ("Katya", "Lenin prospekti", "Mojaysk"); # Ijro et: $ STH = $ DBH -> ("INSERT INTO to people (name, addr, city) value (: name ,: addr ,: city)"); $ STH-> bajaring ((qator) $ cathy);

Ob'ekt turini konvertatsiya qilish qator v ijro etmoq xususiyatlarni massiv kalitlari sifatida ko'rib chiqishga olib keladi.

Ma'lumotlarni olish


Ma'lumotni olish uchun davlat identifikatori usuli qo'llaniladi -> olish ()... Usulni chaqirishdan oldin olmoq () ma'lumotlar bazasidan ma'lumotlarni qanday olish kerakligini PDOga aytishingiz kerak. Quyidagi variantlarni tanlash mumkin:

  • PDO :: FETCH_ASSOC: ustun nomlari bo'yicha indekslangan qatorni qaytaradi
  • PDO :: FETCH_BOTH (standart): ustun nomlari va raqamlari bo'yicha indekslangan qatorni qaytaradi
  • PDO :: FETCH_BOUND: usuldan foydalanib, ustunlar qiymatlarini o'zgaruvchilar to'plamiga belgilaydi -> bindColumn ()
  • PDO :: FETCH_CLASS: nomlangan sinfning xususiyatlariga ustun qiymatlarini tayinlaydi, agar tegishli xususiyat bo'lmasa - u yaratiladi
  • PDO :: FETCH_INTO: nomlangan sinfning mavjud namunasini yangilaydi
  • PDO :: FETCH_LAZY: kombinatsiya PDO :: FETCH_BOTH / PDO :: FETCH_OBJ, ishlatilganda ob'ekt o'zgaruvchilar nomlarini yaratadi
  • PDO :: FETCH_NUM: ustun raqamlari bo'yicha indekslangan qatorni qaytaradi
  • PDO :: FETCH_OBJ: ustun nomlariga mos keladigan mulk nomlari bo'lgan anonim ob'ektni qaytaradi

Aslida, asosiy vaziyatlar uchta variant bilan hal qilinadi: FETCH_ASSOC, FETCH_CLASS va FETCH_OBJ... Ma'lumot olish usulini o'rnatish uchun quyidagilarni ishlating:

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

Shuningdek, siz ma'lumotlarni qidirish usulini to'g'ridan -to'g'ri usul qo'ng'irog'ida o'rnatishingiz mumkin -> olish ().

FETCH_ASSOC

Ma'lumot olishning bu turi ustun nomlari bo'yicha indekslangan assotsiativ massiv hosil qiladi. Bu kengaytmalarni ishlatadiganlarga yaxshi ma'lum bo'lishi kerak. mysql / mysqli... Ma'lumot namunasi:

$ STH = $ DBH-> so'rov ("SELECT name, addr, city from people"); # Qabul qilish rejimini o'rnating $ STH-> setFetchMode (PDO :: FETCH_ASSOC); while ($ row = $ STH-> get ()) (echo $ row ["name"]. "\ n"; echo $ row ["addr"]. "\ n"; echo $ row ["city"] . "\ n";)

Tsikl vaqt tanlov natijasi bo'yicha birma -bir tugallangunga qadar takrorlashni davom ettiradi.

FETCH_OBJ

Ma'lumotni olishning bunday turi bilan sinf ob'ekti yaratiladi std qabul qilingan ma'lumotlarning har bir qatori uchun:

$ STH = $ DBH-> so'rov ("SELECT name, addr, city from people"); # $ STH-> setFetchMode (PDO :: FETCH_OBJ) olish rejimini o'rnating; # natijani ko'rsatish paytida ($ row = $ STH-> fetch ()) (echo $ row-> name. "\ n"; echo $ row-> addr. "\ n"; echo $ row-> shahar. " \ n ";)

FETCH_CLASS

Ushbu turdagi ajratish yordamida ma'lumotlar to'g'ridan -to'g'ri siz tanlagan sinfga joylashtiriladi. Foydalanish FETCH_CLASS ob'ektingizning xususiyatlari konstruktor chaqirilishidan oldin o'rnatiladi. Bu juda muhim. Agar tegishli ustun nomining xossasi bo'lmasa, bunday xususiyat yaratiladi (masalan ommaviy) Siz uchun.

Bu shuni anglatadiki, agar ma'lumotlar bazasidan chiqarilgandan so'ng, o'zgartirish kerak bo'lsa, u sizning ob'ektingiz tomonidan yaratilishi bilan avtomatik ravishda bajarilishi mumkin.

Masalan, har bir yozuv uchun manzil qisman yashirilishi kerak bo'lgan vaziyatni tasavvur qiling. Biz vazifani konstruktorning xususiyatlarini boshqarish orqali bajarishimiz mumkin:

Secret_person (public $ nomi; public $ addr; public $ city; public $ other_data; function __construct ($ other = "") ($ this-> address = preg_replace ("//", "x", $ this->) $ this-> other_data = $ other;))

Ma'lumotlar sinfga chiqarilgandan so'ng, manzildagi barcha kichik a-z belgilar x bilan almashtiriladi. Endi, sinf yordamida va ma'lumotlarni qabul qilib, konvertatsiya butunlay shaffof:

$ STH = $ DBH-> so'rov ("SELECT name, addr, city from people"); $ STH-> setFetchMode (PDO :: FETCH_CLASS, "secret_person"); while ($ obj = $ STH-> fetch ()) (echo $ obj-> addr;)

Agar manzil "Leninskiy prospekti 5" bo'lsa, siz "Lhhhhhhhh xx-x 5" ni ko'rasiz. Albatta, ma'lumotlar tayinlanishidan oldin konstruktor chaqirilishini xohlagan holatlar mavjud. PDO buni amalga oshirish uchun vositalarga ega:

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

Endi, oldingi misolni o'rnatilgan rejim bilan takrorlaganingizda PDO :: FETCH_PROPS_LATE manzil yashirilmaydi, chunki konstruktor chaqirilgan va xususiyatlar tayinlangan.

Agar kerak bo'lsa, ob'ektga ma'lumotlarni chiqarishda argumentlarni konstruktorga o'tkazishingiz mumkin:

$ STH-> setFetchMode (PDO :: FETCH_CLASS, "secret_person", massiv ("narsalar"));

Agar har bir ob'ekt uchun konstruktorga har xil ma'lumotlarni uzatish zarur bo'lsa, siz usul ichidagi ma'lumotlarni qidirish rejimini o'rnatishingiz mumkin olib kelmoq:

$ i = 0; while ($ rowObj = $ STH-> get (PDO :: FETCH_CLASS, "secret_person", array ($ i))) (// narsalar $ i ++)

Boshqa foydali usullar

Qisqa maqolada PDOni to'liq tasvirlab bo'lmaydi, shuning uchun biz asosiy operatsiyalarni bajarish uchun bir nechta foydali usullarni taqdim etamiz.

$ DBH-> lastInsertId ();

Usul -> lastInsertId () har doim ma'lumotlar bazasi dastasi tomonidan chaqiriladi (davlat dastasi emas) va ma'lum bir ulanish uchun oxirgi kiritilgan qatorning avtomatik ko'paytiruvchi identifikatorini qaytaradi.

$ DBH-> exec ("Odamlardan O'CHIRISH QAYERDA 1"); $ DBH-> exec ("SET time_zone =" -8: 00 "");

Usul -> exec () turli yordamchi operatsiyalar uchun ishlatiladi.

$ safe = $ DBH-> tirnoq ($ xavfli);

Usul -> iqtibos () so'rovlarda ishlatilishi uchun satrlarni keltiradi. Tayyorlangan bayonotlar ishlatilmasa, bu sizning zaxirangizdir.

$ rows_affected = $ STH-> rowCount ();

Usul -> rowCount () qiymatini qaytaradi butun son bu operatsiya bajariladigan qatorlar sonini bildiradi. PDO -ning so'nggi versiyasida, xato haqida hisobotga ko'ra (http://bugs.php.net/40822), bu usul iboralar bilan ishlamaydi. TANLASH... Agar sizda muammolar bo'lsa va PHP -ni yangilay olmasangiz, satrlar sonini quyidagicha olishingiz mumkin:

$ sql = "COUNT (*) FROM odamlardan tanlang"; if ($ STH = $ DBH-> so'rovi ($ sql)) (# Agar satrlar sonini tekshirish ($ STH-> fetchColumn ()> 0) (# Bu erda SELECT kodi bo'lishi kerak) boshqa (echo "Yo'q so'rovga mos keladigan qatorlar. ";))

Umid qilamanki, sizga darslik yoqdi!

Ma'lumotlar bazalari bilan ishlash uchun PDO - PHP ma'lumotlar ob'ektlari kengaytmalarini sozlash va ulardan foydalanish

Test ma'lumotlar bazasi va jadval yaratish

Birinchidan, ushbu qo'llanma uchun ma'lumotlar bazasini yarataylik:

Ma'lumotlar bazasini yaratish solar_system; Solar_systemda barcha imtiyozlarni berish. * "Testuser" ga @ "localhost" "testpassword" tomonidan aniqlangan;

Kirish testuser va parolni tekshiruvchi parolga ega bo'lgan foydalanuvchiga solar_system ma'lumotlar bazasiga to'liq kirish huquqi berilgan.

Keling, jadval tuzamiz va uni astronomik aniqligi nazarda tutilmagan ma'lumotlar bilan to'ldiramiz:

Solar_systemdan foydalaning; JADVA sayyoralarini yarating (id TINYINT (1) YOZILMAYDI NULL AUTO_INCREMENT, PRIMARY KEY (id), VARCHAR (10) NULL emas, rang VARCHAR (10) NULL emas); INSERT INTO sayyoralarga (ism, rang) QIMMATLAR ("yer", "ko'k"), ("Mars", "qizil"), ("Yupiter", "g'alati");

Ulanish tavsifi

Ma'lumotlar bazasi yaratilgandan so'ng, biz DSN () ni aniqlaymiz - ma'lumotlar bazasiga ulanish uchun ma'lumot, mag'lubiyat shaklida. Ta'rif sintaksisi ishlatilgan DBMSga qarab farq qiladi. Masalan, biz MySQL / MariaDB bilan ishlaymiz, shuning uchun biz quyidagilarni aniqlaymiz.

  • DBMS joylashgan xost nomi;
  • port (standart 3306 portidan foydalanilganda ixtiyoriy);
  • ma'lumotlar bazasi nomi;
  • kodlash (ixtiyoriy).

Bu holda DSN chizig'i quyidagicha ko'rinadi:

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

Birinchisi, ma'lumotlar bazasi prefiksi. Masalan, mysql. Prefiks qatorning qolgan qismidan nuqta -vergul va har bir keyingi parametr nuqta -vergul bilan ajratiladi.

PDO ob'ektini yaratish

Endi DSN qatori tayyor, keling PDO obyektini yarataylik. Konstruktor kirish sifatida quyidagi parametrlarni oladi:

  1. DSN qatori.
  2. Ma'lumotlar bazasiga kirish huquqiga ega bo'lgan foydalanuvchining ismi.
  3. Bu foydalanuvchi uchun parol.
  4. Qo'shimcha parametrlarga ega qator (ixtiyoriy).
$ options = [PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_DEFAULT_FETCH_MODE => PDO :: FETCH_ASSOC]; $ pdo = yangi PDO ($ dsn, "testuser", "testpassword", $ options);

Qo'shimcha parametrlarni ob'ekt SetAttribute usuli yordamida yaratilganidan keyin ham aniqlash mumkin:

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

Namuna olishning standart usulini aniqlash

PDO :: DEFAULT_FETCH_MODE - standart qabul qilish usulini belgilaydigan muhim parametr. Belgilangan usul so'rovni bajarish natijasini olishda ishlatiladi.

PDO :: FETCH_BOTH

Standart rejim. Tanlov natijasi raqamlar bo'yicha (0dan boshlab) va ustun nomlari bo'yicha indekslanadi:

$ stmt = $ pdo-> so'rov ("SELECT * FROM planets"); $ natijalar = $ stmt-> olish (PDO :: FETCH_BOTH);

Sayyoralarning test jadvaliga ushbu rejim yordamida so'rovni bajargandan so'ng, biz quyidagi natijani olamiz:

Array (=> 1 => 1 => yer => yer => ko'k => ko'k)

PDO :: FETCH_ASSOC

Natijada assotsiativ qatorda saqlanadi, bu erda kalit ustun nomi va qiymat mos keladigan satr qiymati:

$ stmt = $ pdo-> so'rov ("SELECT * FROM planets"); $ natijalar = $ stmt-> olish (PDO :: FETCH_ASSOC);

Natijada, biz olamiz:

Array (=> 1 => yer => ko'k)

PDO :: FETCH_NUM

Ushbu rejimdan foydalanganda, natija ustun raqamlari bo'yicha indekslangan massiv sifatida ko'rsatiladi (0dan boshlab):

Array (=> 1 => yer => ko'k)

PDO :: FETCH_COLUMN

Agar raqamlash 0 dan boshlanadigan bitta o'lchovli massiv shaklida bitta maydon qiymatlari ro'yxatini olish zarur bo'lsa, bu variant foydalidir. Masalan:

$ stmt = $ pdo-> so'rov ("sayyoralardan ismni SELECT");

Natijada, biz olamiz:

Array (=> yer => mars => yupiter)

PDO :: FETCH_KEY_PAIR

Agar biz assotsiativ qator ko'rinishida ikkita maydon qiymatlari ro'yxatini olishimiz kerak bo'lsa, biz bu variantdan foydalanamiz. Massiv kalitlari - tanlovning birinchi ustunidagi ma'lumotlar, massiv qiymatlari - ikkinchi ustundan olingan ma'lumotlar. Masalan:

$ stmt = $ pdo-> so'rov ("SELECT name, color FROM planets"); $ natija = $ stmt-> fetchAll (PDO :: FETCH_KEY_PAIR);

Natijada, biz olamiz:

Array (=> ko'k => qizil => g'alati)

PDO :: FETCH_OBJECT

PDO :: FETCH_OBJECT dan foydalanilganda, har bir olingan satr uchun anonim ob'ekt yaratiladi. Uning umumiy xususiyatlari tanlov ustunlarining nomlari bo'lib, so'rov natijalari ularning qiymatlari sifatida ishlatiladi:

$ stmt = $ pdo-> so'rov ("SELECT nom, color FROM planets"); $ natijalar = $ stmt-> olish (PDO :: FETCH_OBJ);

Natijada, biz olamiz:

StdClass obyekti (=> yer => ko'k)

PDO :: FETCH_CLASS

Bu holda, avvalgisida bo'lgani kabi, ustun qiymatlari ob'ektning xususiyatlariga aylanadi. Shu bilan birga, ob'ektni yaratish uchun foydalaniladigan mavjud sinfni ko'rsatish kerak. Keling, bir misolni ko'rib chiqaylik. Birinchidan, sinf yarataylik:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy funktsiya setName ($ planet_ nomi) ($ bu-> ism = $ sayyora_ nomi;) umumiy funktsiyasi setColor ($ planet_color) ($ bu-> rang = $ planet_color;) umumiy funktsiyasi getName () ($ this-> name; return;) umumiy funktsiyasi getColor () ($ this-> color;))

E'tibor bering, Planet klassi shaxsiy xususiyatlarga ega va konstruktor yo'q. Endi so'rovni bajaraylik.

Agar siz PDO :: FETCH_CLASS bilan olib kelish usulidan foydalansangiz, qabul qilish so'rovini yuborishdan oldin setFetchMode usulidan foydalanishingiz kerak:

$ stmt = $ pdo-> so'rov ("SELECT name, color FROM planets"); $ stmt-> setFetchMode (PDO :: FETCH_CLASS, "Sayyora");

Biz setFetchMode usuliga o'tadigan birinchi parametr PDO :: FETCH_CLASS doimiyidir. Ikkinchi parametr - bu ob'ektni yaratishda ishlatiladigan sinf nomi. Endi bajaramiz:

$ planet = $ stmt-> fetch (); var_dump ($ planet);

Natijada, biz Planet ob'ektini olamiz:

Sayyora jismi (=> yer => ko'k)

So'rovdan olingan qiymatlar ob'ektning tegishli xususiyatlariga, hatto shaxsiy xususiyatlariga ham beriladi.

Konstruktor bajarilgandan keyin xossalarni aniqlash

Planet sinfida aniq konstruktor yo'q, shuning uchun xossalarni belgilashda muammo bo'lmaydi. Agar sinfda mulk tayinlangan yoki o'zgartirilgan konstruktor bo'lsa, ularning ustiga yoziladi.

FETCH_PROPS_LATE konstantasidan foydalanganda, konstruktor bajarilgandan keyin xususiyat qiymatlari tayinlanadi:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy funktsiya __construct ($ nomi = oy, $ rang = kulrang) ($ bu-> ism = $ nomi; $ bu-> rang = $ rang;) umumiy funktsiya setName ($ planet_name) ($ this-> name = $ planet_name;) umumiy funktsiyasi setColor ($ planet_color) ($ this-> color = $ planet_color;) umumiy funktsiyasi getName () (qaytarish $ bu-> nom;) umumiy funktsiyasi getColor () ($ bu-> rangni qaytaring;))

Biz ikkita argumentni kirituvchi konstruktorni qo'shib, Planet sinfini o'zgartirdik: ism va rang. Bu maydonlar uchun standart qiymatlar mos ravishda oy va kulrang.

Agar siz FETCH_PROPS_LATE dan foydalanmasangiz, ob'ekt yaratilganda uning standart qiymatlari yoziladi. Keling, buni tekshirib ko'raylik. Birinchidan, so'rovni bajaramiz:

$ stmt = $ pdo-> so'rov ("SELECT nomi, rangi FROM solar_system WHERE name =" earth ""); $ stmt-> setFetchMode (PDO :: FETCH_CLASS, "Sayyora"); $ planet = $ stmt-> fetch (); var_dump ($ planet);

Natijada, biz olamiz:

Ob'ekt (Sayyora) # 2 (2) (["nomi": "Sayyora": xususiy] => tor (4) "oy" ["rang": "Sayyora": shaxsiy] => mag'lubiyat (4) "kulrang" )

Kutilganidek, ma'lumotlar bazasidan olingan qiymatlar qayta yoziladi. Keling, FETCH_PROPS_LATE (shunga o'xshash so'rov) yordamida muammoni hal qilishni ko'rib chiqaylik:

$ stmt-> setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Sayyora"); $ planet = $ stmt-> fetch (); var_dump ($ planet);

Natijada biz kerakli narsani olamiz:

Ob'ekt (Sayyora) # 4 (2) (["nomi": "Sayyora": xususiy] => mag'lubiyat (5) "yer" ["rang": "Sayyora": shaxsiy] => satr (4) "ko'k" )

Agar sinf konstruktorida standart qiymatlar bo'lmasa, lekin ular kerak bo'lsa, setFetchMode usuli massiv ko'rinishidagi uchinchi argument sifatida chaqirilganda konstruktor parametrlari o'rnatiladi. Masalan:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy vazifa __construct ($ nomi, $ rang) ($ this-> name = $ name; $ this-> color = $ color;) [...])

Konstruktor argumentlari kerak, shuning uchun ishga tushaylik:

$ stmt-> setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Planet", ["oy", "kulrang"]);

Kiruvchi parametrlar, shuningdek, ishga tushirish uchun zarur bo'lgan standart qiymatlar vazifasini bajaradi. Keyinchalik ular ma'lumotlar bazasidagi qiymatlar ustiga yoziladi.

Bir nechta ob'ektlarni olish

Vaqt tsikli ichida olish usuli yordamida bir nechta natijalar ob'ekt sifatida olinadi:

($ Planet = $ stmt-> fetch ()) (// natijalarni qayta ishlash)

Yoki bir vaqtning o'zida barcha natijalarni olish orqali. Ikkinchi holda, fetchAll usuli ishlatiladi va rejim qo'ng'iroq paytida ko'rsatiladi:

$ stmt-> fetchAll (PDO :: FETCH_CLASS | PDO_FETCH_PROPS_LATE, "Sayyora", ["oy", "kulrang"]);

PDO :: FETCH_INTO

Ushbu tanlov varianti tanlanganida, PDO yangi ob'ekt yaratmaydi, balki mavjud ob'ektning xususiyatlarini yangilaydi. Biroq, bu faqat umumiy xususiyatlar uchun yoki ob'ektda __set sehrli usuldan foydalanish mumkin.

Tayyor va to'g'ridan -to'g'ri so'rovlar

PDO so'rovlarni bajarishning ikkita usuliga ega:

  • bir bosqichdan iborat to'g'ri chiziq;
  • tayyorlangan, u ikki bosqichdan iborat.

To'g'ridan -to'g'ri so'rovlar

To'g'ridan -to'g'ri so'rov yuborishning ikkita usuli mavjud:

  • so'rov o'zgarish qilmaydigan so'zlar uchun ishlatiladi, masalan SELECT. Fetos yoki fetchAll usullari yordamida so'rov natijalari olinadigan PDOStatemnt ob'ektini qaytaradi;
  • exec INSERT, DELETE yoki UPDATE kabi iboralar uchun ishlatiladi. So'rov tomonidan qayta ishlangan qatorlar sonini qaytaradi.

To'g'ridan -to'g'ri operatorlar faqat so'rovda o'zgaruvchilar bo'lmasa va so'rov xavfsiz va to'g'ri chiqib ketganligiga ishonchingiz komil bo'lsa ishlatiladi.

Tayyorlangan so'rovlar

PDO sizning arizangizni himoya qilish uchun foydali bo'lgan tayyorlangan bayonotlarni qo'llab -quvvatlaydi: tayyorgarlik zarur qochishlarni bajaradi.

Keling, bir misolni ko'rib chiqaylik. Planetlar jadvaliga Planet ob'ektining xususiyatlarini kiritmoqchisiz. Birinchidan, so'rov tayyorlaylik:

$ stmt = $ pdo-> tayyorgarlik ("INSERT INTO planets (name, color) VALUES (?,?)"));

Biz argument sifatida to'ldiruvchilar bilan SQL so'rovini oladigan tayyorlash usulini qo'llaymiz. Pseudovariables ikki xil bo'lishi mumkin: nomlanmagan va nomlangan.

Ismi oshkor qilinmagan soxta o'zgaruvchilar

Pozitsion o'rin egalari bilan belgilanadi? ... Natijada ixcham so'rov, lekin siz qidirish qiymatlarini bir xil tartibda berishingiz kerak. Ular massiv sifatida execute usuli orqali uzatiladi:

$ stmt-> execute ([$ planet-> nomi, $ planet-> rang]);

Pseudovariables nomi berilgan

Nomlangan joy egalari ishlatilganda, almashtirish uchun qiymatlarni berish tartibi muhim emas, lekin bu holda kod kamroq bo'ladi. Ma'lumotlar assotsiativ massiv shaklida execute usuliga o'tkaziladi, bunda har bir kalit soxta o'zgaruvchi nomiga mos keladi va massiv qiymati so'rovga almashtirilishi kerak bo'lgan qiymatga mos keladi. Keling, oldingi misolni takrorlaylik:

$ stmt = $ pdo-> tayyorlang ("INSERT INTO sayyoralarga (ism, rang) VALUES (: ism ,: rang)"); $ stmt-> execute (["name" => $ planet-> nomi, "color" => $ planet-> color]);

Tayyorlash va bajarish usullari o'zgarish so'rovlarini bajarishda ham, qabul qilishda ham qo'llaniladi.

RowCount usuli, agar kerak bo'lsa, ishlov berilgan qatorlar soni haqida ma'lumot beradi.

Xatolarda PDO xatti -harakatlarini nazorat qilish

PDO :: ATTR_ERRMODE xato rejimini tanlash parametri xatolar yuz berganda PDO xatti -harakatlarini aniqlash uchun ishlatiladi. Uch variant mavjud: PDO :: ERRMODE_SILENT, PDO :: ERRMODE_EXCEPTION va PDO :: ERRMODE_WARNING.

PDO :: ERRMODE_SILENT

Standart variant. PDO xato haqida ma'lumot yozadi, uni errorCode va errorInfo usullari yordamida olish mumkin.

PDO :: ERRMODE_EXCEPTION

Bu PDO xato ma'lumotiga qo'shimcha ravishda istisno (PDOException) qo'yadigan afzal variant. Istisno skript bajarilishini to'xtatadi, bu PDO tranzaktsiyalaridan foydalidir. Masalan, bitimlar tavsifida keltirilgan.

PDO :: ERRMODE_WARNING

Bunday holda, PDO xato ma'lumotlarini ham qayd qiladi. Skript oqimi uzilmaydi, lekin ogohlantirishlar beriladi.

BindValue va bindParam usullari

Siz so'rovda qiymatlarni almashtirish uchun bindValue va bindParam usullaridan ham foydalanishingiz mumkin. Birinchisi, o'zgaruvchining qiymatini so'rovni tayyorlash uchun ishlatilgan psevdo o'zgaruvchiga bog'laydi:

$ stmt = $ pdo-> tayyorgarlik ("INSERT INTO sayyoralarga (ism, rang) VALUES (: ism ,: rang)")); $ stmt-> bindValue ("nomi", $ planet-> nomi, PDO :: PARAM_STR);

$ Planet-> name o'zgaruvchining qiymatini soxta o'zgaruvchiga bog'lang: name. E'tibor bering, bindValue va bindParam usullaridan foydalanganda o'zgaruvchining turi mos keladigan PDO doimiylari yordamida uchinchi argument sifatida ko'rsatiladi. Masalan, PDO :: PARAM_STR.

BindParam usuli o'zgaruvchini soxta o'zgaruvchiga bog'laydi. Bunday holda, o'zgaruvchi soxta o'zgaruvchiga havola bilan bog'liq va qiymat faqat bajarilish usuli chaqirilgandan keyin so'rovga almashtiriladi. Misol keltiraylik:

$ stmt-> bindParam ("nomi", $ planet-> nomi, PDO :: PARAM_STR);

PDO operatsiyalari

Keling, g'ayrioddiy misolni olaylik. Foydalanuvchi sayyoralar ro'yxatini tanlashi kerak va har safar so'rov bajarilganda, joriy ma'lumotlar ma'lumotlar bazasidan o'chiriladi, so'ngra yangilar kiritiladi. Agar o'chirilgandan so'ng xato bo'lsa, keyingi foydalanuvchi bo'sh ro'yxatni oladi. Buning oldini olish uchun biz tranzaktsiyalardan foydalanamiz:

$ pdo-> beginTransaction (); harakat qilib ko'ring ($ stmt1 = $ pdo-> exec ("sayyoralardan O'CHIRISH"); $ stmt2 = $ pdo-> tayyorlash ("sayyoralarga INSERT (ism, rang) VALUES (?,?)"); foreach ($ sayyoralar kabi $ planet) ($ stmt2-> bajaring ([$ planet-> getName (), $ planet-> getColor ()]);) $ pdo-> majburiyat ();) catch (PDOException $ e) ($ pdo-> rollBack ();)

BeginTransaction usuli so'rovlarning avtomatik bajarilishini o'chirib qo'yadi va try-catch tuzilmasida so'rovlar kerakli tartibda bajariladi. Agar PDOException istisnolari bo'lmasa, so'rovlar majburiyat usuli yordamida bajariladi. Aks holda, ular orqaga qaytarish usuli yordamida orqaga qaytadilar va so'rovlarning avtomatik bajarilishi tiklanadi.

Shunday qilib, so'rovlarni bajarishda izchillik kuzatildi. Shubhasiz, buni amalga oshirish uchun PDO :: ATTR_ERRMODE ni PDO :: ERRMODE_EXCEPTION qilib sozlash kerak.

Xulosa

Endi PDO bilan ishlash tasvirlangan bo'lsa, uning asosiy afzalliklarini qayd etamiz:

  • PDO yordamida dasturni boshqa ma'lumotlar bazasi ma'lumotlar bazasiga o'tkazish oson;
  • barcha mashhur DBMS qo'llab -quvvatlanadi;
  • o'rnatilgan xatolarni boshqarish tizimi;
  • namuna natijalarini taqdim etishning turli variantlari;
  • Kodni kamaytiradigan va SQL in'ektsiyasiga chidamli qiladigan tayyor so'rovlarni qo'llab -quvvatlaydi;
  • foydalanuvchilar parallel ishlayotganda ma'lumotlar yaxlitligi va so'rovlar izchilligini saqlashga yordam beradigan tranzaktsiyalar qo'llab -quvvatlanadi.


2018 yil 03 -iyun Andrey Chernyshov Tarjima bo'yicha qo'llanma 2025 0

PDO - bu PHP Data Objects qisqartmasi: bu ob'ektlar yordamida ma'lumotlar bazasi bilan ishlash uchun PHP kengaytmasi. Uning afzalliklaridan biri shundaki, u to'g'ridan -to'g'ri ma'lum bir ma'lumotlar bazasiga bog'lanmagan: uning interfeysi sizga turli xil muhitlarga kirishga imkon beradi, jumladan: MySQL, SQLite, PostgreSQL, Microsoft SQL Server.

Ushbu qo'llanma PDO haqida to'liq ma'lumot berishga va o'quvchini ma'lumotlar bazasini yaratish va unga ulanishdan, eng to'g'ri qabul qilish usullarini tanlashga, tayyorlangan so'rovlarni qanday yaratishni ko'rsatishga va mumkin bo'lgan xato rejimlarini tavsiflashga bosqichma -bosqich o'tishga qaratilgan.

Test ma'lumotlar bazasi va jadval yaratish

Birinchidan, biz ma'lumotlar bazasini yaratamiz:

Ma'lumotlar bazasini yaratish solar_system; Solar_systemda barcha imtiyozlarni berish. * "Testuser" ga @ "localhost" "testpassword" tomonidan aniqlangan;

Biz testuserga parol uchun testpassword yordamida solar_system ma'lumotlar bazasidagi barcha imtiyozlarni berdik. Endi jadval tuzamiz va uni ba'zi ma'lumotlar bilan to'ldiramiz:

Solar_systemdan foydalaning; JADVA sayyoralarini yarating (id TINYINT (1) YOZILMAYDI NULL AUTO_INCREMENT, PRIMARY KEY (id), VARCHAR (10) NULL emas, rang VARCHAR (10) NULL emas); INSERT INTO sayyoralarga (ism, rang) QIMMATLAR ("yer", "ko'k"), ("Mars", "qizil"), ("Yupiter", "g'alati");

DSN ulanish tavsifi (ma'lumotlar manbai nomi)

Endi bizda ma'lumotlar bazasi bor, biz DSNni aniqlashimiz kerak. DSN Ma'lumotlar manbai nomi degan ma'noni anglatadi va ma'lumotlar bazasiga ulanish uchun zarur bo'lgan ma'lumotlar to'plamidir, DSN mag'lubiyat shaklida. Sintaksis ulanmoqchi bo'lgan ma'lumotlar bazasiga qarab farq qiladi, lekin biz MySQL / MariaDB dan foydalanayotganimiz uchun quyidagilarni ko'rsatishimiz kerak:

  • Ulanish uchun ishlatiladigan haydovchi turi;
  • Ma'lumotlar bazasi ishlayotgan asosiy kompyuter nomi;
  • Ulanish porti (ixtiyoriy);
  • Ma'lumotlar bazasi nomi;
  • Kodlash (ixtiyoriy).

Bizning holatda satrning formati shunday bo'ladi (biz uni $ dsn o'zgaruvchisida saqlaymiz):

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

Birinchidan, biz ma'lumotlar bazasi prefiksi yoki ma'lumotlar bazasi prefiksini o'rnatamiz. Bunday holda, biz MySQL / MariaDB tipidagi ma'lumotlar bazasiga ulanganimiz uchun, biz mysql -dan foydalanmoqdamiz. Keyin biz qatorning qolgan qismidan prefiksni ikki nuqta bilan ajratdik va har bir keyingi qism qolgan qismidan nuqta -vergul bilan ajratiladi.

Keyingi ikkita bo'limda biz ma'lumotlar bazasi ishlayotgan xost nomini va ulanish uchun ishlatiladigan portni o'rnatamiz. Agar port ko'rsatilmagan bo'lsa, standart port ishlatiladi, bu holda 3306. Charset ma'lumotlar bazasi nomidan keyin darhol ko'rsatiladi.

PDO ob'ektini yaratish

Endi DSN tayyor, biz PDO ob'ektini yaratishni boshlaymiz. PDO konstruktori birinchi parametr sifatida DSN qatorini, ikkinchi parametr sifatida ma'lumotlar bazasi foydalanuvchi nomini, uchinchi parolni va to'rtinchi parametr sifatida ixtiyoriy sozlamalarni ishlatadi.

$ options = [PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_DEFAULT_FETCH_MODE => PDO :: FETCH_ASSOC]; $ pdo = yangi PDO ($ dsn, "testuser", "testpassword", $ options);

SetAttribute () usuli yordamida ob'ekt yaratilgandan so'ng, sozlamalar o'rnatilishi mumkin:

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

Xatolarda PDO xatti -harakatlarini sozlash

Keling, PDO :: ATTR_ERRMODE uchun mavjud bo'lgan ba'zi variantlarni ko'rib chiqaylik. Bu variantlar o'ta muhim, chunki ular xatolik yuz berganda PDOning xatti -harakatini belgilaydi. Mumkin bo'lgan variantlar:

PDO :: ERRMODE_SILENT

Standart variant. PDO sizga xato kodini va xato xabari beradi. Ularni errorCode () va errorInfo () usullari yordamida olish mumkin.

PDO :: ERRMODE_EXCEPTION

Bu variant, menimcha, foydalanish uchun tavsiya etiladi. Uning yordami bilan, xato kodi va ma'lumotlarini berishdan tashqari, PDO PDOException -ni tashlaydi, bu skriptni bajarilishini to'xtatadi va bu PDO tranzaktsiyalari uchun ham foydalidir (biz ularni birozdan keyin ko'rib chiqamiz).

PDO :: ERRMODE_WARNING

Ushbu parametr yordamida PDO PDO :: ERRMODE_SILENT kabi xato kodi va xabarini chiqaradi, lekin u skriptni to'xtatmaydigan OGOHLANTIRISH ogohlantirishini ham ko'rsatadi.

Standart namuna olish usulini o'rnatish

Yana bir muhim parametr PDO :: DEFAULT_FETCH_MODE sobit bilan boshqariladi. Bu sizga so'rov natijalarini olish uchun ishlatiladigan standart fetch () usulini sozlash imkonini beradi. Eng ko'p ishlatiladigan variantlar:

PDO :: FETCH_BOTH

Uni ishlatganda, olingan natijalar butun sonlar va ustunlar nomlari bo'yicha indekslanadi. Uni sayyoralar jadvalidan qator olish usulidan foydalanish bizga quyidagi natijalarni beradi:

$ stmt = $ pdo-> so'rov ("SELECT * FROM planets"); $ natijalar = $ stmt-> olish (PDO :: FETCH_BOTH); Array (=> 1 => 1 => yer => yer => ko'k => ko'k)

PDO :: FETCH_ASSOC

Bu doimiylik bilan natijalar assotsiativ qatorga yoziladi, unda har bir kalit ustun nomi bo'ladi va har bir qiymat qatorda ma'lum bir qiymatni bildiradi:

$ stmt = $ pdo-> so'rov ("SELECT * FROM planets"); $ natijalar = $ stmt-> olish (PDO :: FETCH_ASSOC); Array (=> 1 => yer => ko'k)

PDO :: FETCH_NUM

PDO :: FETCH_NUM doimiyidan foydalanib, biz 0 indeksli qatorni olamiz:

Array (=> 1 => yer => ko'k)

PDO :: FETCH_COLUMN

Bu sobit faqat ustundan qiymatlarni olish uchun foydalidir va usul barcha natijalarni oddiy bir o'lchovli qatorda qaytaradi. Masalan, mana shunday so'rov:

$ stmt = $ pdo-> so'rov ("sayyoralardan ismni SELECT");

Natijada:

Array (=> yer => mars => yupiter)

PDO :: FETCH_KEY_PAIR

Bu sobit ikki ustundan qiymatlarni olish kerak bo'lganda foydalidir. FetchAll () usuli natijalarni assotsiativ qator sifatida qaytaradi. Bu qatorda birinchi ustundan ma'lumotlar kalitlar shaklida, ikkinchisidan esa qiymatlar sifatida ko'rsatiladi:

$ stmt = $ pdo-> so'rov ("SELECT name, color FROM planets"); $ natija = $ stmt-> fetchAll (PDO :: FETCH_KEY_PAIR);

Natijada:

Array (=> ko'k => qizil => g'alati)

PDO :: FETCH_OBJECT

PDO :: FETCH_OBJECT doimiyidan foydalanganda, qabul qilingan har bir satr uchun anonim ob'ekt yaratiladi. Uning (umumiy) xossalari ustunlar bilan bir xil nomlanadi va so'rov natijalari qiymat sifatida ishlatiladi. Ushbu usulni yuqoridagi so'rovlar uchun ishlatish quyidagi natijani beradi:

$ natijalar = $ stmt-> olish (PDO :: FETCH_OBJ); stdClass obyekti (=> yer => ko'k)

PDO :: FETCH_CLASS

Oldingi doimiy kabi, u ob'ekt qiymatlariga ustun qiymatlarini belgilaydi, lekin bu holda biz ob'ektni yaratish uchun foydalaniladigan mavjud sinfni o'rnatishimiz kerak. Namoyish maqsadida birinchi navbatda sinf yaratamiz:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy funktsiya setName ($ planet_ nomi) ($ bu-> ism = $ sayyora_ nomi;) umumiy funktsiyasi setColor ($ planet_color) ($ bu-> rang = $ planet_color;) umumiy funktsiyasi getName () ($ this-> name; return;) umumiy funktsiyasi getColor () ($ this-> color;))

Kodning soddaligiga e'tibor bermang, balki biz yaratgan Planet sinfini ko'rib chiqaylik: uning xususiyatlarida xususiylik bor va sinfda konstruktor yo'q. Endi natijalarni olishga harakat qilaylik.

Feto () ni PDO :: FETCH_CLASS bilan ishlatganda, ma'lumotlarni olishdan oldin ob'ektda setFetchMode () usulini ishlatishingiz kerak, masalan:

$ stmt = $ pdo-> so'rov ("SELECT name, color FROM planets"); $ stmt-> setFetchMode (PDO :: FETCH_CLASS, "Sayyora");

Biz PDO :: FETCH_CLASS konstantasini setFetchMode () usulining birinchi argumenti va ikkinchi argument sifatida ob'ektni (bizda "Planet") yaratish uchun ishlatiladigan sinf nomini o'rnatdik. Endi kodni ishga tushiramiz:

$ planet = $ stmt-> fetch ();

Siz Planet ob'ektini olishingiz kerak:

Var_dump ($ planet); Sayyora jismi (=> yer => ko'k)

E'tibor bering, so'rovdan olingan qiymatlar shaxsiy bo'lsa -da, mos keladigan ob'ekt xususiyatlariga qanday tayinlangan.

Ob'ektni yaratgandan keyin xarakteristikalarni tayinlash

"Sayyora" sinfida aniq konstruktor yo'q edi, shuning uchun xarakteristikalarni belgilashda muammolar bo'lmagan; lekin sinfda xususiyatlar o'rnatilgan va o'zgartirilgan konstruktor bo'lsa nima bo'ladi? Dizayner ishga tushishidan oldin qiymatlar tayinlanganligi sababli, ularning ustiga yoziladi.

PDO FETCH_PROPS_LATE doimiyligini ta'minlashga yordam beradi: ishlatilganda qiymatlar ob'ekt yaratilgandan keyin beriladi. Misol:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy funktsiya __construct ($ nomi = oy, $ rang = kulrang) ($ bu-> ism = $ nomi; $ bu-> rang = $ rang;) umumiy funktsiya setName ($ planet_name) ($ this-> name = $ planet_name;) umumiy funktsiyasi setColor ($ planet_color) ($ this-> color = $ planet_color;) umumiy funktsiyasi getName () (qaytarish $ bu-> nom;) umumiy funktsiyasi getColor () ($ bu-> rangni qaytaring;))

Biz ikkita argumentni oladigan konstruktor yaratib, Planet sinfimizni o'zgartirdik: ism, ism va rang. Bu dalillar oy va kul rangning asosiy qiymatlariga ega, ya'ni boshqa qiymatlar ko'rsatilmagan bo'lsa, ular o'rnatiladi.

Bunday holda, agar biz FETCH_PROPS_LATE -dan foydalanmasak, u holda ma'lumotlar bazasidan qanday qiymatlar olinishi muhim emas, barcha xarakteristikalar asosiy bo'lib qoladi, chunki ob'ektni yaratishda ularning ustiga yoziladi. Buni tekshirish uchun quyidagi so'rovni bajaring:

$ stmt = $ pdo-> so'rov ("SELECT nomi, rangi FROM solar_system WHERE name =" earth ""); $ stmt-> setFetchMode (PDO :: FETCH_CLASS, "Sayyora"); $ planet = $ stmt-> fetch ();

Keling, Planet ob'ektini ko'rib chiqamiz va qaysi qiymatlar uning xususiyatlariga mos kelishini tekshiramiz:

Var_dump ($ planet); ob'ekt (Sayyora) # 2 (2) (["nomi": "Sayyora": shaxsiy] => tor (4) "oy" ["rang": "Sayyora": shaxsiy] => mag'lubiyat (4) "kulrang" )

Kutilganidek, ma'lumotlar bazasidan olingan qiymatlar standart qiymatlar ustiga yozilgan. Endi biz FETCH_PROPS_LATE doimiy (va oldingi so'rov bilan bir xil) yordamida muammoni qanday hal qilishni ko'rsatamiz:

$ stmt-> setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Sayyora"); $ planet = $ stmt-> fetch (); var_dump ($ planet); ob'ekt (Sayyora) # 4 (2) (["nomi": "Sayyora": shaxsiy] => mag'lubiyat (5) "yer" ["rang": "Sayyora": shaxsiy] => mag'lubiyat (4) "ko'k" )

Nihoyat, kerakli natijaga erishiladi. Ammo, agar sinf konstruktorida asosiy qiymatlar bo'lmasa va ular o'rnatilishi kerak bo'lsa -chi? Bu osonroq: biz setFetchMode () usuli yordamida sinf nomidan keyin uchinchi dalil sifatida konstruktor parametrlarini massiv shaklida o'rnatishimiz mumkin. Masalan, konstruktorni o'zgartiramiz:

Sinf sayyorasi (shaxsiy $ nomi; shaxsiy $ rang; umumiy vazifa __construct ($ nomi, $ rang) ($ this-> name = $ name; $ this-> color = $ color;) [...])

Endi konstruktor argumentlari talab qilinadi, shuning uchun biz quyidagilarni bajaramiz:

$ stmt-> setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Planet", ["oy", "kulrang"]);

Bunday holda, biz ko'rsatgan parametrlar faqat ob'ektning xatosiz ishlashi uchun zarur bo'lgan asosiy qiymatlar bo'lib xizmat qiladi: ular ma'lumotlar bazasidagi qiymatlar ustiga yoziladi.

Bir nechta ob'ektlarni olish

Albatta, fetch () usuli yordamida yoki pastadir orqali ob'ektlar ko'rinishida bir vaqtning o'zida bir nechta natijaga erishish mumkin:

While ($ planet = $ stmt-> fetch ()) (// Natijalar bilan bog'liq narsa)

Yoki barcha natijalarni birdaniga olish orqali. Bunday holda, yuqorida aytib o'tilganidek, fetchAll () usuli yordamida siz usulni ishga tushirishdan oldin emas, balki u boshlangan vaqtda olish rejimini belgilashingiz kerak bo'ladi:

$ stmt-> fetchAll (PDO :: FETCH_CLASS | PDO_FETCH_PROPS_LATE, "Sayyora", ["oy", "kulrang"]);

PDO :: FETCH_INTO

Ushbu doimiydan foydalanganda, PDO yangi ob'ekt yaratmaydi, aksincha mavjud xususiyatlarni yangilaydi, lekin agar u ochiq bo'lsa yoki ob'ekt ichida __set () usuli ishlatilsa.

To'g'ridan -to'g'ri so'rovlarga qarshi tayyorlangan

PDO so'rovlar bilan ishlashning ikkita usuliga ega: to'g'ridan -to'g'ri va ishonchliroq - tayyorlangan.

To'g'ridan -to'g'ri so'rovlar

To'g'ridan -to'g'ri so'rovlarni ishlatishning ikkita asosiy usuli bor: query () va exec (). Birinchisi, PDOStatemnt ob'ektini yaratadi, unga fetch () yoki fetchAll () usullari orqali kirish mumkin: agar ularni jadval o'zgarmasa, masalan SELECT.

Ikkinchi usul so'rov bilan o'zgartirilgan qator raqamini qaytaradi: biz uni INSERT, O'CHIRISH yoki YANGILASH kabi qatorlarni almashtiradigan holatlarda ishlatamiz. To'g'ridan -to'g'ri so'rovlar faqat so'rovlarda o'zgaruvchilar bo'lmasa va usulning xavfsizligi haqida hech qanday shubha bo'lmasa ishlatilishi kerak.

Tayyorlangan so'rovlar

PDO, shuningdek, tayyorlangan ikki bosqichda bajarilgan so'rovlarni qo'llab -quvvatlaydi: ular so'rovlarda o'zgaruvchilar mavjud bo'lganda foydalidir va umuman xavfsizroqdir, chunki preparat () usuli biz uchun barcha kerakli qadamlarni bajaradi. Keling, o'zgaruvchilar qanday ishlatilishini ko'rib chiqaylik. Tasavvur qiling, biz sayyoralar jadvaliga xususiyatlarini kiritmoqchimiz. Birinchidan, so'rov tayyorlaylik:

$ stmt = $ pdo-> tayyorgarlik ("INSERT INTO planets (name, color) VALUES (?,?)"));

Yuqorida aytib o'tganimizdek, biz o'zgaruvchilar uchun vaqtinchalik qiymatlardan foydalangan holda SQL so'rovini argument sifatida qabul qiladigan preparat () usulidan foydalanamiz. Vaqtinchalik qiymatlar ikki xil bo'lishi mumkin: pozitsion va nominal.

Pozitsion

Foydalanish? joylashuv vaqtinchalik qiymatlari, kod yanada aniqroq, lekin biz kiritilishi kerak bo'lgan ma'lumotlarni bir xil tartibda bajarish uchun argument sifatida berilgan qatordagi ustun nomlari bilan belgilashimiz kerak:

$ stmt-> execute ([$ planet-> nomi, $ planet-> rang]);

Nominal

Nomlangan joy egalari yordamida bizga alohida buyurtma kerak emas, lekin natijada biz ko'proq kodni olamiz. Biz execute () usulini ishga tushirganimizda, biz ma'lumotlarni assotsiativ massiv shaklida o'rnatishimiz kerak, bunda har bir kalit ishlatilgan vaqtinchalik qiymatning nomi bo'ladi va u bilan bog'liq qiymat so'rovga o'tkaziladi. Masalan, oldingi so'rov quyidagicha bo'ladi:

$ stmt = $ pdo-> tayyorlang ("INSERT INTO sayyoralarga (ism, rang) VALUES (: ism ,: rang)"); $ stmt-> execute (["name" => $ planet-> nomi, "color" => $ planet-> color]);

Tayyorgarlik () va bajarish () usullarining ikkalasi ham ma'lumotlar bazasidan ma'lumotlarni o'zgartiradigan yoki oddiygina oladigan so'rovlar uchun ishlatilishi mumkin. Birinchi holda, biz ma'lumot olish uchun yuqorida sanab o'tilgan usullarni qo'llaymiz, ikkinchisida esa rowCount () usulidan foydalanamiz.

BindValue () va bindParam () usullari

BindValue () va bindParam () usullari so'rovga kiritiladigan qiymatlarni berish uchun ham ishlatilishi mumkin. Birinchisi, ko'rsatilgan o'zgaruvchining qiymatini so'rovni tayyorlashda ishlatiladigan pozitsion yoki nomlangan vaqtinchalik qiymat bilan bog'laydi. Oldingi ishni misol qilib olsak, biz shunday qilamiz:

$ stmt-> bindValue ("nomi", $ planet-> nomi, PDO :: PARAM_STR);

Biz $ planet-> nomining qiymatini vaqtinchalik qiymatga bog'laymiz: ism. Shuni esda tutingki, bindValue () va bindParam () yordamida biz o'zgaruvchining turini uchinchi argument sifatida mos PDO doimiyidan foydalanib belgilashimiz mumkin, bu holda PDO :: PARAM_STR.

Buning o'rniga bindParam () dan foydalanib, biz o'zgaruvchini so'rovni tayyorlashda ishlatiladigan vaqtinchalik qiymatga bog'lashimiz mumkin. E'tibor bering, bu holda, o'zgaruvchi mos yozuvlar bilan bog'langan va uning qiymati faqat execute () usuli ishga tushganda vaqtincha o'zgartiriladi. Sintaksis oxirgi marta bo'lgani kabi:

$ stmt-> bindParam ("nomi", $ planet-> nomi, PDO :: PARAM_STR)

Biz o'zgaruvchini $ planet-> name qiymatiga emas, balki bog'laymiz: name! Yuqorida aytib o'tilganidek, almashtirish faqat execute () usuli ishga tushirilganda sodir bo'ladi, shuning uchun vaqtinchalik qiymat o'sha paytdagi o'zgaruvchining qiymati bilan almashtiriladi.

PDO operatsiyalari

Operatsiyalar bir nechta so'rovlarni bajarishda izchillikni saqlashga imkon beradi. Barcha so'rovlar "partiyalarda" bajariladi va agar ular muvaffaqiyatli bo'lsa, ma'lumotlar bazasiga murojaat qilinadi. Tranzaktsiyalar barcha ma'lumotlar bazalari bilan ishlamaydi va hamma SQL tuzilmalari bilan ishlamaydi, chunki ularning ba'zilari muammo tug'diradi.

Haddan tashqari va g'aroyib misol sifatida, tasavvur qiling -a, foydalanuvchi sayyoralar ro'yxatini tanlashi kerak va har safar yangi tanlov qilganda, siz yangisini kiritishdan oldin ma'lumotlar bazasidan avvalgisini o'chirib tashlashingiz kerak bo'ladi. Agar o'chirish sodir bo'lsa, lekin qo'shish bo'lmasa -chi? Biz sayyorasiz foydalanuvchini olamiz! Asosan, operatsiyalar quyidagicha qo'llaniladi:

$ pdo-> beginTransaction (); harakat qilib ko'ring ($ stmt1 = $ pdo-> exec ("sayyoralardan O'CHIRISH"); $ stmt2 = $ pdo-> tayyorlash ("sayyoralarga INSERT (ism, rang) VALUES (?,?)"); foreach ($ sayyoralar kabi $ planet) ($ stmt2-> bajaring ([$ planet-> getName (), $ planet-> getColor ()]);) $ pdo-> majburiyat ();) catch (PDOException $ e) ($ pdo-> rollBack ();)

Birinchidan, PDO ob'ektidagi beginTransaction () usuli so'rovning avtomatik bajarilishini o'chirib qo'yadi, keyin so'rovlar kerakli tartibda boshlanadi. Bu erda, agar PDOException qo'yilmasa, so'rovlar avtomatik ravishda commITIT () usuli orqali uzatiladi, aks holda rollBack () usuli orqali tranzaktsiyalar bekor qilinadi va avtomatik topshirish tiklanadi.

Shunday qilib, bir nechta so'rovlar bilan doimo izchillik bo'ladi. Bu juda aniq, lekin PDO tranzaktsiyalaridan faqat foydalanish mumkin PDO :: ATTR_ERRMODE PDO :: ERRMODE_EXCEPTION ga o'rnatiladi.

Bootstrap ramkasi: tezkor javob berish tartibi

Bootstrap tizimidagi javob berish tartibi asoslari bo'yicha bosqichma-bosqich video darslik.

Kuchli va amaliy vosita yordamida oson, tez va samarali yozishni o'rganing.

Buyurtma berish va pul to'lash tartibi.

"WordPress sayti" bepul kursi

WordPress CMS -ni o'rganishni xohlaysizmi?

WordPress veb -saytining dizayni va joylashuvi bo'yicha qo'llanmalarni oling.

Mavzular bilan ishlashni va tartibni kesishni o'rganing.

CMS WordPress -da sayt dizayni, joylashuvi va o'rnatilishi bo'yicha bepul video kurs!

* O'tishni to'xtatib turish uchun sichqonchani suring.

Oldinga orqaga

PDO kengaytmasi asoslari

Bugun biz juda qiziqarli mavzuni - kengaytma bilan ishlash asoslarini tahlil qilamiz. PDO PHP uchun.

PDO (PHP ma'lumotlar ob'ektlari)- bu turli xil ma'lumotlar bazalari bilan ularning xususiyatlarini inobatga olmagan holda ishlashga imkon beradigan qandaydir interfeys. PDO yordamida biz turli xil ma'lumotlar bazalarini osongina almashtirishimiz va boshqarishimiz mumkin. Buni aniqroq qilish uchun bir misolni ko'rib chiqaylik.

Biz ilgari bazaga qanday ulanishimiz kerak edi MySQL?

Mysql_connect ($ host, $ user, $ password); mysql_select_db ($ db);

Ulanish uchun SQLite biz shunday yozishimiz kerak edi:

Sqlite_open ($ db);

Agar bizga ma'lumotlar bazasi kerak bo'lsa PostgreSQL, keyin siz shunday yozishingiz kerak:

Pg_connect ("host = $ host, dbname = $ db, user = $ user, password = $ password");

Juda qulay emas, to'g'rimi? Ma'lum bo'lishicha, agar biz ma'lumotlar bazasini o'zgartirmoqchi bo'lsak, unda biz juda ko'p kodni qayta ishlashimiz kerak bo'ladi. Shunday qilib, buni tuzatish uchun maxsus PHP kengaytmasi paydo bo'ldi - PDO.

Keling, endi bazaga qanday ulanish mumkinligini ko'rib chiqaylik:

$ db = yangi PDO ("mysql: host = $ host; dbname = $ db", $ user, $ password);

$ db = yangi PDO ("sqlite: $ db);

PostgreSQL:

$ db = yangi PDO ("pgsql: host = $ host; dbname = $ db", $ user, $ password);

Ko'rib turganingizdek, ulanish chizig'idan tashqari hamma narsa bir xil. Bu yagona farq.


Keling, avval so'rovlarni qanday bajarishimiz kerakligini ko'rib chiqaylik:

$ sql = "INSERT INTO (ism, email) VALUES ($ name, $ email)"; // MySQL mysql_query ($ sql); // SQLite sqlite_query ($ sql); // PostgreSQL pg_query ($ sql);

Endi biz bundan xulosa chiqarishimiz mumkin:

// PDO $ natijasi = $ db-> exec ($ sql);

Hammasi! Bizning so'rov biz qaysi ma'lumotlar bazasidan foydalanmasligimizdan qat'i nazar bajariladi va o'zgaruvchiga natija ta'sirlangan qatorlar sonini oladi.

Biroq, biz ma'lumotlar bazasidan biror narsani shu tarzda tanlay olmaymiz. Namuna olish uchun biz ishlatmasligimiz kerak ijrochi, a so'rov.

$ sql = "Foydalanuvchilardan ismni tanlang"; $ natija = $ db-> so'rov ($ sql);

Endi keling xavfsizlik haqida eslaylik, chunki barcha ma'lumotlarni tekshirish kerak. Buni oldin qanday qilganmiz?

$ sql = "SELECT * FROM of users where where name = $ name"; $ nomi = $ _POST ["ism"]; // MySQL $ nomi = mysql_real_escape_string ($ nomi); // SQLite $ nomi = sqlite_escape_string ($ nomi); // PostgreSQL $ nomi = pg_escape_string ($ nomi);

Endi biz buni qilishimiz shart emas. PDO biz uchun hamma narsani qiladi.

$ nomi = $ db-> tirnoq ($ nomi); $ natija = $ db-> so'rov ($ sql);

PDO hamma narsani o'zi tekshiradi va uzatilgan ma'lumotlarni qayta ishlaydi. Ajoyib? :) Bundan ham zo'r! Davom etamiz.

Qanday qilib natijani oldin massivga aylantirganmiz? Baza misolini ko'rib chiqing MySQL.

$ natija = mysql_query ($ sql); // Shunday qilib, $ row = mysql_fetch_assoc ($ natijasi); // Yoki shunga o'xshash ... $ row = mysql_fetch_array ($ result, FETCH_ASSOC);

Assotsiativ sifatida biz raqamlangan qatorni olishimiz mumkin. Keling, bu qanday amalga oshirilishini ko'rib chiqaylik PDO:

$ stmt = $ db-> so'rov ($ sql); // Assotsiativ $ natijasi = $ stmt-> FETCH (PDO :: FETCH_ASSOC); // raqamlangan $ natija = $ stmt-> FETCH (PDO :: FETCH_NUM); // Ikkala turdagi massivlar bir vaqtning o'zida $ result = $ stmt-> FETCH (PDO :: FETCH_BOTH); // Ob'ekt $ natijasi = $ stmt-> FETCH (PDO :: FETCH_OBJ);

Bundan tashqari, uni ishlatish juda oson:

// Assotsiativ echo $ natijasi ["nomi"]; // raqamlangan echo $ result; // Ob'ekt echo $ result-> nomi;

"Dangasa" uchun shunday narsa bor:

$ stmt = $ db-> so'rov ($ sql); $ natija = $ stmt-> FETCH (PDO :: FETCH_LAZY);

U bir vaqtning o'zida barcha 3 turini qaytaradi. Bular. bu FETCH_BOTH va FETCH_OBJ birga. Siz taxmin qilganingizdek, shundan so'ng ma'lumotlarga uchta usuldan biridan foydalanish mumkin:

$ Excho $ result-> ism; echo $ natijasi ["nomi"]; echo $ natijasi;

lekin Qabul qiling faqat bitta yozuvni qaytaradi, shuning uchun agar biz barcha yozuvlarni olishni istasak, undan foydalanishimiz kerak FetchAll.

$ stmt = $ db-> so'rov ("SELECT * FROM of users"); $ natija = $ stmt-> FetchAll (PDO :: FETCH_ASSOC); foreach ($ user sifatida $ natijasi) (echo $ user ["name"]. "
"; }

Ammo u bilan bog'liq yana bir ajoyib narsa bor Qabul qiling... Uning yordami bilan biz o'z sinfimizni ma'lumotlar bazasidagi ma'lumotlar bilan to'ldirishimiz mumkin. avtomatik ravishda.

Sinf foydalanuvchisi (public $ login; public $ id; public function showInfo () (echo ") ". $ this-> id.""." : ". $ this-> kirish".
";)) $ db = yangi PDO (" mysql: host = localhost; dbname = test "," root "," "); $ stmt = $ db-> so'rov (" SELECT * FROM `users '"); $ natija = $ stmt-> fetchAll (PDO :: FETCH_CLASS, "Foydalanuvchi"); foreach ($ foydalanuvchi sifatida $ natija) ($ user-> showInfo ();)

Ko'rib turganingizdek, hamma narsa juda oddiy. Biz faqat doimiyni belgilashimiz kerak FETCH_CLASS va tirnoqlarda vergul bilan ajratilgan, ma'lumotlar kiritiladigan sinf nomi.

Keyin biz ob'ekt ustida tsiklni takrorlaymiz va kerakli ma'lumotlarni ko'rsatamiz.
Diqqat! Sinfdagi xususiyatlar nomlari ma'lumotlar bazasidagi maydonlar nomlariga mos kelishi kerak.

Boshqa narsalar qatorida, biz shunday deb nomlangan narsalarni yaratishimiz mumkin tayyorlangan so'rovlar... Ularning afzalliklari nimada?

1. Biz so'rovni bir marta tayyorlab, keyin kerak bo'lganda uni ishga tushirishimiz mumkin. Bundan tashqari, ham xuddi shunday, ham boshqa parametrlar bilan.

So'rov tayyorlanganda, MBT uni tahlil qiladi, uning bajarilish rejasini tuzadi va optimallashtiradi. Murakkab so'rovlar holatida, agar biz uni turli parametrlar bilan ishga tushirsak, bajarilish vaqti sezilarli bo'ladi. Tayyorlangan bayonotlar bo'lsa, bu bir marta amalga oshiriladi va shuning uchun kamroq vaqt sarflanadi.

2. Tayyorlangan so'rov parametrlarini keltirish shart emas, haydovchi buni avtomatik ravishda bajaradi. Agar ilova faqat tayyorlangan bayonotlardan foydalansa, SQL in'ektsiyasi deyarli mumkin emas.

PDO tayyorlangan bayonotlarga taqlid qilishi mumkin agar ular haydovchi tomonidan qo'llab -quvvatlanmasa. Keling, ulardan qanday foydalanishni ko'rib chiqaylik?

$ stmt = $ db-> tayyorlang ("INSERT INTO users (name, login) VALUES (: name ,: login)"); $ stmt-> bindParam (": ism", $ nomi); $ stmt-> bindParam (": login", $ login); // Bu qiymatlar bilan bitta qatorni kiriting $ name = "vasya"; $ login = "vasya123"; $ stmt-> execute (); // Endi boshqa qiymatli boshqa qator $ name = "petya"; $ login = "petya123"; $ stmt-> execute ();

Usul bindParam parametrlarni o'rnatishga imkon beradi. Menimcha, bu erda hamma narsa aniq. Birinchidan, biz ma'lumot kiritishni xohlagan joyga quyidagi qatorni yozamiz " : ism". Keyin biz ularning qaerdan kelishini ko'rsatamiz. Bunday holda, ular o'zgaruvchilardan olinadi ism va Kirish.

Endi biz bu so'rovni har xil parametrlarda xohlaganimizcha ishlatishimiz mumkin va uni bajarish uchun biz usulni chaqirishimiz kerak. ijro etmoq... Bular edi nomlangan variantlar. Shuningdek bor ismi oshkor qilinmagan.

$ stmt = $ db-> tayyorgarlik ("INSERT INTO users (name, login) VALUES (?,?)"); // $ stmt-> bindParam (1, $ name) birinchi savol belgisi o'rniga o'zgarmaydigan nomidan ma'lumotlar kiritiladi; // Kirish o'zgaruvchisidan olingan ma'lumotlar $ stmt-> bindParam (2, $ login) ikkinchi savol belgisi o'rniga kiritiladi; // Bu qiymatlar bilan bitta qatorni kiriting $ name = "vasya"; $ login = "vasya123"; $ stmt-> execute (); // Endi boshqa qiymatli boshqa qator $ name = "petya"; $ login = "petya123"; $ stmt-> execute ();

Keyingi lahza xatolarni qanday aniqlay olamiz?

Buning uchun sinf bor PDOException... Barcha so'rovlaringizni blokda yozishni maslahat beraman qo'lga olmoq.

Sinab ko'ring ($ db = yangi PDO ("myql: host = localhost; dbname = test", "root", ""); $ stmt = $ db-> so'rov ("SELECT * FROM users"); $ result = $ stmt -> olish (PDO :: FETCH_ASSOC); echo $ result ["login"];) catch (PDOException $ e) (echo "Xato:". $ e-> getMessage () ").
"; echo" Yo'lda: ". $ e-> getLine ();)

Bu erda biz xato qildik va yozdik myql o'rniga mysql... Va sinf PDOException u bizga bu haqda yozadi.

U bir nechta usullarga ega, lekin eng ko'p ishlatiladiganlari getMessage () bu bizga xato matnini qaytaradi va getLine (), bu xato yuz bergan qator raqamini qaytaradi.

Va nihoyat, gaplashaylik bitimlar... Birinchidan, men sizga kodni beraman.

Sinab ko'ring ($ db = yangi PDO ("mysql: host = localhost; dbname = test", "root", ""); $ db-> beginTransaction (); $ stmt = $ db-> exec ("INSERT INTO` foydalanuvchilari") `(` login ') VALUES ("login1") "); $ stmt = $ db-> exec (" INSERT INTO `users` (` login') VALUES ("login2") ")); $ stmt = $ db- > exec ("INSERT INTO` users` (" login `) VALUES (" login3 ")")); $ db-> majburiyat ();) catch (PDOException $ e) ($ db-> rollBack ();)

Bu erda biz usul yordamida operatsiyani boshlaymiz startTransaction ()... Keyin qandaydir so'rov kodi keladi. Keyin biz usulni chaqiramiz majburiyat () O'zgarishlarimizni tasdiqlash uchun. Agar biror narsa noto'g'ri bo'lsa, blokda tutmoq Biz usulni chaqiramiz rollBack () bu bizning barcha ma'lumotlarimizni oldingi holatiga qaytaradi.

"Va nima uchun bu bitimlar aslida kerak?" - deb so'raysiz. Bu savolga javob berish uchun men yuqorida keltirgan misolni ko'rib chiqing. U erda siz "kirish" maydoniga qiymatni kiritasiz login1, login2, login3.

Kiritgandan keyin buni tasavvur qiling kirish 1 va kirish 2, qandaydir xatolik yuz berdi. Ma'lum bo'lishicha, bu ma'lumotlar kiritilgan va kirish 3- Yo'q. Ko'p hollarda, bu qabul qilinishi mumkin emas va kelajakda dastur buziladi.

Bunday holatlarning oldini olish uchun tranzaktsiyalar zarur. Agar bizning skriptimiz muvaffaqiyatsiz bo'lsa, unda usul rollBack () hamma narsani asl holatiga qaytaradi. Bular. kirish 1 va kirish 2 ham kiritilmaydi. Keling, bu xatoni simulyatsiya qilaylik.

Sinab ko'ring ($ db = yangi PDO ("mysql: host = localhost; dbname = test", "root", ""); $ db-> beginTransaction (); $ stmt = $ db-> exec ("INSERT INTO` foydalanuvchilari") `(` login`) VALUES ("login1") "); $ stmt = $ db-> exec (" INSERT INTO `users`" (login `) VALUES (" login2 ")"); chiqish ("xato") $ stmt = $ db-> exec ("INSERT INTO` users`" (login `) VALUES (" login3 ")"); $ db-> majburiyat ();) catch (PDOException $ e) ($ db-> rollBack ();)

Kiritgandan keyin kirish 1 va kirish 2 funktsiya yordamida skriptdan chiqamiz Chiqish ()... Biz uchun istisno qo'yiladi, biz blokka kiramiz tutmoq va u erda biz hamma narsani asl holatiga qaytaramiz. Endi, agar biz ma'lumotlar bazasiga qarasak, u erda ko'rmaymiz kirish 1 va kirish 2.

Shu nuqtada biz tugatamiz. Shubhasiz, bu erda biz PDO bizga beradigan hamma narsani qamrab olmaganmiz, lekin u bilan ishlash asoslarini bilib oldik. Siz har doim PHP rasmiy veb -saytida ushbu kengaytma haqida batafsil ma'lumotni topishingiz mumkin.

Materialni Vladislav Andreev sayt uchun maxsus tayyorlagan

P.S. PHP va OOP tajribangizni davom ettirmoqchimisiz? Saytni yaratishning turli jihatlari, jumladan PHP -da dasturlash bo'yicha premium darsliklarni, shuningdek OOP yordamida PHP -da CMS tizimini noldan yaratish bo'yicha bepul kurslarni ko'rib chiqing:

Sizga material yoqdimi va sizga rahmat aytmoqchimisiz?
Faqat do'stlaringiz va hamkasblaringiz bilan baham ko'ring!