Loading

آموزش pdo در php و mysql

۲۸ شهریور, ۱۳۹۷| تاپ تمپ
آموزش PHP PDO

آموزش pdo در php و mysql

PDO کوتاه‌شده‌ی عبارت «PHP Data Objects» به معنی اشیای اطلاعاتی پی‌اچ‌پی است. PDO جدیدترین روش ارتباط با پایگاه داده از انواع مختلف به شمار می‌رود. با استفاده از PDO می‌توان به بیش از ۱۰ پایگاه داده‌ی مختلف از جمله MySQL، SQLite ، Firebird و SQL Server متصل شد.

علاوه بر این PDO قابل توسعه است و با ایجاد و نصب افزونه‌های جدید، امکان اتصال آن به انواع سیستم‌های ذخیره‌سازی اطلاعاتی فراهم است.

چرا از PDO استفاده می‌کنیم؟

در گذشته و در هنگام طراحی سایت با php دو روش برای ارتباط با پایگاه داده وجود داشته است. روش نخست و قدیمی‌تر دستوراتی هستند که با mysql پیشوند شده‌اند و دستوراتی که اندکی جدیدتر هستند، دستوراتی هستند که با عبارت mysqli شروع می‌شوند.

این دو سیستم هر یک مزایا و معایبی داشتند. با توجه حرکت اغلب زبان‌های برنامه‌نویسی به سمت سیستم‌هاش شیئ گرا، و نیاز به رابطی که بتواند با انواع مختلف پایگاه‌های داده ارتباط برقرار کند، PDO طراحی و در نگارش‌های جدید php به صورت پیش‌فرض قرار گرفت.

PDO بر خلاف دو روش قبلی، تنها با استفاده از سیستم شیئ‌گرایی قابل استفاده است. و مانند mysql و mysqli توابعی برای خواندن و نوشتن اطلاعات از پایگاه داده در اختیار برنامه‌نویسان قرار نمی‌دهد.

از خصوصیات مهمش میشه به پشتیبانی از دیتابیسهای متنوع از جمله MySQL، MsSQL، SQLite و غیره با توابع ثابت.

امکان فوق العاده PDO که اجازه میده تا بدون تغییر کدها، دیتابیس رو تغییر بدیم. یعنی مثلا اگر Applicationای با MySQL ساخته باشیم و تحت شرایطی مجبور به تغییر دیتابیس به MsSQL باشیم، اگر سینتکس کوئری ها مشکلی ایجاد نکنه، کافیه دیتابیس رو تعویض کنیم و همین. برای سیستمهای بزرگ این یک مزیت خیلی مهمه.پشتیبانی از Exceptionهای PHP هم میتونه مزیت مهمی باشه

Exceptionها امکان کنترل و بدست گیری خطاها رو به برنامه نویس میده.

PDO امکان کنترل خطاهای دیتابیس رو هم بهمون میده.

پشتیبانی از Prepared Statement و Stored Procedure ها و Multiple Recordset.و میتونیم به طراحی شده به شکل کلاس نیز اشاره کرد.

قابلیت مهمی که امکان گسترش و شخصی سازی PDO رو میده مثلا رفتار توابعش رو تغییر بدیم یا توابع جدیدی بهش اضافه کنیم و در واقع همه امکانات شی گرایی رو باهاش داشته باشیم.

PDO از سه تا کلاس تشکیل شده:

کلاس اصلی به نام PDO که حاوی توابع اصلی مثل اجرای کوئری و اتصال و غیره است.

کلاس با نام PDOStatement حاوی توابع برای پردازش و بهره گیری از کوئری های اجرا شده است مثل fetch.

کلاس PDOException برای بدست گیری خطاهای رخ داده.

نحوه اتصال به دیتابیس MySQL با استفاده از PDO

برای اتصال به پایگاه داده میتونیم به شیوه ی زیر عمل کنیم , به دستورات زیر دقت کنید:

 

$db = new PDO(“mysql:host=$host;dbname=$dbname”, $user, $pass);

متغییر   db$ به عنوان یک متغییر برای ذخیره‌ی اطلاعات دیتابیس و کنترل کردن ‌آنها به حساب می‌آید که همواره نام آن می‌تواند ثابت باشد.

عبارت mysql نوع پایگاه داده را مشخص کرده است که برای هر پایگاه داده، منحصر به فرد است. مثلا sqlserver, oracle و …

دستورهای host = $host; dbname = $dbname, $user, $pass به عنوان یک رشته برای اتصال به پایگاه داده استفاده می‌شوند.

در ادامه چند مثال از پایگاه داده‌های مختلف را  ارائه می‌دهیم:

 

کد کامل اتصال به MySql

 

