کار با فایل ها و پایگاه داده ها در PHP
اطلاعات یک وب سایت، نقشی اساسی در پویا بودن آن ایفا میکنند و روش ذخیرهسازی آنها، اهمیت بهسزایی دارد. در جلسات گذشته با یکی از روشهای ذخیره سازی اطلاعات (یعنی متغیرها) آشنا شدیم. این روش، تا حدود زیادی مناسب است؛ اما در برخی موارد، ممکن است نیاز به ذخیره اطلاعات بهمدت طولانی داشته باشیم. در چنین مواردی، استفاده از متغیرها روش قابل اطمینانی بهنظر نمیرسد؛ زیرا با بستن صفحه یا نمایش مجدد آن (Refresh)، مقادیر قبلی متغیرها از بین میرود. در این جلسه با دو مورد از روشهای ذخیرهسازی طولانیمدت اطلاعات، یعنی استفاده از فایلها و پایگاه دادهها آشنا خواهیم شد.
مراحل کار با فایلها
برای انجام هرگونه کار با فایلها، باید سه مرحله اصلی زیر را انجامدهیم:
بازکردن فایل
طبیعتاً قبل از انجام هر کاری برروی یک فایل، باید آنرا باز کنیم. برای بازکردن یک فایل، از دستور fopen استفاده میکنیم که دارای ساختار زیر است:
در این ساختار، بجای filePath مسیر فایل را مشخص میکنیم. اگر فایل مذکور در همان مسیر قرارگیری اسکریپت PHP باشد، فقط ذکر نام فایل کافی است؛ اما اگر در مسیر دیگری قرار داشته باشد، باید نام فایل را همراه با ذکر مسیر نسبی (یا مطلق) آن معین کنیم. در قسمت mode یکی از عبارات زیر را میتوانیم ذکر کنیم:
درصورتی که همهچیز بهدرستی پیشرود، فایل موردنظر با نوع دسترسی مشخصشده، باز میشود و یک کنترلکننده (Handle) برای دسترسی به آن در طول برنامه، بعنوان نتیجه بازگردانده میشود که در متغیر معرفیشده در قسمت variableName$ قرار خواهد گرفت. بنابراین، در ادامه برنامه میتوان ازطریق همان متغیر، کارهای دلخواه را برروی فایل مربوطه انجام داد. برای درک بهتر، به مثالهای زیر دقت کنید:
نکته: برای دسترسی به پوشه والد، از .. استفاده میشود. ضمناً برای جداکردن مسیرها بجای باید از / استفاده کنید.
درصورتی که فایل را مشابه مثال اول و چهارم، در وضعیت خواندن باز کنید اما به هر دلیلی PHP نتواند آنرا باز کند (برای مثال، مسیر اشتباه وارد شده باشد یا به دلیل سطح دسترسی و... PHP نتواند به فایل دسترسی داشته باشد)، هشداری مشابه پیغام زیر در صفحه خروجی ظاهر خواهد شد و مقدار false داخل متغیر موردنظر (مثل fp$ در مثالهای بالا) ذخیره خواهد شد:
که در پیغام مذکور، بجای نام و مسیر فایل و شماره خط، نام و مسیر فایل تولیدکننده خطا و شماره خطی که در آن اقدام به بازکردن فایل شده است، ظاهر خواهد شد.
توجه کنید که پیغامهای هشدار موجب توقف اجرای کد نمیشوند و دستورات بعدی کد پردازش خواهند شد. درنتیجه در دستورات بعد، هر دستوری که اقدام به خواندن از فایل (یا نوشتن در آن) نماید، موجب بروز خطای دیگری خواهد شد. برای پرهیز از چنین وضعیتی، بهتر است فایلها را با یکی از روشهای زیر باز کنیم:
در ساختار اول، به دلیل وجود قسمت or die، درصورتی که PHP موفق به بازکردن فایل نشود، ضمن نمایش پیغام خطای مشخصشده، به اجرای کد خاتمه میدهد؛ اما در ساختار دوم، بلاک داخل if فقط درصورتی اجرا میشود که فایل با موفقیت باز شود و قسمت بعد از بلاک if درهرصورت اجرا خواهد شد. اینکه کدامیک از ساختارها مناسب است، بستگی به نیاز اسکریپت شما دارد.
بازکردن فایلهای سایر سایتها
برای بازکردن فایلهای یک سایت دیگر، میتوانید مشابه مثال زیر عملکنید:
دقتکنید که فایلهای سایتهای دیگر را فقط میتوان در وضعیت خواندن باز نمود و برای دسترسی به فایلهای سایر سایتها، باید تنظیمات مربوط به allow_url_fopen در فایل تنظیمات PHP یعنی php.ini فعال باشد. ضمناً درصورتی که یک فایل PHP را از یک سایت دیگر درخواستکنید، نتیجه پردازش آن (بصورت یک سند HTML) در اختیار شما قرار میگیرد و به کد منبع PHP مربوطه دسترسی نخواهید داشت.
نوشتن در فایل
بعد از بازکردن فایل در هرکدام از وضعیتهای w و +w و a و +a میتوانیم عمل نوشتن در فایل موردنظر را انجامدهیم. برای اینکار، دستورات مختلفی وجود دارد که یکیاز آنها، دستور fwrite است:
که بجای file$ باید متغیر کنترلکننده فایل (که خروجی fopen را در آن قرار دادهاید) و بهجای stringToWrite متن موردنظر برای ذخیرهسازی را بنویسید. برای مثال، به دستورات زیر توجه کنید:
این دستورات موجب بازکردن فایل sample.txt در وضعیت نوشتن در انتهای فایل (Append) میشوند و درصورتی که فایل با موفقیت باز شود، عبارت !Hello همراه با کارکتر رفتن به سطر بعد، در انتهای فایل بازشده درج خواهد شد.
دستور fwrite دارای یک پارامتر اختیاری عددی نیز میباشد که در انتهای همه پارامترها ذکر میشود و درصورت تعیینشدن، از رشته مشخصشده بهاندازه عددی که تعیین میشود در فایل نوشته خواهد شد. مثال:
نکته: اگر طول رشته مشخصشده، کمتر از تعداد کارکتر تعیینشده در پارامتر سوم باشد، رشته مربوطه بهطول کامل در فایل نوشته خواهد شد.
دستور دیگری بهنام fputs نیز برای نوشتن در فایل وجود دارد که یک اسم مستعار برای fwrite بوده و ازنظر عملکرد و پارامترهای ورودی، دقیقاً مشابه دستور fwrite است؛ لذا از توضیح آن خودداری میکنیم و شما میتوانید بهدلخواه از هرکدام استفادهکنید.
خواندن از فایل
برای خواندن از فایل، دستورات مختلفی در PHP وجود دارد که هرکدام، روش متفاوتی را برای دریافت اطلاعات از فایل، بکار میبرند. یکی از این دستورات، fgets است که ساختار کلی زیر را دارد:
که در این ساختار، با هربار اجرای دستور فوق، یک خط از file$ خواندهشده و درون رشته line$ ذخیره میشود. برای خواندن تمام فایل و نمایش آن در خروجی میتوانید از روشی مشابه مثال زیر استفاده کنید:
همانطور که مشاهده میکنید، در این ساختار از یک دستور دیگر بهنام feof برای کنترل شرط حلقه while استفاده شده است. این دستور، یک فایل را مورد بررسی قرار میدهد و درصورت رسیدن به انتهای آن، مقدار true باز میگرداند. بنابراین، در حلقه while مثال قبل، تا زمانی که به انتهای فایل نرسیدهایم (بهدلیل استفاده از !)، هربار یک خط از فایل خواندهشده و درون متغیر line$ قرار میگیرد. سپس توسط دستور echo خط خواندهشده از فایل در خروجی نوشته میشود. البته دستور fgets دارای یک پارامتر اختیاری از نوع عددی نیز میباشد که درصورت ذکرشدن، هربار، بهاندازه یکواحد کمتر از عدد مشخصشده را میخواند و درصورتی که قبلاز خواندن تعداد کارکترهای مشخصشده، به انتهای سطر (یا فایل) برسد، عمل خواندن را متوقفکرده و تا همانقسمت را برمیگرداند. مثال:
در مثال فوق، با هربار اجرای دستور fgets، چهار کارکتر از فایل خواندهشده و در متغیر str$ ذخیره میشود. اگر قبلاز رسیدن به 4 کارکتر، سطر تمامشود نیز کارکترهای خواندهشده تا همانجا در متغیر str$ ذخیره خواهد شد.
خواندن یک کارکتر از فایل
برای اینکار از دستور fgetc استفاده میشود که ساختار آن بهصورت زیر است:
خواندن کل فایل بصورت متن کامل
گاهی اوقات ممکن است نیاز به ذخیره محتوای یک فایل در یک رشته بصورت یکجا داشتهباشید. در این مواقع، میتوانید از تابع file_get_contents استفادهکنید. این تابع، بطور خودکار فایل را بازکرده، محتوای آنرا خوانده و در متغیر ذخیرهنموده و فایل را میبندد:
خواندن یک فایل و ذخیره سطر به سطر در آرایه
در برخی موارد ممکناست نیاز به خواندن یک فایل بهصورت سطر به سطر و قراردادن هرکدام از سطرها در خانههای مختلف یک آرایه داشتهباشید. در چنین مواردی، میتوانید از روش زیر استفادهکنید:
بدینترتیب، محتوای فایل خواندهشده و بهصورت سطر به سطر در یک آرایه قرار میگیرد. البته PHP یک ساختار بهینهتر نیز بهنام تابع file برای انجام عمل فوق دارد که تمام مراحل بازکردن، خواندن سطر به سطر و قراردادن در آرایه و نهایتاً بستن فایل را با یک دستور انجام میدهد:
البته درصورتیکه فایل شما بسیار حجیم باشد، خواندن کل فایل بصورت یکجا ممکناست برروی کارآیی اسکریپت شما و مصرف حافظه آن، اثر نامناسبی بگذارد و بهتر است در چنین مواقعی، از همان روش پردازش سطر به سطر با حلقه while استفادهکنید.
بستن فایل
از آنجا که هر فایل، برای نگهداری کنترلکننده خود از متغیرها استفاده میکند و ازطرفی، در هر لحظه فقط یک نفر (یا برنامه) میتواند یک فایل را باز کند، برای جلوگیری از خرابشدن احتمالی فایل و امکان اتصال کاربران مختلف به فایل، بهتر است بعد از اتمام کار خود با هر فایل، آنرا با دستور fclose ببندید:
اگر اینکار را انجام ندهید، PHP بطور خودکار تمامی فایلهای بازشده را در پایان اسکریپت، میبندد؛ اما بهتر است که خودتان اینکار را بهمحض اتمام کارتان با یک فایل، انجام دهید. ممکناست در ادامه اسکریپت خود، پردازشهای سنگینی انجامدهید که نیاز به فایل بازشده نداشتهباشند (مثلاً محتوای آنرا درون یک آرایه ذخیره کردهاید) و درنتیجه، آزادکردن فایل امکان دسترسی همزمان کاربران بیشتری را به آن فایل، در زمانی که اسکریپت شما درحال انجام پردازشهای سنگین خود است، خواهد داد.
کار با بانکهای اطلاعاتی
اگر نیاز به ذخیره اطلاعات پیچیدهتری داشتهباشید، بخواهید امنیت آنها را تضمینکنید و یا کاربران زیادی بتوانند بهطور همزمان به دادهها دسترسی داشتهباشند، بانک اطلاعاتی عملکرد بسیار بهتری نسبتبه فایلهای متنی ساده خواهد داشت. بهعلاوه، اگر با یک نرمافزار مدیریت بانک اطلاعاتی (DBMS) آشنا باشید، کارکردن با بانکهای اطلاعاتی بهسادگی استفاده از فایلهای متنی خواهد بود.
درک نرمافزار بانک اطلاعاتی
بانک اطلاعاتی، درحقیقت یک رابط مدیریت فایل است که اطلاعات را بهصورت ساختیافته ذخیره میکند. درنتیجه میتوانید بهسرعت اطلاعات دلخواه خود را در زمان نیاز، بیابید. بانک اطلاعاتی میتواند کوچک باشد (مثلاً اسامی، نشانیها و شمارههای تلفن همه دوستان شما را در خود ذخیرهکند) و یا بصورت انبوهی از اطلاعات باشد که با ساختاری بسیار پیچیده، مدیریت میشود (مثل بانک اطلاعاتی وبسایت گوگل که مشخصات و محتویات سایتهای اینترنتی را در خود نگهداری میکند).
هر بانک اطلاعاتی، بدون اهمیت به اندازه و نوع آن، نیاز به یک نرمافزار مدیریت دارد تا دادهها را بهشکل صحیح ذخیرهنماید و درهنگام نیاز به اطلاعات، آنها را با سرعت مناسب از بانک اطلاعاتی استخراج نماید.
انواع نرمافزارهای مدیریت بانک اطلاعاتی
نرمافزارهای زیادی برای مدیریت بانک اطلاعاتی طراحی شدهاند و هرکدام، نقاط ضعف و قوت خاص خود را دارا میباشند و همه آنها DataBase Management System یا DBMS بهشمار میروند. چند نمونه از DBMSهای معروف را مشاهده میکنید:
البته تعداد DBMSها بسیار زیاد است و برخی از آنها همچون dBase و FoxPro و... بهدلیل عدم امکان استفاده آسان در وب، در فهرست فوق ذکر نشدهاند. درمیان DBMSهای فوق، MySQL محبوبیت بیشتری در وب دارد. بهدلیل امکانات جانبی و سرعت و سهولت کار و مهمتر از همه، سازگاری کامل با PHP (بدون نیاز به نصب افزونههای جانبی)، در این آموزش از MySQL استفاده میکنیم.
نصب DBMS
اولین مرحله برای کار با بانک اطلاعاتی، نصب نرمافزار مدیریت آن است که بهدلیل استفاده از WampServer در این آموزش، MySQL بطور خودکار نصب خواهد شد و لذا، از آموزش نصب آن خودداری میکنیم. گام بعدی، استفاده از یک نرمافزار است که بتوانیم ازطریق آن، بهسهولت با بانک اطلاعاتی کار کنیم. علت این مسئله، آن است که MySQL فقط ازطریق یک محیط متنی (بدون استفاده از رابط گرافیکی کاربر) با بانک اطلاعاتی کار میکند و این مسئله، طبیعتاً خوشایند نیست و کار با آنرا مشکل میکند. یکیاز نرمافزارهای سودمند مدیریت بانک اطلاعاتی، phpMyAdmin است که آنهم بطور خودکار همراهبا WampServer نصب میشود. برای اجرای آن، باید ابتدا برروی آیکن WampServer کلیککرده و سپس، گزینه phpMyAdmin را انتخاب کنید (یا در مرورگر، آدرس localhost/phpmyadmin را فراخوانیکنید).
برای یادگیری بهتر، قصد داریم ساخت بانک اطلاعاتی و جداول داخلی آنرا با phpMyAdmin انجامداده و مابقی کارها را (شامل درج دادههای جدید، خواندن اطلاعات از بانک اطلاعاتی، ویرایش و حذف رکوردها و...) توسط PHP انجامدهیم.
ایجاد بانک اطلاعاتی
از نوار ابزار بالا در قسمت سمت راست، برروی گزینه Databases کلیک کنید و در قسمت Create new database نام بانک اطلاعاتی موردنظر (مثلاً learning) را نوشته و از قسمت Collation، سیستم کدگذاری کارکترها را انتخاب کنید (پیشنهاد میکنیم از utf8_percian_ci استفادهکنید تا بانک اطلاعاتی شما دادههای فارسی را بهشکل صحیح پشتیبانیکند).
حال برروی دکمه Create کلیک کنید تا بانک اطلاعاتی شما ساختهشود. بدینترتیب، با ساختهشدن بانک اطلاعاتی، نام آن به فهرست بانکهای اطلاعاتی در سمت چپ صفحه اضافه میشود. اگر به قسمت Console در پایین پنجره نگاهکنید، دستور MySQL موردنیاز برای انجام اینکار، نوشته شدهاست:
بنابراین، مشاهده میکنید که phpMyAdmin به شما کمک میکند تا حتی اگر با ساختار دستورات MySQL آشنایی نداشتهباشید، بهراحتی آنرا بیاموزید.
ایجاد جدول
در قسمت Create table نام دلخواه خود را برای جدول جدید در قسمت Name و تعداد فیلدهای موردنظر را در قسمت Number of columns بنویسید:
بدینترتیب، با صفحهای مشابه تصویر زیر مواجه خواهید شد:
در این صفحه، نام هر فیلد را در ستون Name بنویسید. نوع آنرا در قسمت Type، حداکثر طول مجاز را در قسمت Length/Values (برای فیلدهای متنی) و نوع کدگذاری را در قسمت Collation تظنیمکنید. درصورتی که برای یک فیلد، کدگذاری را تعیین نکنید، از کدگذاری جدول استفاده میشود و درصورتی که برای جدول نیز کدگذاری را تعیین نکنید، از کدگذاری دیتابیس استفاده میشود. اگر میخواهید یک فیلد خاص، اجازه خالیبودن داشتهباشد، در ستون Null کادر انتخاب را تیک بزنید. هر جدول باید حداقل یک فیلد داشتهباشد که در ستون Index آن، گزینه Primary Key (کلید اصلی) انتخاب شده است؛ درغیر اینصورت، سرعت خواندن اطلاعات از جدول بهشدت افت خواهد کرد. همچنین اگر فیلدی را از نوع عددی انتخابکنید و گزینه AutoIncrement یا A_I را انتخابکنید، آن فیلد بطور خودکار شمارهگذاری خواهد شد. حال قصد داریم 4 فیلد بهصورت زیر تعریف کنیم (هیچکدام از فیلدها نمیتوانند خالی باشند) :
بنابراین، جدول فوق را بهصورت زیر تنظیم میکنیم:
حال برروی دکمه Save کلیک کنید تا جدول ایجاد شود. این هم دستور MySQL ساخت جدول:
برای آشنایی بیشتر با دستورات MySQL میتوانید از گزینههای Insert و Empty و Drop و Edit و... برای انجام اعمال مختلف استفادهکنید و دستورات MySQL متناظر با هر عمل را در قسمت Console مشاهدهکنید. پساز درج حداقل یک رکورد در جدول، دکمه Browse نیز فعالشده و میتوانید با کمک آن، دستور MySQL لازم برای خواندن اطلاعات را نیز مشاهدهکنید.
اتصال PHP به MySQL
PHP ازطریق توابعی که انحصاراً برای کار با بانک اطلاعاتی طراحی شدهاند، به DBMSهایی نظیر MySQL متصلشده و اعمال موردنظر را انجام میدهد. برای هر DBMS مجموعه دستورات مختلفی وجود دارد که ازطریق آنها، میتوانید با آن DBMS ارتباط برقرار کنید. برای مثال، بهمنظور کار با MySQL باید از دستوراتی که با پیشوند _mysqli شروع میشوند (مثل mysqli_connect و mysqli_query و... استفادهکنید.
اتصال به بانک اطلاعاتی
اولین مرحله برای کار با بانک اطلاعاتی، اتصال به آن است. اینعمل شبیه بازکردن فایل است؛ با این تفاوت که برای اتصال به بانک اطلاعاتی، ابتدا باید به موتور MySQL متصلشویم و سپس دیتابیس موردنظرمان را مشخصکنیم. برای اینکار، نیاز به 4 پارامتر زیر داریم:
بهطور پیشفرض در کامپیوترهای شخصی (و نه در سرورهای واقعی) نام سرور، localhost و نام کاربری پیشفرض نیز root و رمز آن نیز یک رشته خالی (بدون رمز عبور) است. بنابراین، درصورتی که تنظیمات پیشفرض را تغییر ندادهباشید، پارامترهای فوق بهترتیب بصورت زیر هستند:
برای اتصال به MySQL از دستور mysqli_connect استفاده میشود. این دستور، 4 پارامتر را بهترتیب گرفته و نتیجه اتصال را برمیگرداند. درصورتی که هرکدام از پارامترها اشتباه باشند، عمل اتصال انجام نشده و نتیجه false بازگردانده خواهد شد. مثالی از نحوه استفاده از این دستور:
بعد از اجرای این دستور، برای مشخص کردن اتصال MySQL در سایر دستورات کار با بانک اطلاعاتی، میتوانیم از متغیر con$ استفادهکنیم. دقت کنید که میتوان همزمان چند اتصال باز به سرورهای مختلف بانک اطلاعاتی برقرار کرد و در چنین شرایطی، مشخصکردن اتصال جهت انجام کار موردنظر، ضروری خواهد بود.
انجام اعمال موردنظر برروی بانک اطلاعاتی
برای انجام هر عمل برروی بانک اطلاعاتی، از زبان MySQL استفاده میشود. این زبان، شباهت بسیار زیادی به SQL استاندارد دارد و تنها چند مورد امکانات جانبی به آن اضافه شدهاست تا برای استفاده در وب، بهینهتر شود. برای اجرای یک دستور SQL برروی بانک اطلاعاتی از دستور mysqli_query استفاده میشود. این دستور دارای دو پارامتر است که پارامتر اول، اتصال موردنظر و پارامتر دوم، دستوری است که قصد اجرای آنرا دارید. خروجی این دستور در یک متغیر ذخیره میشود که براساس دستور SQL اجراشده، کاربردهای مختلفی دارد و اگر در دستور SQL خطایی وجود داشته باشد، نتیجه false داخل متغیر قرار خواهد گرفت. برای مثال:
اگر دستور SQL اجرا شده، مشابه مثال بالا یک دستور خواندن (SELECT) باشد، نتیجه بصورت مجموعه ای از رکوردها با ساختار خاص در حافظه ذخیره میشود و بعداً میتوان با کمک دستورهای دیگری، آنرا مورد دسترسی قرار داد. درمورد سایر دستورات مثل UPDATE و DELETE و... نیز ازطریق خروجی تولیدشده میتوان اعمال مختلفی ازقبیل بدستآوردن تعداد رکوردهایی که تحت تأثیر دستور مربوطه تغییر کردهاند و... را انجامداد.
محاسبه تعداد رکوردهای بدستآمده
درصورتی که از دستور SELECT استفاده شده باشد، میتوان با کمک دستور mysqli_num_rows تعداد رکوردهای بدستآمده از دیتابیس را محاسبهکرد:
محاسبه تعداد رکوردهای ویرایششده توسط دستورات UPDATE و DELETE و...
برای محاسبه تعداد رکوردهایی که توسط آخرین دستور mysqli_query تغییر کردهاند، باید از دستور mysqli_affected_rows استفادهکنید:
دقت کنید که پارامتر این دستور، اتصال MySQL است و نه خروجی دستور mysqli_query
استخراج یک رکورد از مجموعه رکوردهای بدستآمده از دیتابیس
خروجی دستور mysqli_query حتی با وجود استفاده از دستور SELECT، مستقیماً توسط PHP قابل استفاده نیست، زیرا نتایج با ساختار قابلفهم برای MySQL در حافظه RAM قرار میگیرند و خروجی دستور mysqli_query یک اشارهگر به محل اطلاعات در حافظه RAM خواهد بود. برای استخراج نتایج بهشکل قابلاستفاده در PHP باید از یکیاز دستورات زیر استفادهکنید: تمامی دستورات فوق، کار مشترکی را انجام میدهند و آن، استخراج یک رکورد از حافظه و بازگرداندن آن بصورت قابل استفاده در PHP است و اگر به آخرین رکورد حافظه رسیده باشند، نتیجه false برمیگردانند. تفاوت آنها در نوع خروجی است که میسازند. دستور mysqli_fetch_row نتایج را بهصورت یک آرایه با اندیس عددی برمیگرداند که در آن، اولین فیلد با اندیس 0، فیلد بعدی با اندیس 1 و... مشخص شدهاند. دستور mysqli_fetch_assoc همانگونه که از نامش پیداست، یک آرایه انجمنی میسازد که در آن، اندیس هر فیلد، نام همان فیلد در جدول دیتابیس خواهد بود (id و name و...). دستور mysqli_fetch_array در اصل دارای یک پارامتر دوم است که اختیاری بوده و درصورتی که قید نشود، مقدار پیشفرض MYSQLI_BOTH را خواهد داشت. در این حالت خروجی این دستور، یک آرایه با حجم دوبرابر حالت عادی است؛ زیرا برای هر فیلد، هر دو حالت اندیس عددی و اندیس رشتهای ثبت میشود. برای مثال، رکوردهای جدول students با فیلدهای 0 و id برای فیلد اول، 1 و name برای فیلد دوم و... تولید خواهد شد. اگر پارامتر دوم را با مقدار MYSQLI_NUM تنظیمکنید، مشابه mysqli_fetch_row عمل خواهد کرد و درصورتی که از مقدار MYSQLI_ASSOC استفادهکنید، مشابه mysqli_fetch_assoc عمل خواهد نمود. دستور آخر یعنی mysqli_fetch_object کمی با بقیه متفاوت است و خروجی آن، یک شئ است که میتوان از آن بصورت شئگرا استفاده نمود و برای مثال، برای خواندن فیلد name بهصورت obj->name$ استفادهکرد (درمورد این دستور، بعد از توضیح مباحث شئگرایی بیشتر توضیح خواهیمداد). توصیه ما در اکثر موارد، استفاده از mysqli_fetch_assoc است. بعنوان نمونه، به کد زیر دقتکنید:
نتیجه اجرای کد فوق را در تصویر زیر مشاهدهکنید:
اطلاعات یک وب سایت، نقشی اساسی در پویا بودن آن ایفا میکنند و روش ذخیرهسازی آنها، اهمیت بهسزایی دارد. در جلسات گذشته با یکی از روشهای ذخیره سازی اطلاعات (یعنی متغیرها) آشنا شدیم. این روش، تا حدود زیادی مناسب است؛ اما در برخی موارد، ممکن است نیاز به ذخیره اطلاعات بهمدت طولانی داشته باشیم. در چنین مواردی، استفاده از متغیرها روش قابل اطمینانی بهنظر نمیرسد؛ زیرا با بستن صفحه یا نمایش مجدد آن (Refresh)، مقادیر قبلی متغیرها از بین میرود. در این جلسه با دو مورد از روشهای ذخیرهسازی طولانیمدت اطلاعات، یعنی استفاده از فایلها و پایگاه دادهها آشنا خواهیم شد.
مراحل کار با فایلها
برای انجام هرگونه کار با فایلها، باید سه مرحله اصلی زیر را انجامدهیم:
- باز کردن فایل و تعیین روش دسترسی به آن (خواندن، نوشتن و...)
- انجام اعمال موردنظر برروی فایل (خواندن از فایل، نوشتن در فایل، حرکت در فایل و...)
- بستن فایل
بازکردن فایل
طبیعتاً قبل از انجام هر کاری برروی یک فایل، باید آنرا باز کنیم. برای بازکردن یک فایل، از دستور fopen استفاده میکنیم که دارای ساختار زیر است:
$variableName = fopen('filePath', 'mode');
در این ساختار، بجای filePath مسیر فایل را مشخص میکنیم. اگر فایل مذکور در همان مسیر قرارگیری اسکریپت PHP باشد، فقط ذکر نام فایل کافی است؛ اما اگر در مسیر دیگری قرار داشته باشد، باید نام فایل را همراه با ذکر مسیر نسبی (یا مطلق) آن معین کنیم. در قسمت mode یکی از عبارات زیر را میتوانیم ذکر کنیم:
- r : خواندن (درصورت عدم وجود فایل، پیغام خطا تولید خواهد شد)
- +r : خواندن و نوشتن (درصورت عدم وجود فایل، پیغام خطا تولید خواهد شد)
- w : نوشتن (درصورت وجود فایل، حذف شده و مجدداً ایجاد خواهد شد)
- +w : خواندن و نوشتن (درصورت وجود فایل، حذف شده و مجدداً ایجاد خواهد شد)
- a : نوشتن در انتهای فایل (درصورت وجود، محتوای جدید به انتهای آن اضافه میشود و درصورت عدم وجود، ایجاد خواهد شد)
- +a : خواندن و نوشتن در انتهای فایل (درصورت وجود، محتوای جدید به انتهای آن اضافه میشود و درصورت عدم وجود، ایجاد خواهد شد)
درصورتی که همهچیز بهدرستی پیشرود، فایل موردنظر با نوع دسترسی مشخصشده، باز میشود و یک کنترلکننده (Handle) برای دسترسی به آن در طول برنامه، بعنوان نتیجه بازگردانده میشود که در متغیر معرفیشده در قسمت variableName$ قرار خواهد گرفت. بنابراین، در ادامه برنامه میتوان ازطریق همان متغیر، کارهای دلخواه را برروی فایل مربوطه انجام داد. برای درک بهتر، به مثالهای زیر دقت کنید:
// file path : C:WAMPwwwtest.txt // php path : C:WAMPwwwfile.php $fp = fopen('test.txt', 'r'); // file path : C:WAMPwwwtexttest.txt // php path : C:WAMPwwwfile.php $fp = fopen('text/test.txt', 'w'); // file path : C:WAMPwwwtest.txt // php path : C:WAMPwwwcodefile.php $fp = fopen('../test.txt', 'a'); // file path : C:WAMPwwwtexttest.txt // php path : C:WAMPwwwcodefile.php $fp = fopen('../text/test.txt', 'r+');
نکته: برای دسترسی به پوشه والد، از .. استفاده میشود. ضمناً برای جداکردن مسیرها بجای باید از / استفاده کنید.
درصورتی که فایل را مشابه مثال اول و چهارم، در وضعیت خواندن باز کنید اما به هر دلیلی PHP نتواند آنرا باز کند (برای مثال، مسیر اشتباه وارد شده باشد یا به دلیل سطح دسترسی و... PHP نتواند به فایل دسترسی داشته باشد)، هشداری مشابه پیغام زیر در صفحه خروجی ظاهر خواهد شد و مقدار false داخل متغیر موردنظر (مثل fp$ در مثالهای بالا) ذخیره خواهد شد:
Warning: fopen(test.txt): failed to open stream: No such file or directory in C:WAMPwwwfile.php on line 5
که در پیغام مذکور، بجای نام و مسیر فایل و شماره خط، نام و مسیر فایل تولیدکننده خطا و شماره خطی که در آن اقدام به بازکردن فایل شده است، ظاهر خواهد شد.
توجه کنید که پیغامهای هشدار موجب توقف اجرای کد نمیشوند و دستورات بعدی کد پردازش خواهند شد. درنتیجه در دستورات بعد، هر دستوری که اقدام به خواندن از فایل (یا نوشتن در آن) نماید، موجب بروز خطای دیگری خواهد شد. برای پرهیز از چنین وضعیتی، بهتر است فایلها را با یکی از روشهای زیر باز کنیم:
$file = fopen('test.txt', 'r') or die('Error: Can't open the file.'); // or another way if($file = fopen('test.txt', 'r')) { // process the file here }
در ساختار اول، به دلیل وجود قسمت or die، درصورتی که PHP موفق به بازکردن فایل نشود، ضمن نمایش پیغام خطای مشخصشده، به اجرای کد خاتمه میدهد؛ اما در ساختار دوم، بلاک داخل if فقط درصورتی اجرا میشود که فایل با موفقیت باز شود و قسمت بعد از بلاک if درهرصورت اجرا خواهد شد. اینکه کدامیک از ساختارها مناسب است، بستگی به نیاز اسکریپت شما دارد.
بازکردن فایلهای سایر سایتها
برای بازکردن فایلهای یک سایت دیگر، میتوانید مشابه مثال زیر عملکنید:
$file = fopen('http://www.ncis.ir/index.php', 'r');
دقتکنید که فایلهای سایتهای دیگر را فقط میتوان در وضعیت خواندن باز نمود و برای دسترسی به فایلهای سایر سایتها، باید تنظیمات مربوط به allow_url_fopen در فایل تنظیمات PHP یعنی php.ini فعال باشد. ضمناً درصورتی که یک فایل PHP را از یک سایت دیگر درخواستکنید، نتیجه پردازش آن (بصورت یک سند HTML) در اختیار شما قرار میگیرد و به کد منبع PHP مربوطه دسترسی نخواهید داشت.
نوشتن در فایل
بعد از بازکردن فایل در هرکدام از وضعیتهای w و +w و a و +a میتوانیم عمل نوشتن در فایل موردنظر را انجامدهیم. برای اینکار، دستورات مختلفی وجود دارد که یکیاز آنها، دستور fwrite است:
fwrite($file, stringToWrite);
که بجای file$ باید متغیر کنترلکننده فایل (که خروجی fopen را در آن قرار دادهاید) و بهجای stringToWrite متن موردنظر برای ذخیرهسازی را بنویسید. برای مثال، به دستورات زیر توجه کنید:
if($file = fopen('sample.txt', 'a') { fwrite($file, 'Hello!' . PHP_EOL); }
این دستورات موجب بازکردن فایل sample.txt در وضعیت نوشتن در انتهای فایل (Append) میشوند و درصورتی که فایل با موفقیت باز شود، عبارت !Hello همراه با کارکتر رفتن به سطر بعد، در انتهای فایل بازشده درج خواهد شد.
دستور fwrite دارای یک پارامتر اختیاری عددی نیز میباشد که در انتهای همه پارامترها ذکر میشود و درصورت تعیینشدن، از رشته مشخصشده بهاندازه عددی که تعیین میشود در فایل نوشته خواهد شد. مثال:
fwrite($file, 'Hello User!' . PHP_EOL, 5); // writes 5 characters (Hello) in the file
نکته: اگر طول رشته مشخصشده، کمتر از تعداد کارکتر تعیینشده در پارامتر سوم باشد، رشته مربوطه بهطول کامل در فایل نوشته خواهد شد.
دستور دیگری بهنام fputs نیز برای نوشتن در فایل وجود دارد که یک اسم مستعار برای fwrite بوده و ازنظر عملکرد و پارامترهای ورودی، دقیقاً مشابه دستور fwrite است؛ لذا از توضیح آن خودداری میکنیم و شما میتوانید بهدلخواه از هرکدام استفادهکنید.
خواندن از فایل
برای خواندن از فایل، دستورات مختلفی در PHP وجود دارد که هرکدام، روش متفاوتی را برای دریافت اطلاعات از فایل، بکار میبرند. یکی از این دستورات، fgets است که ساختار کلی زیر را دارد:
$line = fgets($file);
که در این ساختار، با هربار اجرای دستور فوق، یک خط از file$ خواندهشده و درون رشته line$ ذخیره میشود. برای خواندن تمام فایل و نمایش آن در خروجی میتوانید از روشی مشابه مثال زیر استفاده کنید:
while(!$feof($file)) { $line = fgets($file); echo "{$line}<br />" . PHP_EOL; }
همانطور که مشاهده میکنید، در این ساختار از یک دستور دیگر بهنام feof برای کنترل شرط حلقه while استفاده شده است. این دستور، یک فایل را مورد بررسی قرار میدهد و درصورت رسیدن به انتهای آن، مقدار true باز میگرداند. بنابراین، در حلقه while مثال قبل، تا زمانی که به انتهای فایل نرسیدهایم (بهدلیل استفاده از !)، هربار یک خط از فایل خواندهشده و درون متغیر line$ قرار میگیرد. سپس توسط دستور echo خط خواندهشده از فایل در خروجی نوشته میشود. البته دستور fgets دارای یک پارامتر اختیاری از نوع عددی نیز میباشد که درصورت ذکرشدن، هربار، بهاندازه یکواحد کمتر از عدد مشخصشده را میخواند و درصورتی که قبلاز خواندن تعداد کارکترهای مشخصشده، به انتهای سطر (یا فایل) برسد، عمل خواندن را متوقفکرده و تا همانقسمت را برمیگرداند. مثال:
$str = fgets($file, 5);
در مثال فوق، با هربار اجرای دستور fgets، چهار کارکتر از فایل خواندهشده و در متغیر str$ ذخیره میشود. اگر قبلاز رسیدن به 4 کارکتر، سطر تمامشود نیز کارکترهای خواندهشده تا همانجا در متغیر str$ ذخیره خواهد شد.
خواندن یک کارکتر از فایل
برای اینکار از دستور fgetc استفاده میشود که ساختار آن بهصورت زیر است:
$char = fgetc($file);این دستور، با هربار فراخوانی، یک کارکتر را از فایل میخواند و بعنوان نتیجه برمیگرداند. بعنوان نمونهای از کاربرد این دستور، به کد زیر که یک فایل را کپی میکند، دقت کنید:
if(($in = fopen('1.txt', 'r')) && ($out = fopen('2.txt', 'w'))) { while(!feof($in)) { $char = fgetc($in); fwrite($out, $char); } }
خواندن کل فایل بصورت متن کامل
گاهی اوقات ممکن است نیاز به ذخیره محتوای یک فایل در یک رشته بصورت یکجا داشتهباشید. در این مواقع، میتوانید از تابع file_get_contents استفادهکنید. این تابع، بطور خودکار فایل را بازکرده، محتوای آنرا خوانده و در متغیر ذخیرهنموده و فایل را میبندد:
$contents = file_get_contents('test.txt');
خواندن یک فایل و ذخیره سطر به سطر در آرایه
در برخی موارد ممکناست نیاز به خواندن یک فایل بهصورت سطر به سطر و قراردادن هرکدام از سطرها در خانههای مختلف یک آرایه داشتهباشید. در چنین مواردی، میتوانید از روش زیر استفادهکنید:
$content = array(); if($file = fopen('test.txt', 'r')) { while(!feof($file)) { $content[] = fgets($file); } }
بدینترتیب، محتوای فایل خواندهشده و بهصورت سطر به سطر در یک آرایه قرار میگیرد. البته PHP یک ساختار بهینهتر نیز بهنام تابع file برای انجام عمل فوق دارد که تمام مراحل بازکردن، خواندن سطر به سطر و قراردادن در آرایه و نهایتاً بستن فایل را با یک دستور انجام میدهد:
$content = file('test.txt');
البته درصورتیکه فایل شما بسیار حجیم باشد، خواندن کل فایل بصورت یکجا ممکناست برروی کارآیی اسکریپت شما و مصرف حافظه آن، اثر نامناسبی بگذارد و بهتر است در چنین مواقعی، از همان روش پردازش سطر به سطر با حلقه while استفادهکنید.
بستن فایل
از آنجا که هر فایل، برای نگهداری کنترلکننده خود از متغیرها استفاده میکند و ازطرفی، در هر لحظه فقط یک نفر (یا برنامه) میتواند یک فایل را باز کند، برای جلوگیری از خرابشدن احتمالی فایل و امکان اتصال کاربران مختلف به فایل، بهتر است بعد از اتمام کار خود با هر فایل، آنرا با دستور fclose ببندید:
fclose($file);
اگر اینکار را انجام ندهید، PHP بطور خودکار تمامی فایلهای بازشده را در پایان اسکریپت، میبندد؛ اما بهتر است که خودتان اینکار را بهمحض اتمام کارتان با یک فایل، انجام دهید. ممکناست در ادامه اسکریپت خود، پردازشهای سنگینی انجامدهید که نیاز به فایل بازشده نداشتهباشند (مثلاً محتوای آنرا درون یک آرایه ذخیره کردهاید) و درنتیجه، آزادکردن فایل امکان دسترسی همزمان کاربران بیشتری را به آن فایل، در زمانی که اسکریپت شما درحال انجام پردازشهای سنگین خود است، خواهد داد.
کار با بانکهای اطلاعاتی
اگر نیاز به ذخیره اطلاعات پیچیدهتری داشتهباشید، بخواهید امنیت آنها را تضمینکنید و یا کاربران زیادی بتوانند بهطور همزمان به دادهها دسترسی داشتهباشند، بانک اطلاعاتی عملکرد بسیار بهتری نسبتبه فایلهای متنی ساده خواهد داشت. بهعلاوه، اگر با یک نرمافزار مدیریت بانک اطلاعاتی (DBMS) آشنا باشید، کارکردن با بانکهای اطلاعاتی بهسادگی استفاده از فایلهای متنی خواهد بود.
درک نرمافزار بانک اطلاعاتی
بانک اطلاعاتی، درحقیقت یک رابط مدیریت فایل است که اطلاعات را بهصورت ساختیافته ذخیره میکند. درنتیجه میتوانید بهسرعت اطلاعات دلخواه خود را در زمان نیاز، بیابید. بانک اطلاعاتی میتواند کوچک باشد (مثلاً اسامی، نشانیها و شمارههای تلفن همه دوستان شما را در خود ذخیرهکند) و یا بصورت انبوهی از اطلاعات باشد که با ساختاری بسیار پیچیده، مدیریت میشود (مثل بانک اطلاعاتی وبسایت گوگل که مشخصات و محتویات سایتهای اینترنتی را در خود نگهداری میکند).
هر بانک اطلاعاتی، بدون اهمیت به اندازه و نوع آن، نیاز به یک نرمافزار مدیریت دارد تا دادهها را بهشکل صحیح ذخیرهنماید و درهنگام نیاز به اطلاعات، آنها را با سرعت مناسب از بانک اطلاعاتی استخراج نماید.
انواع نرمافزارهای مدیریت بانک اطلاعاتی
نرمافزارهای زیادی برای مدیریت بانک اطلاعاتی طراحی شدهاند و هرکدام، نقاط ضعف و قوت خاص خود را دارا میباشند و همه آنها DataBase Management System یا DBMS بهشمار میروند. چند نمونه از DBMSهای معروف را مشاهده میکنید:
- CouchDB
- Firebird
- IBM DB2
- Informix
- Ingres
- MariaDB
- Microsoft Access
- Microsoft SQL Server
- mSQL
- MySQL
- MongoDB
- Oracle
- PostgreSQL
- Redis
- SQLite
- Sybase
البته تعداد DBMSها بسیار زیاد است و برخی از آنها همچون dBase و FoxPro و... بهدلیل عدم امکان استفاده آسان در وب، در فهرست فوق ذکر نشدهاند. درمیان DBMSهای فوق، MySQL محبوبیت بیشتری در وب دارد. بهدلیل امکانات جانبی و سرعت و سهولت کار و مهمتر از همه، سازگاری کامل با PHP (بدون نیاز به نصب افزونههای جانبی)، در این آموزش از MySQL استفاده میکنیم.
نصب DBMS
اولین مرحله برای کار با بانک اطلاعاتی، نصب نرمافزار مدیریت آن است که بهدلیل استفاده از WampServer در این آموزش، MySQL بطور خودکار نصب خواهد شد و لذا، از آموزش نصب آن خودداری میکنیم. گام بعدی، استفاده از یک نرمافزار است که بتوانیم ازطریق آن، بهسهولت با بانک اطلاعاتی کار کنیم. علت این مسئله، آن است که MySQL فقط ازطریق یک محیط متنی (بدون استفاده از رابط گرافیکی کاربر) با بانک اطلاعاتی کار میکند و این مسئله، طبیعتاً خوشایند نیست و کار با آنرا مشکل میکند. یکیاز نرمافزارهای سودمند مدیریت بانک اطلاعاتی، phpMyAdmin است که آنهم بطور خودکار همراهبا WampServer نصب میشود. برای اجرای آن، باید ابتدا برروی آیکن WampServer کلیککرده و سپس، گزینه phpMyAdmin را انتخاب کنید (یا در مرورگر، آدرس localhost/phpmyadmin را فراخوانیکنید).
برای یادگیری بهتر، قصد داریم ساخت بانک اطلاعاتی و جداول داخلی آنرا با phpMyAdmin انجامداده و مابقی کارها را (شامل درج دادههای جدید، خواندن اطلاعات از بانک اطلاعاتی، ویرایش و حذف رکوردها و...) توسط PHP انجامدهیم.
ایجاد بانک اطلاعاتی
از نوار ابزار بالا در قسمت سمت راست، برروی گزینه Databases کلیک کنید و در قسمت Create new database نام بانک اطلاعاتی موردنظر (مثلاً learning) را نوشته و از قسمت Collation، سیستم کدگذاری کارکترها را انتخاب کنید (پیشنهاد میکنیم از utf8_percian_ci استفادهکنید تا بانک اطلاعاتی شما دادههای فارسی را بهشکل صحیح پشتیبانیکند).
حال برروی دکمه Create کلیک کنید تا بانک اطلاعاتی شما ساختهشود. بدینترتیب، با ساختهشدن بانک اطلاعاتی، نام آن به فهرست بانکهای اطلاعاتی در سمت چپ صفحه اضافه میشود. اگر به قسمت Console در پایین پنجره نگاهکنید، دستور MySQL موردنیاز برای انجام اینکار، نوشته شدهاست:
CREATE DATABASE `learning` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci;
بنابراین، مشاهده میکنید که phpMyAdmin به شما کمک میکند تا حتی اگر با ساختار دستورات MySQL آشنایی نداشتهباشید، بهراحتی آنرا بیاموزید.
ایجاد جدول
در قسمت Create table نام دلخواه خود را برای جدول جدید در قسمت Name و تعداد فیلدهای موردنظر را در قسمت Number of columns بنویسید:
بدینترتیب، با صفحهای مشابه تصویر زیر مواجه خواهید شد:
در این صفحه، نام هر فیلد را در ستون Name بنویسید. نوع آنرا در قسمت Type، حداکثر طول مجاز را در قسمت Length/Values (برای فیلدهای متنی) و نوع کدگذاری را در قسمت Collation تظنیمکنید. درصورتی که برای یک فیلد، کدگذاری را تعیین نکنید، از کدگذاری جدول استفاده میشود و درصورتی که برای جدول نیز کدگذاری را تعیین نکنید، از کدگذاری دیتابیس استفاده میشود. اگر میخواهید یک فیلد خاص، اجازه خالیبودن داشتهباشد، در ستون Null کادر انتخاب را تیک بزنید. هر جدول باید حداقل یک فیلد داشتهباشد که در ستون Index آن، گزینه Primary Key (کلید اصلی) انتخاب شده است؛ درغیر اینصورت، سرعت خواندن اطلاعات از جدول بهشدت افت خواهد کرد. همچنین اگر فیلدی را از نوع عددی انتخابکنید و گزینه AutoIncrement یا A_I را انتخابکنید، آن فیلد بطور خودکار شمارهگذاری خواهد شد. حال قصد داریم 4 فیلد بهصورت زیر تعریف کنیم (هیچکدام از فیلدها نمیتوانند خالی باشند) :
- id (ردیف) از نوع عددی صحیح و کلید اصلی و با شمارهگذاری خودکار
- name (نام) از نوع VARCHAR با حداکثر اندازه 255 کارکتر
- stno (شماره دانشجویی) از نوع عددی صحیح
- grade (نمره) از نوع عددی اعشاری
بنابراین، جدول فوق را بهصورت زیر تنظیم میکنیم:
حال برروی دکمه Save کلیک کنید تا جدول ایجاد شود. این هم دستور MySQL ساخت جدول:
CREATE TABLE `learning`.`students` ( `id` INT NOT NULL , `name` VARCHAR(255) NOT NULL , `stno` INT NOT NULL , `grade` FLOAT NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB;
برای آشنایی بیشتر با دستورات MySQL میتوانید از گزینههای Insert و Empty و Drop و Edit و... برای انجام اعمال مختلف استفادهکنید و دستورات MySQL متناظر با هر عمل را در قسمت Console مشاهدهکنید. پساز درج حداقل یک رکورد در جدول، دکمه Browse نیز فعالشده و میتوانید با کمک آن، دستور MySQL لازم برای خواندن اطلاعات را نیز مشاهدهکنید.
اتصال PHP به MySQL
PHP ازطریق توابعی که انحصاراً برای کار با بانک اطلاعاتی طراحی شدهاند، به DBMSهایی نظیر MySQL متصلشده و اعمال موردنظر را انجام میدهد. برای هر DBMS مجموعه دستورات مختلفی وجود دارد که ازطریق آنها، میتوانید با آن DBMS ارتباط برقرار کنید. برای مثال، بهمنظور کار با MySQL باید از دستوراتی که با پیشوند _mysqli شروع میشوند (مثل mysqli_connect و mysqli_query و... استفادهکنید.
اتصال به بانک اطلاعاتی
اولین مرحله برای کار با بانک اطلاعاتی، اتصال به آن است. اینعمل شبیه بازکردن فایل است؛ با این تفاوت که برای اتصال به بانک اطلاعاتی، ابتدا باید به موتور MySQL متصلشویم و سپس دیتابیس موردنظرمان را مشخصکنیم. برای اینکار، نیاز به 4 پارامتر زیر داریم:
- نام سرور
- نام کاربری
- رمز عبور
- نام بانک اطلاعاتی
بهطور پیشفرض در کامپیوترهای شخصی (و نه در سرورهای واقعی) نام سرور، localhost و نام کاربری پیشفرض نیز root و رمز آن نیز یک رشته خالی (بدون رمز عبور) است. بنابراین، درصورتی که تنظیمات پیشفرض را تغییر ندادهباشید، پارامترهای فوق بهترتیب بصورت زیر هستند:
- 'localhost'
- 'root'
- ''
- 'learning'
برای اتصال به MySQL از دستور mysqli_connect استفاده میشود. این دستور، 4 پارامتر را بهترتیب گرفته و نتیجه اتصال را برمیگرداند. درصورتی که هرکدام از پارامترها اشتباه باشند، عمل اتصال انجام نشده و نتیجه false بازگردانده خواهد شد. مثالی از نحوه استفاده از این دستور:
$con = mysqli_connect('localhost', 'root', '', 'learning');
بعد از اجرای این دستور، برای مشخص کردن اتصال MySQL در سایر دستورات کار با بانک اطلاعاتی، میتوانیم از متغیر con$ استفادهکنیم. دقت کنید که میتوان همزمان چند اتصال باز به سرورهای مختلف بانک اطلاعاتی برقرار کرد و در چنین شرایطی، مشخصکردن اتصال جهت انجام کار موردنظر، ضروری خواهد بود.
انجام اعمال موردنظر برروی بانک اطلاعاتی
برای انجام هر عمل برروی بانک اطلاعاتی، از زبان MySQL استفاده میشود. این زبان، شباهت بسیار زیادی به SQL استاندارد دارد و تنها چند مورد امکانات جانبی به آن اضافه شدهاست تا برای استفاده در وب، بهینهتر شود. برای اجرای یک دستور SQL برروی بانک اطلاعاتی از دستور mysqli_query استفاده میشود. این دستور دارای دو پارامتر است که پارامتر اول، اتصال موردنظر و پارامتر دوم، دستوری است که قصد اجرای آنرا دارید. خروجی این دستور در یک متغیر ذخیره میشود که براساس دستور SQL اجراشده، کاربردهای مختلفی دارد و اگر در دستور SQL خطایی وجود داشته باشد، نتیجه false داخل متغیر قرار خواهد گرفت. برای مثال:
$result = mysqli_query($con, 'SELECT * FROM `students` ORDER BY `id`');
اگر دستور SQL اجرا شده، مشابه مثال بالا یک دستور خواندن (SELECT) باشد، نتیجه بصورت مجموعه ای از رکوردها با ساختار خاص در حافظه ذخیره میشود و بعداً میتوان با کمک دستورهای دیگری، آنرا مورد دسترسی قرار داد. درمورد سایر دستورات مثل UPDATE و DELETE و... نیز ازطریق خروجی تولیدشده میتوان اعمال مختلفی ازقبیل بدستآوردن تعداد رکوردهایی که تحت تأثیر دستور مربوطه تغییر کردهاند و... را انجامداد.
محاسبه تعداد رکوردهای بدستآمده
درصورتی که از دستور SELECT استفاده شده باشد، میتوان با کمک دستور mysqli_num_rows تعداد رکوردهای بدستآمده از دیتابیس را محاسبهکرد:
echo mysqli_num_rows($result);
محاسبه تعداد رکوردهای ویرایششده توسط دستورات UPDATE و DELETE و...
برای محاسبه تعداد رکوردهایی که توسط آخرین دستور mysqli_query تغییر کردهاند، باید از دستور mysqli_affected_rows استفادهکنید:
$count = mysqli_affected_rows($con);
دقت کنید که پارامتر این دستور، اتصال MySQL است و نه خروجی دستور mysqli_query
استخراج یک رکورد از مجموعه رکوردهای بدستآمده از دیتابیس
خروجی دستور mysqli_query حتی با وجود استفاده از دستور SELECT، مستقیماً توسط PHP قابل استفاده نیست، زیرا نتایج با ساختار قابلفهم برای MySQL در حافظه RAM قرار میگیرند و خروجی دستور mysqli_query یک اشارهگر به محل اطلاعات در حافظه RAM خواهد بود. برای استخراج نتایج بهشکل قابلاستفاده در PHP باید از یکیاز دستورات زیر استفادهکنید: تمامی دستورات فوق، کار مشترکی را انجام میدهند و آن، استخراج یک رکورد از حافظه و بازگرداندن آن بصورت قابل استفاده در PHP است و اگر به آخرین رکورد حافظه رسیده باشند، نتیجه false برمیگردانند. تفاوت آنها در نوع خروجی است که میسازند. دستور mysqli_fetch_row نتایج را بهصورت یک آرایه با اندیس عددی برمیگرداند که در آن، اولین فیلد با اندیس 0، فیلد بعدی با اندیس 1 و... مشخص شدهاند. دستور mysqli_fetch_assoc همانگونه که از نامش پیداست، یک آرایه انجمنی میسازد که در آن، اندیس هر فیلد، نام همان فیلد در جدول دیتابیس خواهد بود (id و name و...). دستور mysqli_fetch_array در اصل دارای یک پارامتر دوم است که اختیاری بوده و درصورتی که قید نشود، مقدار پیشفرض MYSQLI_BOTH را خواهد داشت. در این حالت خروجی این دستور، یک آرایه با حجم دوبرابر حالت عادی است؛ زیرا برای هر فیلد، هر دو حالت اندیس عددی و اندیس رشتهای ثبت میشود. برای مثال، رکوردهای جدول students با فیلدهای 0 و id برای فیلد اول، 1 و name برای فیلد دوم و... تولید خواهد شد. اگر پارامتر دوم را با مقدار MYSQLI_NUM تنظیمکنید، مشابه mysqli_fetch_row عمل خواهد کرد و درصورتی که از مقدار MYSQLI_ASSOC استفادهکنید، مشابه mysqli_fetch_assoc عمل خواهد نمود. دستور آخر یعنی mysqli_fetch_object کمی با بقیه متفاوت است و خروجی آن، یک شئ است که میتوان از آن بصورت شئگرا استفاده نمود و برای مثال، برای خواندن فیلد name بهصورت obj->name$ استفادهکرد (درمورد این دستور، بعد از توضیح مباحث شئگرایی بیشتر توضیح خواهیمداد). توصیه ما در اکثر موارد، استفاده از mysqli_fetch_assoc است. بعنوان نمونه، به کد زیر دقتکنید:
<!doctype html> <html> <head> <title>DataBase DEMO</title> </head> <body> <?php $con = mysqli_connect('localhost', 'root', '', 'learning'); $result = mysqli_query($con, 'SELECT * FROM `students` ORDER BY `id`'); echo '<table border="1" cellpadding="10px" cellspacing="0" width="100%">' . PHP_EOL; echo '<tr align="center" valign="middle" bgcolor="#ccccff">' . PHP_EOL; echo '<th>ID</th><th>Name</th><th>Student Number</th><th>Grade</th>' . PHP_EOL; echo '</tr>' . PHP_EOL; while($row = mysqli_fetch_assoc($result)) { echo '<tr align="center" valign="middle" bgcolor="#ffcccc">' . PHP_EOL; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . $row['name'] . '</td>'; echo '<td>' . $row['stno'] . '</td>'; echo '<td>' . $row['grade'] . '</td>'; echo '</tr>' . PHP_EOL; } echo '</table>' . PHP_EOL; ?> </body> </html>
نتیجه اجرای کد فوق را در تصویر زیر مشاهدهکنید: