مطالعه این مقاله ارزشمند 1 دقیقه و 12 ثانیه زمان نیاز دارد مطالعه کنید، مشارکت کنید و به اشتراک بگذارید


عنوان مقاله: آموزش بسیار ساده و کاربردی استفاده از PDO در php

در زمان های نه چندان دور ما برای استفاده از دیتابیس کلاس ساده ای داشتیم و از اون به نحو احسن استفاده میکردیم ولی تو همین گیر و دار افرادی به عنوان حالا هکر یا معمولی که به نوعی مرض داشتن میومدن کرم میریختن و سایت ما رو دچار اختلال میکردن. ما پیاده سازی های به شدت زیادی رو انجام میدادیم که بتونیم جلوی این حرکتها رو بگیریم و یا مدیریت کنیم و واقعا هم کار آسونی نبود. حالا تیم php تو این چند سال نه زیاد اومدن برای ارتباط با دیتابیس PDO رو معرفی کردن که الان شده هسته همه فریم ورک های php دنیا و با پیاده سازی های متنوع نحوه ارتباط و استفاده از اون رو آسانتر کردن ولی همیشه که ما با فریم ورک ها سر و کار نداریم درسته؟ برای همین میخام یه آموزش ساده ولی کاربری رو بهتون یاد بدم که کارتون رو به راحتی راه بندازه و دیگه از شر Sql Injection ها رها شید

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

اول باید یه کانکشن به دیتابیس بر اساس الگوی PDO انجام بدیم:

define('DATABASE','database_name_here');
define('DATABASE_USER','database_user_here');
define('DATABASE_PASSWORD','database_password_here');
try {
  $dbh = new PDO('mysql:host=localhost;dbname='.DATABASE, DATABASE_USER, DATABASE_PASSWORD,array(
    PDO::ATTR_PERSISTENT => true,
  ));
} catch (PDOException $e) {
  print "Error!: " . $e->getMessage() . "<br/>";
  die();
}

که خیلی ساده اومدم کلمه عبور و نام بانک اطلاعاتی رو نوشتم و یه نمونه از کلاس PDO ساختم که گفتم برای ارتباط با دیتابیس از این مواردی که به صورت define تعریف شده استفاده کن. بعدش گفتم اگه تونست کانکت بشه و نام کاربری و نام دیتابیس درست بود تو رم برای کانکشنهای بعدی نگه داری بشه و نیام دایما یک instance از کلاس PDO بگیرم و کانکت بشم. (البته این برای مبتدی هاست نه حرفه ای ها. کار زیاد جالبی هم نیست. به هر حال! )

برای اینکه این کانکشن رو هر جا لازم بود استفاده کنیم اون رو داخل یه فایل قرار میدیم مثلا:  inc-db-connect.php و برای اینکه بتونیم ازش استفاده کنیم و کوئری بگیریم از این کد استفاده میکنیم:

include('inc-db-connect.php');
function someFunction() {
  global $dbh;
  $sth = $dbh->query('SELECT * FROM table');
}

اینجا table منظور همون جدول شماست که نوشتم. این تابع همونطوری که میبینید پارامتری نمیگیره ازمون که بتونیم بسط بدیم کوئری رو. برای همین برای اینکه بتونیم این کار رو بکنیم از این شکل دستوری استفاده میکنیم:

$sth = $dbh->prepare('SELECT * FROM table WHERE name = :username && password = :pass');
$sth->execute(array(':username' => $username, ':pass' => $password));

به این روش میگن named parameters چون ما اومدیم داخل خود کوئری از پارامترهایی استفاده کردیم که نام ستون رو واضح داخلش نوشتیم و بعد با انتساب آرایه مقادیر رو بهش نسبت دادیم که هر کودوم جای خودش میشینن. ولی اگه بخواهیم از روش استفاده کنیم یه کم فرق میکنه والبته بسیار بهتر و قابل درک تر که تو فریم ورک ها هم ازش استفاده میشه:

$values = [];
$values[] = $username;
$values[] = $password;
$sth = $dbh->prepare('SELECT * FROM table WHERE name = ? && password = ?');
$sth->execute($values);

اینکه چه اتفاقی افتاده فقط این مورد که آرایه اول تعریف شده و بهش انتساب دادم همین ولی خوانایی به شدت بالا رفت. از named parameters به شکل دیگه هم میشه استفاده کرد اینکه ما بگیم نوع داده هایی که میخاییم انتساب بدیم از چه نوعی هستن مثلا رشته ای- عددی یا اعشار. برای همین از این شکل دستوری استفاده میکنیم:

$sth = $dbh->prepare('SELECT * FROM table WHERE name = :username && user_id = :id');
$sth->bindParam(':username', $username, PDO::PARAM_STR);
$sth->bindParam(':id', $user_id, PDO::PARAM_INT);
$sth->execute();

نوع هر کودوم از فیلدها یا ستون های جدول رو مشخص میکنیم. یه چیزی هم که هستش نیازی نیست شما حتما تو انتساب و bindParam ها از username: استفاده کنید. میتونید مکانش رو هم مشخص کنید مثلا جای خالی اول که میشه username: و یا جای خالی دوم که مقدار باید بهش انتساب داده بشه که میشه همون id:

مثلا:

$sth = $dbh->prepare('SELECT * FROM table WHERE name = ? && user_id = ?');
$sth->bindParam(1, $username, PDO::PARAM_STR);
$sth->bindParam(2, $user_id, PDO::PARAM_INT);
$sth->execute();

بعد دستور:

$sth->execute();

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

$user = $sth->fetch();

و برای خروجی گرفتن چندین رکورد از:

$error = $sth->errorInfo();

استفاده کنید.

یه مثال دیگه از نحوه ذخیره تو دیتابیس هم بگم اگه سوالی بود بپرسید

$sth = $dbh->prepare('INSERT INTO table (username) VALUES (:username)');
$sth->execute(array(':username' => $username));
$user_id = $dbh->lastInsertId();
بیوگرافی
مهندس مهدی پیشگوی

مهدی پیشگوی هستم متخصص تولید اپلکیشنهای موبایلی اندروید و سامانه های تحت وب. مسلط به اکثرا ابزارهای تولید وب از قبیل Php - NodeJs - React - VueJs و تولید اپلیکشنهای اندرویدی با Java و ReactNative. تو این سایت تمام تجربه ۱۵ سال من در اختیار شما قرار داده شده است

شما اولین فردی باشید که نظر ارزشمندی ارسال میکند

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



لطفا برای ارسال نظر وارد سایت شوید یا ثبت نام کنید. کلیک کنید

خواندن مطالب با ارزش زیر برای شما توصیه می شود

  • خطای composer و عدم ساپورت نسخه php
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 8 ثانیه
    مقالات آموزشی laravel - تیر 17، 1397

    چند روز پیش مشکلی که برام پیش اومد این بود که وقتی داشتم سایتم رو بالا می اوردم دیگه پوشه vendor که مربوط به لاراول بود رو آپلود نکردم. بعدش وقتی با دستور composer سعی کردم نصب و آپدیت کنم خطا داد. ...

  • مایگریشن ها رو تو لاراول به دلخواه به عقب برگردونیم
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 3 ثانیه
    مقالات آموزشی laravel - تیر 20، 1397

    زمانی که ما داریم از مایگریشن ها استفاده میکنیم بارها پیش اومده که آخرین جدولی که ساختیم نیاز به ویرایش داشته و با انجام rollback یا refresh کردن تمام جداول بانک اطلاعاتی رو به قبل برمیگردونیم ولی ...

  • در php کودوم خط از کدی که نوشتیم باعث بروز خطا میشه
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 14 ثانیه
    مقالات آموزشی laravel - مرداد 23، 1397

    زمانی که در حال توسه نرم افزار هستیم بارها پیش اومده که خطاهایی دریافت میکنیم که به نظر آشکار میان ولی وقتی میخایید بفهمید که کودوم خط این اتفاق افتاده و اون رو دیباگ کنید به مشکل میخورید مخصوصا زم ...

  • پورت استفاده شده توسط لاراول رو kill کنیم
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 4 ثانیه
    مقالات آموزشی laravel - مرداد 23، 1397

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

  • خطای composer و عدم ساپورت نسخه php
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 8 ثانیه
    مقالات آموزشی laravel - تیر 17، 1397

    چند روز پیش مشکلی که برام پیش اومد این بود که وقتی داشتم سایتم رو بالا می اوردم دیگه پوشه vendor که مربوط به لاراول بود رو آپلود نکردم. بعدش وقتی با دستور composer سعی کردم نصب و آپدیت کنم خطا داد. ...

  • پورت استفاده شده توسط لاراول رو kill کنیم
    مدت زمان مورد نیاز برای مطالعه: 1 دقیقه و 4 ثانیه
    مقالات آموزشی laravel - مرداد 23، 1397

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