این از ایجاد ارتباط… در این اتصال ما از بانک اطلاعات mysql استفاده کردیم و مشخصات این اطلاعات رو وارد کردیم.
اما برای اجرای دستورات باید از توابع اینکار استفاده کرد. اولین تابع مورد استفاده در این متد تابع query است. استفاده از این تابع باعث برگرداندن یک شی از کلاس PDOStatement می شود.

 

 

در اینجا متغیر stmt همان متغیری است که در کلاس PDOStatement قرار دارد. اما پس از گرفتن اطلاعات از جداول نیاز به fetch کردن آنها برای استفاده است. برای اینکار از تابع fetch()استفاده می کنیم:

 

دست برنامه نویس در این متد باز است و می تواند آرایه خودش رو به شیوه های معمول مرتب کنه:

در اینجا تابع آخر کار اضاف تری رو نسبت به بقیه توابع انجام می ده و اونم اینه که آرایه بدست آمده از این تابع اطلاعات سطرهای بوجود آمده و مقدار حافظه استفاده شده را نیز آزاد میکند.

لازم است پس از fetch کردن، شی را پاک کنیم….برای اینکار می توانیم از دستورات زیر کمک بگیریم:

$stmt = null;

این دستور مقدار تهی را به متغیر حاوی کلاس می دهد و باعث تهی شدن این متغیر می شود.

این دستور باعث تخلیه حافظه اختصاص داده شده به این متغیر که حاوی کلاس PDOStatement می شود..

 

تنظیمات خصوصیات دیتابیس

با استفاده از متد setAttribute میتوانید خصوصیات مورد نظر خود را تنظیم کنید،

این که روش خوبی هست که قبل از کار با دیتابیس خصوصیات رو تنظیم کنید

در اینجا به چند خصوصیت مهم می پردازم:

PDO::ATTR_ERRMODE

با این خصوصیت تعیین میکنید در هنگام مواجه با ارور در اجرای دستورات ، PDO چگونه برخورد کند

مقادیر این خصوصیت

PDO::ERRMODE_SILENT ( پیش فرض )

با این مقدار تنها اررور در متغیر pdo ذخیره میشود و هیچ عمل دیگری صورت نمیگیرد.

PDO::ERRMODE_WARNING

با این مقدار pdo یک هشدار ایجاد میکند که بر حسب کانفیگ شما ، به کاربر نمایش داده میشود یا در فایل ذخیره میشود یا اصلا ذخیره نمیشود.

PDO::ERRMODE_EXCEPTION

با استفاده از این مقدار در صورت برخورد با اررور throw رخ میدهد

دقت کنید برای استفاده از این خصوصیت باید از try catch استفاده کنید.

 

یک مثال برای ست کردن و PDO::ERRMODE_EXCEPTION

 

PDO::ATTR_DEFAULT_FETCH_MODE

با استفاده از این خصوصیت نحوه fetch (خروجی یک ردیف ) را معین میکنید

مقدایر به صورت زیر است:

PDO::FETCH_ASSOC

خروجی یک ارایه با اندیس های نام فیلد ها می باشد ( اگر دارای فیلد name باشد مقدار به صورت [‘name’] قابل دسترسی هست )

 

PDO::FETCH_BOUND

یک نوع خاصی از خروجی هست که نیازمند درس های اینده هست، و تا اون موقع بدون توضیح رها میشود.

 

PDO::FETCH_CLASS

یک نوع خاصی از خروجی هست که نیازمند درس های اینده هست، و تا اون موقع بدون توضیح رها میشود.

PDO::FETCH_NUM

خروجی یک ارایه با اندیس های شماره می باشد ( اگر اولین فیلد name باشد مقدار به صورت [۰] قابل دسترسی هست )

 

PDO::FETCH_BOTH

تلفیقی از FETCH_ASSOC و FETCH_NUM

PDO::FETCH_OBJ

خروجی به صورت شی خواهد بود ( اگر در خروجی فیلد name باشد و متغیر row$ باشد، مقدار فیلد با row->name$ قابل دسترس خواهد بود )

 

PDO::ATTR_EMULATE_PREPARES

اکثر دیتابیس های جدید از prepare پشتیبانی میکنند ولی ورژن های قدیمی پشتیبانی نمیکنند، هنگامی که این مقدار true باشد pdo عملیات prepare را شبیه سازی میکند،

با این وجود توصیه میشود همیشه این مقدار را خاموش کنید ، چرا که pdo در ورژن جدید php قرار داده شده هست و مسلما هنگامی که ورژن php این هست ورژن دیتابیس هم پشتیبانی خواهد کرد

نمونه کد برای تغییر خصوصیات

 

