در سری آموزشهای پیاچپی در چند جلسه گذشته در مورد نحوه اتصال به بانکهای اطلاعاتی و نیز انجام برخی عملیات مانند درج اطلاعات صحبت کردیم. در این جلسه قصد داریم روش خواندن اطلاعات از بانک اطلاعاتی MySQL را در پیاچپی به شما آموزش دهیم. بدین طریق میتوانید اطلاعات موجود در جداول را به کاربران نمایش دهید یا برای عملیات مختلف آن را در دسترس قرار دهید. در ادامه با ما همراه شوید.
همانطور که گفتیم این جلسه در مورد خواندن اطلاعات از جداول بانک اطلاعاتی MySQL صحبت میکنیم. اما این کار به چه منظور انجام میشود؟ انتخاب اطلاعات و خواندن آنها برای نمایش این اطلاعات به کاربر یا انجام عملیات دیگر انجام میشود.
خواندن اطلاعات از MySQL
ابتدا نرمافزار Xampp را مثل همیشه باز کرده و سرورهای Apache و MySQL را در حالت اجرا قرار دهید. حال پوشه cms که جلسات قبل آن را ایجاد کردهاید، باز کنید.
در این پوشه یک فایل جدید به نام index.php بسازید. این صفحه قرار است به منظور نمایش اطلاعات مورد استفاده قرار گیرد. در این صفحه ما با استفاده از دستورات پیاچپی و مایاسکیوال، اطلاعات مربوط به پستهای ثبت شده در جدول posts که در بانک اطلاعاتی cms ساخته بودیم را میخوانیم و آنها را در مرورگر به نمایش درمیآوریم. کد زیر را در فایل index.php قرار دهید تا در ادامه آن را بررسی کنیم و کار هر خط از این کد را برایتان توضیح دهیم.
<!DOCTYPE html>
<html dir=”rtl” lang=”fa-IR”>
<head>
<title>صفحه اصلی</title>
<meta charset=”utf-8″ />
</head>
<body style=”font-family: tahoma; font-size:14px;”>
<center>
<?php
include (“config.php”);
//select all records from posts table
$get_query = mysql_query(“SELECT * FROM `posts`”);
//now using while for get each record sepratly and show it to web browser
while ($fetch_result = mysql_fetch_array($get_query))
{
$postTitle = $fetch_result[‘title’];
$postText = $fetch_result[‘text’];
echo “<h2>$postTitle</h2>”;
echo “<p>$postText</p><hr>”;
}
?>
</center>
</body>
</html>
همانطور که در کد بالا میبینید ابتدا با دستور inlcude فایل اتصال به بانک اطلاتی و انتخاب جدول cms که config.php نام دارد را در این فایل فراخوانی میکنیم. حالا میتوانیم به جدول موردنظر که در اینجا posts است کوئری زده و عملیات موردنظرمان را انجام دهیم. با دستور SELECT جدول و فیلدهای موردنظر را انتخاب میکنیم و آن را در یک آرایه به نام posts_query ذخیره میکنیم.
کوئری موردنظر برای انتخاب دادهها به این صورت است که ابتدا کلمه SELECT را نوشته و سپس نام فیلدهایی که قصد خواندن آنها را داریم وارد میکنیم و آنها را با کاما انگلیسی از یکدیگر جدا میسازیم. البته اگر بخواهیم تمام فیلدها را با هم بخوانیم کافی است از کاراکتر ستاره (*) یعنی همانطور که ما در کد بالا نوشتهایم استفاده کنیم. سپس کلمه کلیدی FROM و بعد از آن نام جدولی که قصد خواندن اطلاعاتش را داریم مینویسیم.
حال با استفاده از حلقه while تا زمانی که در جدول post رکورد وجود دارد پستها را گرفته و نمایش میدهیم. در شرط حلقه خروجی تابع mysql_fetch_array را در یک آرایه دیگر به نام fetch_results ذخیره میکنیم. بهطور همزمان این شرط باعث میشود تا حلقه به تعداد رکوردهایی (مطالبی) که در جدول posts وجود دارد تکرار شود. در هر بار تکرار شدن این حلقه اطلاعات فیلدهای مختلف هر رکورد در آرایه fetch_results ذخیره میشود. برای دسترسی به اطلاعات هر فیلد از هر رکورد باید نام آن فیلد را در کروشه جلوی آرایه fetch_results بنویسیم. همانطور که در کد بالا میبینید ما فیلدهای title و text را فراخوانی کردهایم.
اگر این کد برای شما مبهم است اصلا جای نگرانی نیست چراکه اکثر برنامهنویسان پیاچپی برای فراخوانی چند رکورد از بانکهای اطلاعاتی mysql از همین روش یا روشهای مشابه دیگر بهره میبرند. در ادامه آموزشها با روشهای دیگر نیز آشنا خواهید شد. نکته بسیار مهمی که باید بدانید این است که باید عملیات فراخوانی اطلاعات از جداول بانکهای اطلاعاتی را تا جایی که دستتان برای این کار روان شود تمرین و تکرار کنید.
حالا آدرس http://127.0.0.1/cms/index.php را در مرورگر اجرا کنید. اگر خاطرتان باشد نوع یونیکد فیلدهای جداول بانک اطلاعاتی را از نوع utf-8 تعیین کردیم تا بتوانیم متون فارسی را در جدول posts ذخیره کنیم. حال اگر پروژه را با آدرسی که گفتیم اجرا کنید با صفحهای مانند زیر مواجه خواهید شد و کاراکترها همگی به صورت علامت سوال نمایش مییابند.
اما باز هم جای نگرانی نیست. این مشکل به دلیل نوع اتصال به بانک اطلاعاتی رخ داده و برای رفع آن باید فایل config.php را کمی ویرایش کنید. در واقع باید نوع اتصال را هم utf-8 تعیین کنیم که این کار بسیار آسان است. فایل config.php را باز کنید و آن را به صورت زیر تغییر دهید. در واقع کد زیر را جایگزین کد کنونی کنید.
<?php
$dbhost = “localhost”;
$dbuser = “root”;
$dbname = “cms”;
$dbpass = “”;
$connect_db = mysql_connect ($dbhost, $dbuser, $dbpass);
mysql_set_charset(‘utf8’,$connect_db);
mysql_select_db($dbname,$connect_db);
?>
همانطور که میبینید در خط ۷ کد بالا از تابع mysql_set_charset استفاده کردهایم. پس از اتصال به بانک داده و پیش از انتخاب جدول موردنظر، باید این کد را استفاده کنید. این تابع دو آرگومان ورودی دارد که ورودی اول نوع یونیکد موردنظر برای اتصال به سرور MySQL و ورودی دوم لینک تابع اتصال به بانک داده خواهد بود که در اینجا connect_db است.
حالا اگر مجددا به صفحه http://127.0.0.1/cms/index.php مراجعه کنید مشکل رفع شده و متون فارسی به درستی نمایش یافتهاند. اگر خاطرتان باشد گفتیم که استفاده از include باعث میشود در صورت نیاز به انجام تغییرات، با تغییر یک فایل میتوان این تغییرات را در تمامی فایلها اعمال کرد.
اگر همه چیز را به درستی انجام داده باشید نتیجه کار باید شبیه به عکس بالا باشد و متون فارسی به درستی نمایش یابند.
ایجاد صفحه اختصاصی برای هر پست
اگر دقت کرده باشید در اکثر سایتهای محتوایی، هر مطلب یک لینک ثابت دارد که معمولا با کلیک روی عنوان آن به صفحه مخصوص مطلب منتقل میشوید. برای اینکه یک صفحه منحصر به فرد برای هر مطلب ایجاد کنیم باید از مشخصهای در هر پست بهره ببریم که یکتا باشد. هنگام طراحی جدول posts فیلد id را به نحوی تعیین کردیم که با ایجاد هر رکورد در جدول یک واحد افزایش یابد. پس میتوان با استفاده از همین id برای هر پست یک صفحه اختصاصی ایجاد کرد.
اگر بهیاد داشته باشید گفتیم از روش GET که در ثبت فرمها آن را توضیح دادیم میتوان استفادههای مناسبی در پیاچپی کرد. یکی از بهترین استفادهها ایجاد صفحه اختصاصی برای هر پست است. کافی است بعد از خط ۲۰ یعنی:
$postText = $fetch_result[‘text’];
یک خط جدید اضافه کنید. خط زیر را پس از خط ۲۰ اضافه کنید تا آیدی هر پست را با هربار اجرای حلقه مانند عنوان و متن پستها دریافت کنیم و آن را در یک متغیر به نام postId ذخیره کنیم.
$postId = $fetch_result[‘id’];
حالا کد:
echo “<h2>$postTitle</h2>”;
را به:
echo “<h2><a href=single.php?id=$postId>$postTitle</a></h2>”;
تغییر دهید. به این طریق یک لینک منحصر به فرد برای هر مطلب ایجاد کردهایم. به عنوان مثال اگر روی مطلب اول کلیک کنیم به لینک http://127.0.0.1/cms/singe.php?id=1 منتقل خواهیم شد. حالا به راحتی میتوان با دستورات پیاچپی اطلاعات پستی که آیدی آن ۱ است را نشان دهیم.
ابتدا یک فایل جدید در پوشه cms ایجاد کرده و نام آن را single.php بگذارید. در این فایل کدهای زیر را قرار دهید:
<!DOCTYPE html>
<html dir=”rtl” lang=”fa-IR”>
<head>
<title>مشاهده پست</title>
<meta charset=”utf-8″ />
</head>
<body style=”font-family: tahoma; font-size:14px;”>
<center>
<?php
include (“config.php”);
$pid = $_GET[‘id’];
//select all records from posts table
$get_query = mysql_query(“SELECT * FROM `posts` WHERE `id` = ‘$pid’ “);
$fetch_result = mysql_fetch_array($get_query);
$postTitle = $fetch_result[‘title’];
$postText = $fetch_result[‘text’];
echo “<h2>$postTitle</h2>”;
echo “<p>$postText</p><hr>”;
?>
</center>
</body>
</html>
این کد نیز شبیه به کد index.php است با این تفاوت که این بار در کوئری انتخاب داده از بانک اطلاعاتی تغییراتی وجود دارد و نیز دیگر نیازی به استفاده از حلقه نداریم زیرا در اینجا فقط قصد داریم یک رکورد را از جدول posts بخوانیم.
مثل همیشه ابتدا config.php را با دستور include فراخوانی کرده و سپس با دستور GET_$ همانطور که در جلسه آموزش فرمها گفتیم، شناسه پست موردنظر را در متغیری به نام pid ذخیره میکنیم.
حال باید کوئری را با یک شرکت به کار ببریم. مانند کوئری فایل index.php دستور اولیه را نوشته و در ادامه آن کلمه کلیدی WHERE را مینویسیم. این کلمه به بانک اطلاعاتی میگوید که ما دقیقا دنبال چه رکورد یا رکوردهایی هستیم. در اینجا ما به دنبال رکوردی هستیم که فیلد id آن برابر با یک است پس فیلدی که باید بررسی شود id است. حال نام فیلد را هم نوشته و پس از علامت = نام متغیری که شناسه آیدی پست موردنظر را در خود دارد مینویسیم. به طور خلاصه میتوان گفت این کوئری در جدول posts به دنبال فیلدی میگردد که شناسه id آن برابر با عدد ۱ است.
همان شرطی که در فایل index در حلقه به کار بردیم را اینبار بدون حلقه مورد استفاده قرار میدهیم و همانند فایل index از طریق آرایهها به مقادر فیلدهای پست موردنظر دسترسی مییابیم.
حال سیستم مدیریت محتوای ما کاملتر شده و میتوان با آن مطلب ارسال کرد، پستها را مشاهده کرد و نیز با کلیک روی عنوان هر پست به صفحه اختصاصی آن پست منتقل شد.
فایل index.php نهایی به شکل زیر خواهید بود-
همچنین فایل single.php پس از کلیک روی عنوان اولین مطلب به شکل زیر است:
امیدواریم از این جلسه نیز نهایت استفاده را برده باشید. برای تمرین سعی کنید برای جدول posts فیلدهای بیشتری تعریف کنید. مثلا یک فیلد برای خلاصه متن مطلب هم ایجاد کنید و با توجه به آنچه تاکنون یاد گرفتهاید هنگام درج مطلب به کاربر اجازه دهید تا سه فیلد را برای هر مطلب پر کند. سپس در صفحه index خود خلاصه و عنوان پست را نمایش دهید و در صفحه اختصاصی هر پست در فایل single.php متن کامل مطلب را به نمایش بگذارید.
در جلسات آینده روش بروزرسانی اطلاعات ثبت شده و نیز حذف آنها را خواهید آموخت. در صورت داشتن هر گونه سوال آن را در بخش نظرات اعلام کنید.