"> آموزش استفاده از PDO در زبان برنامه نویسی تحت وب php

آموزش استفاده از PDO در زبان برنامه نویسی تحت وب php

آموزش استفاده از PDO

با آموزش استفاده از pdo با شما هستم چند وقت پیش مطلبی در باره ساخت صفحه عضویت در php منتشر کردیم که خیلی از دوستان در مورده نحوه ارتباط سوالاتی را مطرح کردن که چرا از pdo استفاده نشده و همچنان از تکنولوژی قدیمی استفاده میکنیم در این مطلب قصد دارم با pdo آشناتون کنم و ببنیم چطور میشه ازش در php استفاده کرد.PDO یک افزونه سبک و قدرتمند PHP برای به دیتابیسه . از خصوصیات مهمش میشه به پشتیبانی از دیتابیسهای متنوع از جمله MySQL، MsSQL، SQLite و غیره با توابع ثابت.امکان فوق العاده PDO که اجازه میده تا بدون تغییر کدها، دیتابیس رو تغییر بدیم. یعنی مثلا اگر Applicationای با MySQL ساخته باشیم و تحت شرایطی مجبور به تغییر دیتابیس به MsSQL باشیم، اگر سینتکس کوئری ها مشکلی ایجاد نکنه، کافیه دیتابیس رو تعویض کنیم و همین. برای سیستمهای بزرگ این یک مزیت خیلی مهمه.پشتیبانی از Exceptionهای PHP هم میتونه مزیت مهمی باشه
Exceptionها امکان کنترل و بدست گیری خطاها رو به برنامه نویس میده. PDO امکان کنترل خطاهای دیتابیس رو هم بهمون میده.
پشتیبانی از Prepared Statement و Stored Procedure ها و Multiple Recordset.و میتونیم به طراحی شده به شکل کلاس نیز اشاره کرد.

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

  • PDO از سه تا کلاس تشکیل شده:
  • کلاس اصلی به نام PDO که حاوی توابع اصلی مثل اجرای کوئری و اتصال و غیره است.
  • کلاس با نام PDOStatement حاوی توابع برای پردازش و بهره گیری از کوئری های اجرا شده است مثل fetch.
  • کلاس PDOException برای بدست گیری خطاهای رخ داده.

نحوه اتصال

 $pdo = new PDO('mysql:dbname=mydatabase;host=localhost', 'db_username', 'db_password');

با اینکار ما به دیتابیس مورد نظرمون متصل شدیم. پارامتر اول فرمت خاصی داره. همونجور که میبینی در پارامتر اول، ما نوع دیتابیس که MySQL هست رو هم مشخص کردیم. برای قطع اتصال هم کافیه این شی رو از بین ببریم. اینجوری:

 $pdo = null;

 اجرای کوئری

با سه نوع تابع میشه یک کوئری رو اجرا کرد.
کوئری های آماده یا ساده توسط تابع PDO::query اجرا میشند و یک شی از کلاس PDOStatement برمیگردونند.

 $stmt = $pdo->query("SELECT id, name, age FROM users");

متغیر stmt$ یک نمونه کلاس PDOStatement هست که توابع خودش رو داره. میخوایم این کوئری رو Fetch کنیم. برای اینکار چند مدل تابع وجود داره. تابع PDOStatement::fetch که در حالت پیشفرض مشابه تابع mysql_fetch_arrayعمل میکنه.

 $row = $stmt->fetch();
echo "Name: ".$row['name'];
echo "Name: ".$row[1];
echo "Age: ".$row['age'];
echo "Age: ".$row[2];

توسط پارامتر میشه به این تابع فهموند که چه مدلی آرایه ای تولید کنه:

 $assoc_row = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Name: ".$assoc_row['name'];
echo "Age: ".$assoc_row['age'];

$num_row = $stmt->fetch(PDO::PDO::FETCH_NUM);
echo "Name: ".$num_row[1];
echo "Age: ".$num_row[2];

$obj_row = $stmt->fetch(PDO::PDO::FETCH_OBJ);
echo "Name: ".$obj_row->name;
echo "Age: ".$obj_row->age;