اگر شما بخواهید مقدار برگشتی را fetch کنید.. در یک زمان نمی شود دو کوئری را fetch کرد و اگر اینکار را انجام دهیم تابع هیچ مقداری را صادر نمی کند…

راه حل تعبیه شده در این کلاس استفاده از تابع fetchall است:

 

 

این کار باعث میشود که ما دیگه از یک تابع برای دو پردازش استفاده نکنیم و تابع fetch همزمان در دو درخواست مورد پردازش قرار نمی گیرد و این پردازش بین تابع fetch و fetchAll تقسیم میشود…

 

تابع بعد که یک تابع مفید برای برنامه نویسی است تابع PDOStatement::fetchColumn است. این تابع مقدار یک ستون را بر می گرداند… اگر نام ستون برای تابع تعریف شود که همان ستون برگردانده می شود در غیر این صورت اولین ستون بر می گردد:

 

توابع مورد استفاده

در کار با بانک های اطلاعاتی توابع مفید دیگری مانند rowcount(), nextrowsert() نیز هستند که آنها را بررسی می کنیم…

تابع rowcount() : این تابع زمانی مورد استفاده قرار می گیرد که بخواهیم تعداد ردیف های داده شده را بدست آوریم. این تابع مانند تابع mysql_num_rows  عمل می کند.

تابع nextrowset() : ین تابع هنگامی کاربرد دارد که کوئری ما تعدادی سطر را برگرادند.

تابع مفید دیگری که برای اجرای درخواست های ما بکار می رود تابع exec می باشد. این تابع نیز همانند تابع query می باشد اما از تابع query  سریعتر عمل می کند همچنین این تابع خروجی به ما نمی دهد و برای موقعی که نیاز به fetch کردن نداریم بهتر است:

 

در اینجا یک تابع بسیار مفید و پر کاربرد داریم که برای اجرای دستورات استفاده می شود.

گرفتن اخرین ای دی ذخیره شده در دیتابیس

تعداد ردیف های تحت تاثیر قرار گرفته

اگر از exec استفاده کردید متد exec تعداد را بر میگرداند

اگر از prepare و query استفاده کردید متد rowCount از PDOStatement تعداد را بر میگرداند.

 تابع prepare :
پردازش و اجرای کوئری
بررسی دستورات ورودی برای جلوگیری از حملات sql injectionرا انجام می دهد.
برای کار با تابع نیازز نیست که دستورات را به دفعات بنویسیم فقط کافی است یکبار دستور مورد نظر را وارد کنیم سپس به هر تعداد که نیاز باشد آن را اجرا نماییم. این تابع یک شی برمی گرداند که منتظر اجراست!

 

در این درخواست پارامتر ها با “:” مشخص شده اند و برای تعیین این پارامتر ها از دو تابع زیر استفاده می کنیم:

PDOStatement::bindParam

PDOStatement::bindValue

 

اکنون فقط کافی است که این درخواست را اجرا کنیم:

 

اگر بخواهیم این کوئری را با سرعت بالا و به دفعات اجرا کنیم به صورت زیر عمل می کنیم:

 

بجای اینکار نیز می توانیم query را در حلقه تکرار بکار ببریم که این مورد سرعت پردازش را بسیار کند می کند…

تابع بعد که مورد استفاده قرار می گیرد به خصوص برای چک کردن ورودی ها است تابع PDOStatement::bindParam می باشد که دقیقا مانند تابع قبل عمل می کند. تنها تفاوتی که می توان بین این دو تابع قائل شد این است که تابع PDOStatement::bindParam متغیر هایی که دریافت می کند مهم نیست که ایجاد شده باشد یا خیر…

کد زیر رو دقت کنید:

همانطور که مشاهده می کنید در این مثال هنوز متغیر $name مقدار دهی نشده تا قبل از bind شدن و بعد از آن اجرا شده که این قضیه تفاوت رو کامل نشون می ده…

برای مقدار دهی به توابع در این کلاس روش دیگری نیز هست که کافی است از علامت سوال استفاده کنید و بعد برای bind کردن به ترتیب از شماره برای مقدار دهی استفاده می کنیم:

حال برای مقدار دهی به صورت زیر عمل می کنیم:

 

علاوه بر روشهای فوق برای bind کردن به طور مستقیم از تابع PDOStatement::execute نیز می توان استفاده کرد که باید از آرایه برای این کار استفاده کرد:

در این مثال همانطور که دید برای اجرا ما کلید مقدار ها رو برابر هم قرار دادیم.

برای سازگاری کانکشن با فارسی باید از کد زیر استفاده کنیم :

 

 

اتصال به دیتابیس / Connection to MySQL

 

بازدید: 52

دسته‌ها: آموزش, آموزش PDO, آموزش PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Rating*

پشتیبانی و سفارش