یک روش جدید برای اتصال به پایگاه داده (Database) در زبان برنامه نویسی محبوب PHP (در به روزرسانی PHP 5 به بالاتر) به نام mysqli معرفی و ارائه شده است.

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

آموزش اتصال به دیتابیس در php

 

در مقالات قبلی سایت، در مورد نحوه اتصال به دیتابیس با استفاده از PDO در زبان PHP بحث کردیم و دیدیم که به چه آسانی میتوانستیم با استفاده از این روش های جدیدتر، برنامه های خود را به صورت کاراتر پیاده سازی کنیم.

روش MySQLI هم یکی دیگر از روش هایی است که میتوان با استفاده از آن، برای اتصال به دیتابیس از امکانات زیادی برخوردار شد.

هر دو روش PDO و MySQLI برتری های خود را دارند و نمیتوان گفت کدام یک بهتر است!

برای مثال، با استفاده از PDO میتوان با دیتابیس های مختلف و متنوع تری کار کرد ولی با MySQLI فقط میتوان با پایگاه داده های MySQL ارتباط برقرار کرد.

هر دوی این روش ها شئ گرا (Object Oriented) هستند، اما میتوان از MySQLI به صورت رویه ای (Procedural) نیز استفاده کرد.

در هر حال انتخاب اینکه از کدام روش در برنامه خود استفاده کنیم به شما که برنامه نویس پروژه هستید و شرایط پروژه بازمیگردد و موضوع بحث فعلی ما نیست.

در این مقاله از حالت شئ گرایی MySQLI استفاده شده ولی شما بنا به علاقه خود میتوانید آنرا به صورت دیگری استفاده کنید.

 

اتصال به پایگاه داده

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

 

پارامتر چهارم (نام پایگاه داده) اختیاری است و میتوان آنرا ننوشت. در اینصورت می بایست در تمام Query های خود، نام پایگاه داده را بیاورید.

 

اجرای یک Query روی پایگاه داده

برای درک بهتر به قطعه کد زیر توجه کنید. در این کوئری ساده تمام کاربرانی که نقش آنها برابر مقدار فرضی 1 بوده را مورد هدف و جستجو قرار داده ایم.

 

در شرط انتهای کد، اگر اجرای دستور با مشکلی مواجه شده باشد، برنامه را die کرده و پیغامی را چاپ میکنیم. این کار برای جلوگیری از به وجود آمدن خطاهای غیر منتظره است.

در صورت اجرای درست دستور، درون متغیر $result یک شئ از نوع mysqli_result خواهیم داشت. با این متغیر میتوانیم هر کار دلخواهی، نظیر اجرای حلقه روی نتایج، نمایش یک نتیجه خاص، بررسی تعداد نتایج و .. انجام دهیم.

 

نمایش نتایج حاصل از اجرای Query

فرض کنید میخواهیم تمام نتایج حاصل از اجرای دستور قبلی را به گونه دلخواه چاپ کرده و به کاربر سیستم نمایش دهیم.

 

بررسی تعداد نتایج بازگردانده شده از اجرای Query

هر شئ از mysqli_result یک متغیر با نام num_rows دارد که نشان دهنده تعداد سطرهای نتیجه شده از اجرای Query روی دیتابیس می باشد. ما به سادگی و به صورت زیر میتوانیم به این متغیر دسترسی داشته باشیم.

 

شئ mysqli_result متدها و فیلدهای متفاوتی دارد که میتوانید تمام آنها را در مستندات PHP بررسی نمایید.

 

آزادسازی نتایج

پیشنهاد شده پس از کار با نتایج حاصل از اجرای کوئری، نتایج را به اصطلاح آزاد کنیم.

برای مثال، بعد از نمایش نتایج و تعداد آنها که در بالا انجام شد، کد زیر را اجرا میکنیم.

 

با این کار برخی منابع به کار گرفته شده در سیستم آزاد شده و به کارآمدی سیستم کمک خواهد کرد.

 

بستن ارتباط

همیشه پس از پایان کار با پایگاه داده مورد نظر، ارتباط ایجاد شده با پایگاه داده را قطع خواهیم کرد.

 

این کار میتواند از به وجود آمدن خطاهای پیش بینی نشده مربوط به باز بودن ارتباط با پایگاه داده جلوگیری کند.

 

عبارات آماده شده (Prepared Statements) و جلوگیری از حملات SQL Injection

همانند روشی که در آموزش روش PDO جهت جلوگیری از حملات SQL Injection ارائه شد، روشی مشابه در کار با MySQLI نیز وجود دارد.

برای کار با این روش، میتوان Query مورد نظر را با متد prepare به متغیر پایگاه داده خود بدهیم و به جای متغیرهایی که به صورت غیر قابل پیش بینی در حال وارد شدن به Query هستند علامت سوال (?) قرار داده و اطلاعات را بعداً، برای اجرا به شئ ارجاع دهیم.

بهتر است با یک مثال این روش را بررسی کنیم.

 

برای Bind کردن اطلاعات به کوئری آماده شده، میتوان متد bind_param() را روی متغیر statement صدا زد.

 

این متد به طور پیشفرض دو ورودی میگیرد.؛ ورودی اول مشخص کننده نوع داده در حال جایگزینی و دومین ورودی، داده مورد نظر ما برای جایگزینی است.

در اینجا s به معنای string بودن متغیر جایگزین شده می باشد. (به طور مشابه میتوان از i برای integer ، از d برای double و… استفاده کرد.)

در پایان با صدا زدن تابع execute() میتوانیم Query خود را روی پایگاه داده اجرا کنیم.

 

دقت داشته باشید که نتایج اجرای دستورات ما پس از اجرا، درون متغیر statement قرار داده میشود.

فراموش نکنید که پس از اینکه کارتان با نتایج تمام شد، آنها را با اجرای دستوراتی مشابه قبل، آزادسازی کنید.

 

در صورتی که درون Query خود چندین متغیر داشته باشیم، میتوان تمام آنها را با استفاده از همان متد bind_param به کوئری داد. برای این منظور کافی است اولین ورودی تابع، یک رشته شامل انواع ورودی به ترتیب نوشته شده در کوئری بوده و ورودی دوم به بعد نیز متغیرهای مورد نظر.