Pdo mysql misollari. Ma'lumotlar bazasiga kirish uchun PDO (PHP Data Objects) ni qanday sozlash va undan foydalanish. Konstruktor bajarilgandan keyin xususiyatlarni aniqlash
Muddati PDOuchun stsenariy hisoblanadi PHP ma'lumotlar ob'ektlari. Nomidan ko'rinib turibdiki, ushbu texnologiya sizga ma'lumotlar bazasi tarkibi bilan ob'ektlar orqali ishlashga imkon beradi.
Nima uchun myqli yoki mysql emas?
Ko'pincha, yangi texnologiyalarga kelsak, ularning eski, yaxshi va tasdiqlangan vositalarga nisbatan afzalliklari, shuningdek joriy va eski loyihalarni ularga o'tkazish masalasi tug'iladi.
PDO ob'ektiga yo'naltirish
Php U juda faol rivojlanmoqda va ommaviy va korporativ ham veb-ilovalarni jadal rivojlantirish uchun eng yaxshi vositalardan biri bo'lishga intilmoqda.
Haqida gaplashish Php, biz zamonaviy ob'ektga yo'naltirilgan degan ma'noni anglatadi Php, sinovdan o'tish va qayta foydalanish uchun qulay bo'lgan universal kodni yozishga imkon beradi.
Foydalanish PDO ma'lumotlar bazasi bilan ishlashni ob'ektga yo'naltirilgan darajaga olib chiqishga va kodning qulayligini oshirishga imkon beradi. Aslida, foydalanish PDO siz o'ylaganingizdek qiyin emas.
Xulosa
Tasavvur qiling, biz uzoq vaqtdan beri foydalanib, dasturni ishlab chiqmoqdamiz MySQL. Va endi, bir nuqtada, almashtirishga ehtiyoj bor MySQL yoqilgan PostgreSQL.
Hech bo'lmaganda, biz barcha qo'ng'iroqlarni almashtirishimiz kerak mysqli_connect () (mysql_connect ()) yoqilgan pg_connect () va shunga o'xshash tarzda ma'lumotlarni so'rash va qayta ishlash uchun ishlatiladigan boshqa funktsiyalar.
Foydalanishda PDO, biz konfiguratsiya fayllaridagi bir nechta parametrlarni o'zgartirish bilan cheklanamiz.
Parametrlarni bog'lash
Tegishli parametrlardan foydalanish so'rovlarni loyihalashda ko'proq moslashuvchanlikni ta'minlaydi va sizga qarshi himoyani yaxshilashga imkon beradi SQL qarshi.
Ob'ektlar sifatida ma'lumotlarni olish
Allaqachon foydalanayotganlar ORM (ob'ekt bilan bog'liq xaritalash - masalan, Doktrina, ma'lumotlar bazasi ob'ektlaridan ob'ektlar shaklida ma'lumotlarni taqdim etish qulayligini bilish. PDO ma'lumotni ob'ektlar shaklida va foydalanmasdan olish imkonini beradi ORM.
Mysql kengaytmasi endi qo'llab-quvvatlanmaydi
Kengaytmani qo'llab-quvvatlash mysql yangisidan butunlay o'chirib tashlandi PHP 7. Agar siz loyihani yangi versiyaga o'tkazishni rejalashtirmoqchi bo'lsangiz Php, hozirda unda kamida mysqli-dan foydalanishingiz kerak. Albatta, foydalanishni boshlash yaxshidir PDOagar siz hali buni qilmagan bo'lsangiz.
Menimcha, bu sabablar balansni ishlatish uchun etarli PDO. Bundan tashqari, siz ortiqcha narsalarni o'rnatishingiz shart emas.
Tizimda PDO mavjudligini tekshirish
Versiyalar PHP 5.5 va yuqorida, ko'pincha, u bilan ishlash uchun kengaytma mavjud PDO. Tekshirish uchun konsolda oddiy buyruqni bajaring:
php -i | grep "pdo"
Endi uni istalgan brauzerda oching va kerakli ma'lumotni qidirib toping PDO.
PDO bilan tanishing
Bilan ishlash jarayoni PDO an'anaviydan juda farq qilmaydi. Umuman olganda, foydalanish jarayoni PDO quyidagicha:
Ma'lumotlar bazasiga ulanish;
Agar kerak bo'lsa, so'rov tayyorlash va parametrlarni bog'lash;
Talabni bajarish.
Ma'lumotlar bazasiga ulanish
Ma'lumotlar bazasiga ulanish uchun siz yangi ob'ekt yaratishingiz kerak PDO va unga ma'lum bo'lgan ma'lumotlar manbai nomini bering DSN.
Umumiy holda DSN har bir haydovchiga xos bo'lgan ulanish simidan ajratilgan haydovchi nomidan iborat PDO.
Uchun MySQL, ulanish quyidagicha:
$ ulanish \u003d yangi PDO ("mysql: host \u003d localhost; dbname \u003d mydb; charset \u003d utf8", "root", "root");
|
$ ulanish \u003d yangi PDO ( "mysql: host \u003d localhost; dbname \u003d mydb; charset \u003d utf8", "ildiz", "ildiz");
|
Bunday holda, DSN haydovchining ismini o'z ichiga oladi mysql, xostni aniqlaydi (format mumkin xost \u003d HOST_NAME: PORT), ma'lumotlar bazasi nomi, kodlash, foydalanuvchi nomi MySQL va parol.
Ma'lumotlar
Undan farqli o'laroq mysqli_query ()ichida PDO Ikkita turdagi so'rovlar mavjud:
Natijani qaytarish ( tanlang, ko'rsatish);
Natija qaytmayapti ( joylashtiring, detele va boshqalar).
Avvalo, ikkinchi variantni ko'rib chiqing.
So'rovni bajarish
Keling, misol yordamida so'rovlarning bajarilishini ko'rib chiqamiz joylashtiring.
$ connection-\u003e exec ("INSERT INTO foydalanuvchilari VALUES (1," somevalue "");
|
$ ulanish -\u003e exec ();
|
Albatta, ushbu so'rov ta'sirlangan qatorlar sonini qaytaradi va ularni quyidagicha ko'rish mumkin.
$ ta'sirRows \u003d $ connection-\u003e exec ("INSERT INTO foydalanuvchilari VALUES (1," somevalue ""); echo $ ta'sirRows);
|
$ ta'sirRows \u003d $ ulanish -\u003e exec ( "INSERT INTO foydalanuvchilari qiymatlari (1," ba'zi qiymat ")) ;
echo $ ta'sirlangan satrlar;
|
So‘rov natijalarini olish
Foydalanish holatida mysqli_query (), kod quyidagicha bo'lishi mumkin.
$ result \u003d mysql_query ("foydalanuvchilarni SELECT * FROM"); while ($ row \u003d mysql_fetch_assoc ($ result)) ($ string ["id"]. "" echo. $ string ["name"];)
|
$ result \u003d mysql_query ("foydalanuvchilarni SELECT * FROM");
vaqt ($ string \u003d mysql_fetch_assoc ($ natija)) ((natija)
|
Uchun PDO, kod sodda va aniqroq bo'ladi.
(satr $ "[" id "]." ". $ string [" name "]; echo
|
$ satr sifatida predach ($ connection -\u003e query ("foydalanuvchilarni SELECT * FROM SELECT"))
echo $ string ["id"]. "". $ string ["name"];
|
Ma'lumot olish usullari
Kabi mysqli, PDO ma'lumotlarni har xil rejimda olish imkonini beradi. Rejimni aniqlash uchun, sinf PDO tegishli konstantalarni o'z ichiga oladi.
PDO :: FETCH_ASSOC - ma'lumotlar bazasi jadvalidagi ustun nomi bilan indekslangan qatorni qaytaradi;
PDO :: FETCH_NUM - ustun raqami bilan indekslangan qatorni qaytaradi;
PDO :: FETCH_OBJ - anonim ob'ektni ustun nomlariga mos keladigan mulk nomlari bilan qaytaradi. Masalan, $ row-\u003e id id ustunidagi qiymatni o'z ichiga oladi.
PDO :: FETCH_CLASS - jadvalning satridagi ma'lumotlarga mos keladigan qiymat qiymatlari bilan sinfning yangi namunasini qaytaradi. Agar parametr ko'rsatilgan bo'lsa PDO :: FETCH_CLASSTYPE (masalan. PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE), sinf nomi birinchi ustun qiymatidan aniqlanadi.
Izoh: bu to'liq ro'yxat emas, barcha mumkin bo'lgan barqarorlik va ularni birlashtirish variantlari hujjatda mavjud.
Assotsiativ qator olishga misol:
$ bayonot \u003d $ connection-\u003e so'rov ("SELECT * FROM foydalanuvchilar"); while ($ row \u003d $ bayonot-\u003e olish (PDO :: FETCH_ASSOC)) ($ string ["id"]. "" echo. $ string ["name"];)
|
$ bayonot \u003d $ ulanish -\u003e
while ($ row \u003d $ bayonot -\u003e olish (PDO :: FETCH_ASSOC)) (
echo $ string ["id"]. "". $ string ["name"];
|
Izoh: Rejadan beri har doim namuna olish rejimini ko'rsatish tavsiya etiladi PDO :: FETCH_BOTH ikki barobar ko'proq xotirani talab qiladi - aslida ikkita massiv yaratiladi, assotsiativ va odatiy.
Namuna olish usulidan foydalanishni ko'rib chiqing PDO :: FETCH_CLASS. Sinf yarating Foydalanuvchi:
foydalanuvchi (himoyalangan $ id; himoyalangan $ nomi; jamoat vazifasi getId () (qaytish $ this-\u003e id;) jamoat funktsiyasi setId ($ id) ($ this-\u003e id \u003d $ id;) jamoat funktsiyasi getName () (qaytish $ this-\u003e name;) jamoat funktsiyasi setName ($ name) ($ this-\u003e name \u003d $ name;))
|
sinf foydalanuvchi
himoyalangan $ id;
himoyalangan $ nomi;
ommaviy funktsiya getId ()
return $ this -\u003e id;
jamoat funktsiyasi setId ($ id)
$ this -\u003e id \u003d $ id;
ommaviy funktsiya getName ()
return $ this -\u003e name;
jamoat funktsiyasi setName ($ name)
$ this -\u003e name \u003d $ name;
|
Endi ma'lumotlarni tanlang va ma'lumotlarni sinf usullari yordamida namoyish eting:
$ bayonot \u003d $ connection-\u003e so'rov ("SELECT * FROM foydalanuvchilar"); while ($ row \u003d $ bayon-\u003e olish (PDO :: FETCH_CLASS, "Foydalanuvchi")) (echo $ row-\u003e getId (). "". $ row-\u003e getName ();)
|
$ bayonot \u003d $ ulanish -\u003e so'rov ("SELECT * FROM foydalanuvchilar");
while ($ row \u003d $ bayonot -\u003e olish (PDO :: FETCH_CLASS, "Foydalanuvchi")) ((
echo $ row -\u003e getId (). "". $ row -\u003e getName ();
|
Tayyorlangan so'rovlar va parametrlarni bog'lash
Parametrlarni bog'lashning mohiyatini va barcha afzalliklarini tushunish uchun mexanizmlarni batafsil ko'rib chiqish kerak. PDO. Qo'ng'iroqda $ bayonot -\u003e so'rov () yuqoridagi kodda PDO so'rovni tayyorlang, uni bajaring va natijani qaytaring.
Qo'ng'iroqda $ ulanish -\u003e tayyorlash () Tayyorlangan so'rov yaratiladi. Tayyorlangan so'rovlar bu ma'lumotlar bazasini boshqarish tizimining so'rovlar shablonini olish, uni tuzish va shablonda ishlatiladigan o'zgaruvchilar qiymatlarini olgandan keyin bajarish qobiliyatidir. Andoza dvigatellari shunga o'xshash ishlaydi Aqlli va Twig.
Qo'ng'iroqda $ bayonot -\u003e bajarish () qiymatlar so'rov shabloniga o'zgartiriladi va DBMS so'rovni bajaradi. Ushbu harakat shablon funktsiyasini chaqirishga o'xshaydi ko'rsatish ().
Tayyorlangan so'rovlardan foydalanishga misol PHP PDO:
Yuqoridagi kodda maydon bilan yozuvni tanlash uchun so'rov tayyorlanadi id o'rnini bosadigan qiymatga teng : id. Ushbu bosqichda ma'lumotlar bazasi ma'lumotlar bazasi so'rovni tahlil qiladi va tuzadi, ehtimol keshlashdan foydalangan holda (sozlamalarga qarab).
Endi siz etishmayotgan parametrni o'tib, so'rovni bajarishingiz kerak:
$ id \u003d 5; $ bayonot-\u003e bajaring ([": id" \u003d\u003e $ id]);
Aloqador parametrlardan foydalanishning afzalliklari
Ehtimol, tayyorlangan so'rovlar mexanizmi va tegishli parametrlarni ko'rib chiqqandan keyin ulardan foydalanishning afzalliklari ayon bo'ldi.
PDO foydalanuvchi ma'lumotlarini himoya qilish uchun qulay imkoniyatni ta'minlaydi, masalan, bunday kod endi kerak emas:
Buning o'rniga, endi buni qilish tavsiya etiladi:
Siz hatto nomlanganlar o'rniga raqamlangan parametrlardan foydalanib kodni qisqartirishingiz mumkin:
Shu bilan birga, tayyorlangan so'rovlardan foydalanish bitta naqsh bo'yicha so'rovni qayta ishlatishda ishlashni yaxshilashi mumkin. Besh tasodifiy foydalanuvchilarni ma'lumotlar bazasidan olishning misoli:
$ numberOfUsers \u003d $ connection-\u003e so'rov ("foydalanuvchilarni SELECT COUNT (*) FROM") -\u003e fetchColumn (); $ foydalanuvchilar \u003d; $ bayonot \u003d $ connection-\u003e Tayyorgarlik ("QANDAY ID \u003d? LIMIT 1" foydalanuvchilardan TANLASH); uchun ($ i \u003d 1; $ i<= 5; $i++) { $id = rand(1, $numberOfUsers); $users = $statement->bajaring ([$ id]) -\u003e yuklash (PDO :: FETCH_OBJ); )
|
$ numberOfUsers \u003d $ ulanish -\u003e so'rov ("foydalanuvchilarni SELECT COUNT (*) FROM") -\u003e fetchColumn ();
$ foydalanuvchilar \u003d;
uchun ($ i \u003d 1; $ i<= 5 ; $i ++ ) {
$ id \u003d rand (1, $ numberOfUsers);
$ users \u003d $ bayonot -\u003e bajarish ([$ id]) -\u003e olish (PDO :: FETCH_OBJ);
|
Usulni chaqirganda tayyorlang (), DBMS so'rovni tahlil qiladi va tuzadi, agar kerak bo'lsa, keshlashni ishlatadi. Keyinchalik ko'chadan uchun, faqat belgilangan parametr bilan ma'lumotlar olinadi. Ushbu yondashuv ma'lumotlarni tezroq olish imkonini beradi, bu esa dasturlarning ish vaqtini qisqartiradi.
Ma'lumotlar bazasidagi foydalanuvchilarning umumiy sonini olishda usul ishlatilgan fetchColumn (). Ushbu usul bitta ustunning qiymatini olishga imkon beradi va miqdor, miqdor, maksimal yoki minimal qiymatlar kabi skalyar qiymatlarni olishda foydalidir.
Tegishli qadriyatlar va IN bayonoti
Ko'pincha, siz bilan ishlashni boshlaganingizda PDO, operator bilan bog'liq qiyinchiliklar paydo bo'ladi IN. Masalan, foydalanuvchi vergul bilan ajratilgan bir nechta nomlarni kiritdi deylik. Foydalanuvchi kiritish o'zgaruvchida saqlanadi $ nomlari.
Ma'lumotlar bazalari bilan ishlash uchun PDO - PHP Data Object kengaytmalarini o'rnatish va ulardan foydalanish
Sinov ma'lumotlar bazasi va jadvalini yaratish
Birinchidan, ushbu qo'llanma uchun ma'lumotlar bazasini yarating:
Quyosh_sistemasini tuzing; Quyosh sistemasida BARCHA XAVFSIZLIKLARNI GRANT. * "Testuser" @ "localhost" ga "testpassword" tomonidan identifikatsiya qilingan;
Testuser foydalanuvchi nomi va testpassword paroliga ega bo'lgan foydalanuvchiga quyosh_sistemasi ma'lumotlar bazasiga to'liq kirish huquqi berilgan.
Endi jadval tuzing va uni astronomik aniqligi nazarda tutilmagan ma'lumotlar bilan to'ldiring:
Quyoshdan foydalanish tizimi; TABLE sayyoralarini yarating (id TINYINT (1) NULL AVTO_INCREMENT, PRIMARY KEY (id), nomi VARCHAR (10) NULL emas, rangi VARCHAR (10) NULL emas); INSERT INTO sayyoralari (nomi, rangi) VALUES ("yer", "ko'k"), ("mars", "qizil"), ("jupiter", "g'alati");
Ulanish tavsifi
Endi ma'lumotlar bazasi yaratilgandan so'ng, biz DSN () - ma'lumotlar bazasiga ulanish uchun ma'lumot, mag'lubiyat sifatida taqdim etamiz. Ta'rif sintaksisi ishlatilgan ma'lumotlar bazasiga qarab farq qiladi. Masalan, biz MySQL / MariaDB bilan ishlaymiz, shuning uchun quyidagilarni ko'rsatamiz:
ma'lumotlar bazasi joylashgan xostning nomi;
port (agar standart 3306 port ishlatilsa, ixtiyoriy);
ma'lumotlar bazasi nomi
kodlash (ixtiyoriy).
Bu holda DSN liniyasi quyidagicha:
$ dsn \u003d "mysql: host \u003d localhost; port \u003d 3306; dbname \u003d sun_system; charset \u003d utf8";
Avval ma'lumotlar bazasi prefiksi keltirilgan. Masalan, mysql. Prefiks satrning qolgan qismidan yo'g'on nuqta bilan, so'ngra har bir parametr nuqta-vergul bilan ajratiladi.
PDO ob'ektini yaratish
Endi DSN satri tayyor bo'lgach, PDO yarating. Kirish konstruktori quyidagi parametrlarni qabul qiladi:
DSN liniyasi.
Ma'lumotlar bazasiga kirish huquqiga ega foydalanuvchining ismi.
Ushbu foydalanuvchi uchun parol.
Qo'shimcha parametrlarga ega bo'lgan qator (ixtiyoriy).
$ options \u003d [PDO :: ATTR_ERRMODE \u003d\u003e PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_DEFAULT_FETCH_MODE \u003d\u003e PDO :: FETCH_ASSOC]; $ pdo \u003d yangi PDO ($ dsn, "testuser", "testpassword", $ options);
Qo'shimcha parametrlarni, shuningdek, SetAttribute usuli yordamida ob'ektni yaratgandan keyin ham aniqlash mumkin:
$ pdo-\u003e SetAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
Odatiy tanlov usulini aniqlash
PDO :: DEFAULT_FETCH_MODE - standart namuna olish usulini belgilaydigan muhim parametr. Ko'rsatilgan usul so'rov bajarilishi natijasini olishda ishlatiladi.
PDO :: FETCH_BOTH
Standart rejim. Tanlov natijasi raqamlar (0 dan boshlab) va ustun nomlari bo'yicha indekslanadi:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT * FROM sayyoralari"); $ results \u003d $ stmt-\u003e yuklash (PDO :: FETCH_BOTH);
Ushbu rejim bilan so'rovni sayyora sinov jadvaliga kiritgandan so'ng, biz quyidagi natijaga erishamiz:
Array (\u003d\u003e 1 \u003d\u003e 1 \u003d\u003e er \u003d\u003e er \u003d\u003e ko'k \u003d\u003e ko'k)
PDO :: FETCH_ASSOC
Natija assotsiativ qatorda saqlanadi, unda kalit ustun nomi va qiymat mos keladigan satr qiymati:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT * FROM sayyoralari"); $ results \u003d $ stmt-\u003e yuklash (PDO :: FETCH_ASSOC);
Natijada, biz quyidagilarga ega bo'lamiz:
Array (\u003d\u003e 1 \u003d\u003e yer \u003d\u003e ko'k)
PDO :: FETCH_NUM
Ushbu rejimdan foydalanganda natija ustun raqamlari bilan indekslangan massiv shaklida taqdim etiladi (0 dan boshlab):
Array (\u003d\u003e 1 \u003d\u003e yer \u003d\u003e ko'k)
PDO :: FETCH_COLUMN
Agar siz bitta o'lchovli qator shaklida bitta maydonning qiymatlari ro'yxatini olishingiz kerak bo'lsa, ushbu raqam foydali bo'lishi mumkin, ularning raqamlanishi 0 bilan boshlanadi. Masalan:
$ stmt \u003d $ pdo-\u003e so'rov ("sayyoralarni TANLASH");
Natijada, biz quyidagilarga ega bo'lamiz:
Array (\u003d\u003e yer \u003d\u003e mars \u003d\u003e yupiter)
PDO :: FETCH_KEY_PAIR
Agar ikkita assotsiatsiyalashgan qator ko'rinishidagi qiymatlarning ro'yxatini olishni istasangiz, biz ushbu parametrdan foydalanamiz. Massiv tugmachalari - bu birinchi ustunning ma'lumotlari, massiv qiymatlari ikkinchi ustunning ma'lumotlari. Masalan:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT nomi, FROM sayyoralari rangi"); $ result \u003d $ stmt-\u003e fetchAll (PDO :: FETCH_KEY_PAIR);
Natijada, biz quyidagilarga ega bo'lamiz:
Array (\u003d\u003e ko'k \u003d\u003e qizil \u003d\u003e g'alati)
PDO :: FETCH_OBJECT
PDO :: FETCH_OBJECT-dan foydalanishda, olinadigan har bir satr uchun noma'lum ob'ekt yaratiladi. Uning umumiy xususiyatlari namuna ustunlarining nomlari bo'lib, so'rov natijalari ularning qiymatlari sifatida ishlatiladi:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT nomi, FROM sayyoralari rangi"); $ results \u003d $ stmt-\u003e yuklash (PDO :: FETCH_OBJ);
Natijada, biz quyidagilarga ega bo'lamiz:
StdClass ob'ekti (\u003d\u003e yer \u003d\u003e ko'k)
PDO :: FETCH_CLASS
Bu holda, avvalgidek, ustun qiymatlari ob'ektning xususiyatlariga aylanadi. Biroq, siz ob'ektni yaratishda ishlatiladigan mavjud sinfni ko'rsatishingiz kerak. Buni misol sifatida ko'rib chiqing. Birinchidan, sinf yarating:
Klassik sayyora (xususiy $ nom; xususiy $ rang; umumiy funktsiya to'plamiName ($ planet_name) ($ this-\u003e name \u003d $ planet_name;) jamoat funktsiyasi setColor ($ planet_color) ($ this-\u003e color \u003d $ planet_color;) jamoat funktsiyasi getName () (return $ this-\u003e name;) umumiy funktsiyasi getColor () (return this this\u003e\u003e color;))
E'tibor bering, Planet klassi xususiy xususiyatlarga ega va hech qanday konstruktor yo'q. Endi so'rovni bajaring.
Agar siz olish usuli PDO :: FETCH_CLASS-dan foydalanayotgan bo'lsangiz, ma'lumotlar uchun so'rov yuborishdan oldin setFetchMode usulidan foydalanishingiz kerak:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT nomi, FROM sayyoralari rangi"); $ stmt-\u003e setFetchMode (PDO :: FETCH_CLASS, "Planet");
SetFetchMode usuliga o'tadigan birinchi parametr bu doimiy PDO :: FETCH_CLASS. Ikkinchi parametr - ob'ektni yaratishda foydalaniladigan sinf nomi. Endi qiling:
$ sayyora \u003d $ stmt-\u003e olish (); var_dump ($ sayyora);
Natijada, biz Planet ob'ektini olamiz:
Sayyora obyekti (\u003d\u003e yer \u003d\u003e ko'k)
So'rov natijasida olingan qiymatlar ob'ektning tegishli xususiyatlariga, hatto yopiq bo'lgan narsalarga ham beriladi.
Konstruktor bajarilgandan keyin xususiyatlarni aniqlash
Planet sinfida aniq konstruktor yo'q, shuning uchun xususiyatlarni tayinlashda muammolar bo'lmaydi. Agar sinfda mulk tayinlangan yoki o'zgartirilgan konstruktor bo'lsa, ular ustiga yoziladi.
FETCH_PROPS_LATE doimiy qiymatidan foydalanganda, konstruktor bajarilgandan keyin mulk qiymatlari belgilanadi:
Class Planet (xususiy $ nom; xususiy $ rang; jamoat funktsiyasi __construct ($ name \u003d oy, $ color \u003d kul) ($ this-\u003e name \u003d $ name; $ this-\u003e color \u003d $ color;) public function setName ($ planet_name) ($ this-\u003e name \u003d $ planet_name;) jamoat funktsiyasi setColor ($ planet-\u003e color \u003d $ planet_color;) jamoat funktsiyasi getName () (qaytarish $ this-\u003e name;) jamoat funktsiyasi getColor () (qaytish $ this-\u003e color;))
Biz kirishda ikkita argumentni oladigan konstruktorni qo'shish orqali Planet sinfini o'zgartirdik: ism (ism) va rang (rang). Ushbu maydonlarning odatiy qiymatlari mos ravishda oy (oy) va kul (kul).
Agar siz ob'ekt yaratishda FETCH_PROPS_LATE-dan foydalanmasangiz, xususiyatlar standart qiymatlar ustiga yoziladi. Buni tekshiring. Birinchidan, so'rovni bajaring:
$ stmt \u003d $ pdo-\u003e so'rov ("SELECT nomi, rangi FROM_ quyosh sistemasi WHERE nomi \u003d" yer "); $ stmt-\u003e setFetchMode (PDO :: FETCH_CLASS, "Planet"); $ sayyora \u003d $ stmt-\u003e olish (); var_dump ($ sayyora);
Natijada, biz quyidagilarga ega bo'lamiz:
Ob'ekt (sayyora) # 2 (2) (["nomi": "Planet": shaxsiy] \u003d\u003e satr (4) "oy" ["rang": "sayyora": xususiy] \u003d\u003e satr (4) "kulrang» )
Kutilganidek, ma'lumotlar bazasidan olingan qiymatlar qayta yoziladi. Endi FETCH_PROPS_LATE (shunga o'xshash so'rov) yordamida muammoning echimini ko'rib chiqing:
$ stmt-\u003e setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Planet"); $ sayyora \u003d $ stmt-\u003e olish (); var_dump ($ sayyora);
Natijada, biz kerakli narsalarni olamiz:
Ob'ekt (sayyora) # 4 (2) (["nomi": "Planet": xususiy] \u003d\u003e satr (5) "yer" ["rang": "sayyora": xususiy] \u003d\u003e satr (4) "ko'k" )
Agar sinf konstruktorida standart qiymatlar mavjud bo'lmasa, lekin ular kerak bo'lsa, konstruktor parametrlari setFetchMode usuli qator bilan uchinchi dalil bilan chaqirilganda o'rnatiladi. Masalan:
Class Planet (xususiy $ nom; xususiy $ rang; jamoat funktsiyasi __construct ($ name, $ color) ($ this-\u003e name \u003d $ name; $ this-\u003e color \u003d $ color;) [...])
Konstruktorning dalillari talab qilinadi, shuning uchun biz quyidagilarni bajaramiz.
$ stmt-\u003e setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, "Planet", ["oy", "kulrang"]);
Kirish parametrlari, shuningdek, ishga tushirish uchun zarur bo'lgan standart qiymatlar sifatida ishlaydi. Kelgusida ular ma'lumotlar bazasidagi qiymatlar ustiga yoziladi.
Bir nechta ob'ektlarni olish
Bir nechta natijalar, vaqt oralig'ida olish usuli yordamida ob'ekt sifatida olinadi:
While ($ planet \u003d $ stmt-\u003e olish ()) (// natijalarni qayta ishlash)
Yoki birdaniga barcha natijalarni tanlab. Ikkinchi holda, fetchAll usuli qo'llaniladi va qo'ng'iroq paytida rejim belgilanadi:
$ stmt-\u003e fetchAll (PDO :: FETCH_CLASS | PDO_FETCH_PROPS_LATE, "Planet", ["oy", "kulrang"]);
PDO :: FETCH_INTO
Ushbu tanlov variantini tanlashda PDO yangi ob'ektni yaratmaydi, lekin mavjud ob'ektning xususiyatlarini yangilaydi. Biroq, bu faqat jamoat mulki uchun yoki ob'ektda __set sehrli usulidan foydalanganda mumkin.
Tayyor va to'g'ridan-to'g'ri so'rovlar
PDO so'rovlarni bajarishda ikkita usulga ega:
bir bosqichdan iborat to'g'ri chiziq;
tayyorlangan, bu ikki bosqichdan iborat.
To'g'ridan-to'g'ri so'rovlar
To'g'ridan-to'g'ri so'rovlarni qilishning ikkita usuli mavjud:
so'rov SELECT kabi o'zgartirish kiritmaydigan iboralar uchun ishlatiladi. So'rov natijalari fetch yoki fetchAll usullari yordamida olinadigan PDOStatemnt ob'ektini qaytaradi;
exec INSERT, DELETE yoki UPDATE kabi iboralar uchun ishlatiladi. Talab bo'yicha ishlov berilgan qatorlar sonini qaytaradi.
To'g'ridan-to'g'ri operatorlar faqat so'rovda hech qanday o'zgaruvchilar bo'lmaganda va so'rovning xavfsiz va to'g'ri qochib ketganligiga ishonch bo'lsa, foydalaniladi.
Tayyorlangan so'rovlar
PDO dasturni himoya qilish uchun foydali bo'lgan tayyorlangan bayonotlarni qo'llab-quvvatlaydi: tayyorlash usuli kerakli qochishlarni amalga oshiradi.
Bir misolni ko'rib chiqaylik. Siz "Planetlar" jadvaliga "Planet" ob'ektining xususiyatlarini joylashtirmoqchisiz. Avval so'rovni tayyorlang:
$ stmt \u003d $ pdo-\u003e tayyorgarlik ("INSERT INTO sayyoralari (nomi, rangi) VALUES (?,?)");
Biz SQL so'rovini argument sifatida soxta o'zgaruvchilar bilan to'ldiradigan tayyorlash usulidan foydalanamiz. Soxta o'zgaruvchilar ikki xil bo'lishi mumkin: nomlanmagan va nomlangan.
Nomlanmagan soxta o'zgaruvchilar
Nomlanmagan joylashuv to'ldiruvchilar bilan belgilanadimi? . Natijada so'rov ixcham, ammo siz bir xil tartibda joylashtirilgan almashtirish uchun qiymatlarni berishingiz kerak. Ular bajarilish usuli bilan massiv sifatida uzatiladi:
$ stmt-\u003e bajaring ([$ sayyora-\u003e nomi, $ sayyora-\u003e rang]);
Nomlangan soxta o'zgaruvchilar
Nomlangan to'ldiruvchilardan foydalanganda, qiymatlarni almashtirish uchun berilgan tartib muhim emas, ammo bu holda kod kamroq ixcham bo'ladi. Ma'lumotlar ijro usuliga assotsiativ qator shaklida uzatiladi, unda har bir kalit soxta o'zgaruvchiga mos keladi va massiv qiymati so'rovda o'zgartirilishi kerak bo'lgan qiymatga mos keladi. Oldingi misolni takrorlang:
$ stmt \u003d $ pdo-\u003e tayyorgarlik ("INSERT INTO sayyoralari (nomi, rangi) VALUES (: nomi,: rangi"); $ stmt-\u003e bajaring (["nomi" \u003d\u003e $ sayyora-\u003e nomi, "rang" \u003d\u003e $ sayyora-\u003e rang]);
Tayyorlash va bajarish usullari o'zgartirish so'rovlarini bajarishda ham, olish paytida ham qo'llaniladi.
Va rowCount usuli, agar kerak bo'lsa, qayta ishlangan qatorlar soni to'g'risida ma'lumot beradi.
PDO xatolarini boshqarish
PDO :: ATTR_ERRMODE xato rejimini tanlash parametri xatolar bo'lsa PDO xatti-harakatlarini aniqlash uchun ishlatiladi. Uch variant mavjud: PDO :: ERRMODE_SILENT, PDO :: ERRMODE_EXCEPTION va PDO :: ERRMODE_WARNING.
PDO :: ERRMODE_SILENT
Odatiy variant. PDO shunchaki xato ma'lumotlarini yozib oladi, bu esa errorCode va errorInfo usullari sizga yordam beradi
PDO: ERRMODE_EXCEPTION
Bu afzal qilingan variant bo'lib, unda xato ma'lumotiga qo'shimcha ravishda, PDO istisno qiladi (PDOException). Istisno PDO operatsiyalaridan foydalanganda foydali bo'lgan skriptning bajarilishini to'xtatadi. Bitimlarni tavsiflashda misol keltirilgan.
PDO :: ERRMODE_WARNING
Bunday holda, PDO xato to'g'risidagi ma'lumotlarni ham qayd etadi. Skriptni ijro etish oqimi uzilmaydi, ammo ogohlantirishlar beriladi.
BindValue va bindParam usullari
Shuningdek, so'rovda qiymatlarni almashtirish uchun bindValue va bindParam usullaridan foydalanishingiz mumkin. Birinchisi, o'zgaruvchining qiymatini so'rovni tayyorlashda ishlatilgan soxta o'zgaruvchiga bog'laydi:
$ stmt \u003d $ pdo-\u003e tayyorgarlik ("INSERT INTO sayyoralari (nomi, rangi) VALUES (: nomi,: rangi"); $ stmt-\u003e bindValue ("nom", $ sayyora-\u003e nomi, PDO :: PARAM_STR);
$ Planeta-\u003e o'zgaruvchisining qiymatini soxta o'zgaruvchi bilan bog'lashdi: name. E'tibor bering, bindValue va bindParam usullaridan foydalanilganda, o'zgaruvchining turi mos keladigan PDO konstantalarini ishlatgan holda uchinchi dalil sifatida ko'rsatiladi. Masalan, PDO :: PARAM_STR.
BindParam usuli o'zgaruvchini soxta o'zgaruvchiga bog'laydi. Bunday holda, o'zgaruvchi soxta o'zgaruvchi mos yozuvlar bilan bog'lanadi va qiymat so'rovga faqat ijro etish usuli chaqirilgandan keyin o'zgartiriladi. Bir misolni ko'rib chiqing:
$ stmt-\u003e bindParam ("nom", $ sayyora-\u003e nomi, PDO :: PARAM_STR);
PDOdagi operatsiyalar
G'ayrioddiy misolni tasavvur qiling. Foydalanuvchi sayyoralar ro'yxatini tanlashi kerak va har safar so'rov bajarilganda, joriy ma'lumotlar bazadan o'chiriladi, so'ngra yangilari kiritiladi. Agar o'chirishdan keyin xato yuzaga kelsa, keyingi foydalanuvchi bo'sh ro'yxatni oladi. Bunga yo'l qo'ymaslik uchun biz tranzaktsiyalardan foydalanamiz:
$ pdo-\u003e beginTransaction (); urinib ko'ring ($ stmt1 \u003d $ pdo-\u003e exec ("sayyoralarni o'chirish"); $ stmt2 \u003d $ pdo-\u003e tayyorlang ("INSERT INTO sayyoralariga (nomi, rangi) VALUES (?,?)"); $ sayyora) ($ stmt2-\u003e bajaring ([$ planet-\u003e getName (), $ planet-\u003e getColor ()]);) $ pdo-\u003e task ();) catch (PDOException $ e) ($ pdo-\u003e) rollBack ();)
StartTransaction usuli so'rovlarning avtomatik bajarilishini o'chiradi va sinash tuzilishida so'rovlar to'g'ri tartibda bajariladi. Agar PDOException tashlanmasa, so'rovlar o'tkazish usuli yordamida bajariladi. Aks holda, ular orqaga qaytarish usuli yordamida orqaga qaytariladi va so'rovlarning avtomatik bajarilishi tiklanadi.
Shunday qilib, so'rovlarni bajarishning izchilligi paydo bo'ldi. Shubhasiz, buning uchun PDO :: ATTR_ERRMODE PDO :: ERRMODE_EXCEPTION ga o'rnatilishi kerak.
Xulosa
Endi PDO bilan ishlash tavsiflangan, biz uning asosiy afzalliklarini ta'kidlaymiz:
pDO bilan dasturni boshqa ma'lumotlar bazasiga o'tkazish juda oson;
barcha mashhur ma'lumotlar bazalari ma'lumotlar bazalari qo'llab-quvvatlanadi;
o'rnatilgan xatolarni boshqarish tizimi;
namuna natijalarini taqdim etishning turli xil variantlari;
tayyorlangan so'rovlar qo'llab-quvvatlanadi, ular kodni kamaytiradi va uni SQL in'ektsiyasiga chidamli qiladi;
parallel foydalanuvchilarda ma'lumotlar yaxlitligini va so'rovlarning izchilligini saqlashga yordam beradigan qo'llab-quvvatlanadigan operatsiyalar.
Do'stlaringiz bilan baham: |