ارتباط با دیتابیس به کمک PDO در PHP
#1
Lightbulb 
به نام خدا؛
سلام دوستان امیدوارم حالتون خوب باشه...
خیلی از شماها مسلماً طریقه برقراری ارتباط با دیتابیس (عموماً MySQL) رو بلد هستین و با استفاده از mysql_connect() یا mysqli_connect() به راحتی کوئری های موردنظرتون رو اعمال می کنین. اما آیا تنها راه ارتباط با دیتابیس همین دو روش هست؟ آیا این روش ها ایمن هستند؟ اگر روش های دیگه ای هم موجوده چی هستن؟
اینها سوالاتی هست که توی این مطلب میخوایم بهشون پاسخ بدیم.
PDO یا PHP Data Object چیست؟
 PDO یا همون PHP Data Object امکانی هست که از ورژن 5.1 PHP به عرصه ظهور رسید. اما چرا باید از این روش برای ارتباط با دیتابیس استفاده کنیم؟ 
به نظرم ذکر موارد زیر کاملاً کافی باشه:
  •  وقتی از PDO استفاده می کنیم نگرانی بابت حملاتی مثل SQL Injection (تزریق کدها و کوئری های خطرناک) به دیتابیس نداریم.
  • استفاده از متدهای mysql_connect() یا mysqli_connect() عملاً منسوخ شده و کمتر برنامه نویسی از این متدهای ابتدایی برای ارتباط با دیتابیس استفاده میکنه. البته شکی نیست که این دو متد واقعاً کار راه انداز هستن!
  • هنگامی که از دو متد mysql_connect() و mysqli_connect() استفاده می کنیم فرآیند Escaping برای جلوگیری از حملاتی مثل SQL Injection به عهده برنامه نویس خواهد بود. یعنی باید برنامه نویس خودش مکانیزم یا مکانیزم هایی رو طراحی کنه که علائم و کاراکترهای غیرمجاز توسط کاربر ارسال نشن و مشکل ایجاد نشه.
  • اگر برنامه نویس قصد ایجاد تغییرات در دیتابیس رو داشته باشه اگر از PDO استفاده کنه با زحمتی بسیار بسیار کمتر میتونه تغییرات خودش رو اعمال کنه و حتی از یک سیستم پایگاه داده به سیستم پایگاه داده دیگه کوچ کنه.
  • شما با استفاده از PDO به راحتی میتونین به 12 نوع دیتابیس متصل بشین که MySQL هم جزء اونهاست.

بعد از بیان کردن این موارد وقتش هست که وارد مقوله طریقه استفاده از PDO بشیم. ما به سه طریق میتونیم دستورات SQL رو در PDO اجرا کنیم. متد exec، متد query (البته در صورت استفاده از این متد باید خودتون فکری برای حملات Injection بردارین و تفاوت خاصی با دو متد عادی نداره) و متد execute (دیگه نگرانی بابت مسائل امنیتی ندارین اگر از این متد و متد prepare استفاده کنین!). 
پس با این تفاسیر به توضیح متد execute و prepare می پردازم.
برای اینکه جلوی حملات Injcection رو بگیریم ابتدا دستورات SQL خودمون رو آماده (prepare) می کنیم و بعد اونها رو اجرا (execute) می کنیم.
**قبل از شروع اگر نمیدونین که آرایه (Array) در PHP چی هست اینجا میتونین مطالعه کنین.**
در کد نمونه زیر من با استفاده از دستور SELECT در MySQL یکسری دیتا رو استخراج میکنم.
کد php:
<?php

/**
 * @author Master Badfar
 * @copyright 2020
 */
try{
// وارد کردن مشخصات دیتابیس
$connection = new PDO("mysql:host=localhost;dbname=yourdb_name","username","password");
// آماده سازی دستور یا کوئری مای اس کیو اِل
$prepared=$connection->prepare('select email from your_table where id=? and username=?');
// مقادیری که قصد داریم به جای آی دی و پسورد در دستور مای اس کیو اِل قرار دهیم را در یک آرایه ذخیره می کنیم
$bind=array('1','mahdi');
// دستور آماده شده را اجرا می کنیم
$prepared->execute($bind);
$data=$prepared->fetchAll();
// نمایش خروجی در قالب آرایه
print_r($data);
// نمایش پیغام ارور
}catch(PDOException $e){
echo 
$e.getMessage();
// چاپ آرایه خالی در صورت وجود نداشتن اطلاعات موردنظر در دیتابیس
print_r($e.errorInfo());
}
?>
شاید در نگاه اول اصلاً نفهمین داستان چی شد ولی دست نگه دارین. اول اومدیم با دیتابیس ارتباط برقرار کردیم. بعد دستور یا کوئری SQL خودمون رو آماده کردیم. یعنی من نیومدم مقادیر id و username که توسط کاربر وارد خواهد شد رو مستقیم داخل کوئری قرار بدم و به جای اونها علامت سوال قرار دادم. بعد اومدم مقادیری که قصد دارم به جای علامت سوال قرار بدم رو در داخل یک آرایه تعریف کردم. بعد دستور آماده شده رو اجرا کردم. حالا اگر رکورد مورد نظر من داخل دیتابیس موجود باشه نتیجه (ایمیل کاربر) رو در قالب یک آرایه به من نمایش میده. یعنی چنین خروجی رو شاهد هستم:
کد:
Array ( [0] => Array ( [email] => [email protected] [0] => [email protected] )

امیدوارم از این مطلب لذت برده باشین و براتون کاربردی واقع شده باشه و سعی کنین به جای استفاده از دو متد منسوخ شده mysql_connect() و mysqli_connect() از PDO که ایمن تر و به روز تر هست استفاده کنین.
خوشحال میشم نظراتتون رو بیان کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: M.gh ، [email protected] ، amin hosseini ، ᔕinaᗪehghani
#2
عالی بود
من هرچی از php میدونم از شما یاد گرفتم  ( هیچی نمی دونم )
  پاسخ


 سپاس شده توسط: Master Badfar


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 77,705 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 18,103 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,235 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 7,238 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,413 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: