ایجاد سیستم like مطالب با PHP و AJAX
اول از همه باید جدول های دیتابیس خودمون رو بسازیم،ما اینجا دو تا جدول داریم یکی جدول مطالب (posts) و یکی هم جدول likes،جدول مطالب به غیر از ستون های معمول خودش که میتونه عنوان مطلب یا متن مطلب یا هر چیز دیگه ای که داره،دارای تو ستون up و down هست که تعداد لایک های مثبت و منفی رو توی خودشون نگهداری میکنن.
خوب این کد SQL ساخت جدول مطالب :
خوب حالا ما جدول likes رو داریم،که این جدول لایک هایی که برای یه مطلب ثبت میشه رو توی خودش نگه میداره (با استفاده از این جدول میتونیم محدودیت IP کاربران یا مثلا محدودیت هر لایک برای هر مطلب توی ۲۴ ساعت قرار بدیم)،توی این جدول ما ستون های ip_id,ip,p_id,ip_date رو داریم (عجب چیزی شد ۱x1.trans آموزش کامل ایجاد سیستم like مطالب با PHP و AJAX (قسمت چهارم) !)،ستون ip_id همون primary_key ماست که از ورود داده های تکراری جلوگیری میکنه،ستون ip هم ip کاربر رو توی خودش نگهداری میکنه،ستون p_id هم id مطلبی که برای اون لایک خورده رو نگهداری میکنه (ما این ستون رو به صورت Foreign Key تعریف میکنیم تا مطمئن باشیم که مقادیری که توی این ستون قرار میگیره دقیقا همون مقادیری هست که توی ستون id جدول مطالب قرار میگیره).
خوب اینم از کد ساخت جدول likes:
توی خط اخر هم میبینید که توی تعریف Foreign key ما بعدش از کلمه References استفاده کردیم،خوب واسه اینه که مرجع این ستون ما (p_id) همون ستون id جدول باشه دیگه،دلیلشم بالا گفتم.
حالا باید شروع کنیم به ساخت صفحه php منبع،اگه یادتون باشه ما توی تابع های درخواست ای جکس خودمون توی متد open یه کوئری استریگ رو تعریف کردیم حالا بایدتوی این صفحه مقادیر اون کوئری استریگ رو دریافت کنیم.
اول بگم فایل database توی فایل پروژه هست پس نگران نباشید،ما دو تا متغییر دریافت میکنیم یکی func یکی هم id (این id همون id مطلب ما هست که باید برای ثبت لایک اینجا لازمش داریم،البته من اینو توی قسمت ویرایش ها اضافه کردم و توضیحش برا قسمت بعده پس اصلا نگران نباشید)،متد ارسال ما GET بود پس با GET دریافت میکنیم،متغییر های func و id رو که تعریف کردیم مقدار دهی میکنیم و چک میکنیم که اگه خالی بودن ار برنامه خارج شو (این برا اینه که یکی شیطونی نکنه و ادرس رو مستقیم بده و اطلاعات خالی بفرسته و دردسر های بعدش پیش بیاد).
ما برای حالت های مختلفی که داشتیم توی قسمت ای جکس یه تابع نوشتیم حالا باید به تناسب هر درخواستی که دریافت میکنیم پاسخ مناسب رو بدیم،ما برای اینجا یه دستور switch ایجاد کردیم که چک میکنه ببینه مقدار func ما چیه و بعدش تابع مناسب رو برای ما اجرا میکنه.
خوب می بینید که برای هر درخواست تابع مناسب رو فراخوانی کرده و id مطلب رو هم بهش ارسال کرده،حالا به ترتیب این توابع رو می نویسیم .
تابع update like
function updatelike($id){
$user_ip=$_SERVER[‘REMOTE_ADDR’];
$db=new DB();
$db->connect();
$result=$db->query(“SELECT * FROM posts where id='{$id}'”);
$row=$db->fetch_array($result);
if(!user_validation($user_ip,$row[‘id’]))
{
echo ‘رای شما قبلا برای این مطلب ثبت گردیده است’;
return;
}
$newlike=++$row[‘up’];
$db->query(“UPDATE `posts` SET `up` ={$newlike} WHERE `id` ='{$id}'”);
$db->query(“INSERT INTO likes(ip,p_id,ip_date) VALUES(‘{$user_ip}’,'{$row[‘id’]}’,NULL)”);
$db->disconnect();
unset($db);
echo ‘رای شما با موفقیت ثبت گردید’;
}
خوب اول از همه ip کاربر رو دریافت کردیم،بعدش به بانک متصل شدیم،یه کوئری انجام دادیم که تمام فیلدهای جدول پست رو متناسب با id دریافت کن،مقادیر رو هم گرفتیم و توی row$ گذاشتیم،بعدش ما نیاز داریم تا کاربر رو اعتبار سنجی کنیم ببینیم فبلا امتیاز داده یانه پس براش یه تابع نوشتیم که آخر کار توضیح میدم،مقدار id مطلب و اون ip رو هم براش ارسال میکنیم (شما می تونید این اعتبار سنجی رو بذارید اول تابع حالا من سلیقه ای گذاشتم اینجا،البته بهتره بذارید اول تابع)،اگه کاربر اعتبار سنجی شد که میره برا ثبت لایک،اگه نه پیغام نشون میده رای شما قبل ثبت شده،خوب حالا اگه اعتبار سنجی شد مقدار فیلد up رو یکی افزایش میدیم و با یه کوئری توی دیتابیس ثبتش میکنیم،یه کوئری هم میزنیم برای جدول likes که ip کاربر،id, و تاریخ رو براش ثیت می کنیم (البته من تاریخ رو به صورت NULL گذاشتم که مجبور نباشیم حتما براش مقداری ارسال کنیم،شما اگه خودتون خواستین می تویند براش تاریخ جاری رو ارسال کنید)،خوب بعدشم قطع ارتباط از دیتابیس و نشون دادن پیغام رای شما ثبت شد.
تابع updatedislike
function updatedislike($id){
$user_ip=$_SERVER[‘REMOTE_ADDR’];
$db=new DB();
$db->connect();
$result=$db->query(“SELECT * FROM posts where id='{$id}'”);
$row=$db->fetch_array($result);
if(!user_validation($user_ip,$row[‘id’]))
{
echo ‘رای شما قبلا برای این مطلب ثبت گردیده است’;
return;
}
$newlike=++$row[‘down’];
$db->query(“UPDATE `posts` SET `down` ={$newlike} WHERE `id` ={$row[‘id’]}”);
$db->query(“INSERT INTO likes(ip,p_id,ip_date) VALUES(‘{$user_ip}’,'{$row[‘id’]}’,NULL)”);
$db->disconnect();
unset($db);
echo ‘رای شما با موفقیت ثبت گردید’;
}
خوب دقیقا شبیه همون تابع بالاست فقط ستون down رو چک میکنیم،پس توضیح خاصی نداره.
تابع showlike
این تابع خیلی ساده است،فقط مقدار ستون up رو می گیریم و نشون میدیم همین.
تابع showdislike
این تابع هم شبیه تابع بالایه فقط مقدار down رو دریافت میکنه و نمایش میده.
خوب حالا فقط میمونه تابع اعتبار سنجی کاربر :
function user_validation($user_ip,$p_id)
{
$db=new DB();
$db->connect();
$result=$db->query(“SELECT * FROM likes WHERE p_id='{$p_id}’ and ip='{$user_ip}’ LIMIT 1”);
$row=$db->fetch_array($result);
if($row)
{
return false;
}
else {
return true;
}
}
خوب این جا هم id مطلب و ip کاربر رو که از تابع اصلی گرفتیم (updatelike یا updatedislike) توی کوئری ارسال کردیم و اگه مقداری برگشت داده بشه معلومه این کاربر به این مطلب قبلا رای داده پس مقدار false برمیگردونه و اگه نه که true برمیگردونه.
فقط یه تابع اعتبار زمان میمونه که من اینو رو نوشتم اما استفاده نکردم،میشه باهاش تنظیم کرد که هر کابر توی مثلا ۲۴ ساعت یکبار بتونه برای مطلب لایک بزنه،دیگه تنظیم زمانش بر عهده خودتون چون سلیقه ایه،فقط اگه خواستین حتما توی تابع updatelike و updatedislike اعمالش کنید.
اون مقداری که به تابع میدیم باید از جدول likes واکشی کنیم،ما اون زمان ثبت لایک رو با زمان حال مقایشه میکنیم و اگه تفاوتشون بیشتر از یک روز باشه کاربر بازم میتونه برا اون مطلب لایک بزنه.فقط اینطوری باید تو تابع اعتبار کاربر هم دستکاری بکنیم و گرنه این تابع درست کار خودشو انجام نمیده.