تابع PDOStatement::fetchAll مشابه تابع قبل عمل میکنه ولی یک آرایه برمیگردونه از سطرهای بدست اومده به اضافه اینکه حافظه ی اشغال شده برای کوئری (داخل PDO) رو هم آزاد میکنه.

 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row) {
    echo "Name: ".$row['name'];
    echo "Age: ".$row['age'];

مشکلی که PDO داره اینه که نمیشه هنگام fetch شدن یک کوئری، کوئری دیگه ای رو fetch کرد! یعنی تابع fetch دوم کد زیر هیچی برنمیگردونه:

 $select = $pdo->query("SELECT id,name FROM parents");
while($parent = $select->fetch(PDO::FETCH_ASSOC)) {
    // ...
    $stmt = $pdo->query("SELECT name FROM children WHERE parent=$parent[id]");
    $child = $stmt->fetch(PDO::FETCH_ASSOC);
    echo "Child is ".$child['name']; // Output: "Child is "
    // ...

توابع مهم دیگه شی PDOStatement تا اینجا تابع rowCount و nextRowset هستند.اولی مثل mysql_num_rows تعداد سطرهای بدست اومده رو میده و دومی وقتی بکار میاد که کوئری بجای یک دسته سطر، چند دسته سطر رو برگردونه. این حالت توی Stored Procedureها رخ میده که من بتونم با یک کوئری چند مدل RecordSet یا دسته سطر داشته باشم. این تابع در MySQL فعلا کار خاصی نمی کنه!

حالت دوم اجرای کوئری ها، مواقعی است که مقدار برگشتی نداریم مثل عملیات INSERT یا DELETE و غیره. تابع PDO::exec مثل PDO::query ، کوئری اجرا میکنه ولی فقط تعداد سطرهایی رو برمیگردونه که تحت تاثیر قرار گرفته اند. حسن این تابع اینه که از تابع PDO::query سریعتره.

 $num = $pdo->exec("UPDATE users SET level=1 WHERE age<19");
echo $num ." user(s) were changed";

زمانی که لازم داریم تا یک کوئری رو بر اساس مقادیری به دفعات اجرا کنیم، حالت عادی بهینه نیست. PDO امکان میده تا کوئری رو با پارامترهای مشخص ابتدا معرفی کنیم تا در دیتابیس پردازش بشه و بعد هر تعداد که میخوام اجراش کنیم. تابع PDO::prepare این کار رو میکنه و مثل PDO::query یک شی PDOStatement برمیگردونه که هنوز کامل اجرا نشده:

 $stmt = $pdo->prepare("SELECT * FROM users WHERE id=:id");

pdo بسیار گسترده و بسیار ساده است فقط چند مورد تونستم براتون مثال بزنم خوشحال میشم اگر موردی جا افتاده و یا کم کاری کردم در همین مطلب قرار بدید.موفق باشید 🙂

  • پسورد: www.mspsoft.com
محبوبه میرزائی

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    ehsan پاسخ

    جالب بود تشکر خانم میرزائی

    مریم پاسخ

    ممنون عالیه واقعا

    از مدیران سایت تشکر میکنم

      محبوبه میرزائی پاسخ

      ممنون مریم خانم لطف دارید !

    طراحی سایت پاسخ

    مطالب سایت عالی و مفیدن موفق باشید

      مهندس قربانی پاسخ

      قربانه شما موفق باشید

    امیر پاسخ

    با سلام و تشکر بخاط سایت خوبتون
    می خواستم برای آموزش PHP سایت w3schools رو معرفی کنم، این سایت یکی از سایت های بسیار موفق انگلیسی زبان هست ... .

    بهمن پاسخ

    در مورد استفاده از PDP برای کاراکتر های فارسی
    چیزی ننوشتید.
    من از این دستور استفاده می کنم اما همچنان علامت سوال بر می گردونه
    $this->objDb->exec("SET CHARACTER SET utf8");

      مهندس قربانی پاسخ

      mysql را برسي كرديد

    هنر پاسخ

    سلام خسته نباشید
    فایل کانفیگ وب سایت من به این صورت تعریف شده

    $servername = 'localhost';
    $dbname = 'photo';
    $dbusername = 'root';
    $dbpassword = '2342423424424';

    حالا واسه استفاده از pdo باید به چه شکل اطلاعات رو تغییر بدم
    $pdo = new PDO('mysql:dbname=mydatabase;host=localhost', 'db_username', 'db_password');
    به چه شکل؟

      مسعود شریفی پاسخ

      بله ! نمونه قرار داده شده

      fisae پاسخ

      مرسی از آموزش خوبتون.

        مسعود شریفی پاسخ

        قربانه شما موفق پیروز باشید.

    elm2019 پاسخ

    متشکرم

      پویا قربانی پاسخ

      موفق باشید

    علیرضا پاسخ

    مهندس من از تابع دومی استفاده کردم اما با این پیغام برخورد کردم:

    Fatal error: Undefined class constant 'FETCH' in C:\xampp\htdocs\jazire\top.php on line 31
    اگه لطف کنین کمکم کنین ممنون میشم

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم