سلام دوستان،توی قسمتهای قبلی ما کدهای مربوط به قسمت طراحی و هم چنین کدهای درخواست ای جکس رو نوشتیم ،تو این قسمت کدهای PHP و mysql رو مینویسیم،قبل از شروع من باید یه نکته بگم و اونم اینه که به خاطر کارکرد بهتر کدهای من تغییرات جزئی رو در کدهای HTML و جاوا اسکریپت دادم که شما میتونید از فایل پروژه دانلود کنید و توضیح این قسمتهای ویرایش شده هم میمونه برای قسمت بعدی که قسمت آخر هم هست.
فهرست محتوای این مقاله
شروع مرحله به مرحله
خوباول از همه باید جدولهای دیتابیس خودمون رو بسازیم،ما اینجا دو تا جدول داریم یکی جدول مطالب (posts) و یکی هم جدول likes،جدول مطالب به غیر از ستونهای معمول خودش که میتونه عنوان مطلب یا متن مطلب یا هر چیز دیگه ای که داره،دارای تو ستون up و down هست که تعداد لایکهای مثبت و منفی رو توی خودشون نگهداری میکنن.
خوب این کد SQL ساخت جدول مطالب :
CREATE TABLE IF NOT EXISTS `posts` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `p_title` text NOT NULL, `p_body` text NOT NULL, `up` bigint(20) NOT NULL, `down` bigint(20) NOT NULL, PRIMARY KEY (`id`) )
البته ما این جا برای راحتی کار ستونها رو ساده گرفتیم چون کار اصلی ما با همون دو تا ستون up و down هست.
خوب حالا ما جدول likes رو داریم،که این جدول لایک هایی که برای یه مطلب ثبت میشه رو توی خودش نگه میداره (با استفاده از این جدول میتونیم محدودیت IP کاربران یا مثلا محدودیت هر لایک برای هر مطلب توی 24 ساعت قرار بدیم)،توی این جدول ما ستونهای ip_id,ip,p_id,ip_date رو داریم (عجب چیزی شد 🙂 !)،ستون ip_id همون primary_key ماست که از ورود دادههای تکراری جلوگیری میکنه،ستون ip هم ip کاربر رو توی خودش نگهداری میکنه،ستون p_id هم id مطلبی که برای اون لایک خورده رو نگهداری میکنه (ما این ستون رو به صورت Foreign Key تعریف میکنیم تا مطمئن باشیم که مقادیری که توی این ستون قرار میگیره دقیقا همون مقادیری هست که توی ستون id جدول مطالب قرار میگیره).
خوب اینم از کد ساخت جدول likes:
CREATE TABLE IF NOT EXISTS `likes` ( `ip_id` bigint(20) NOT NULL AUTO_INCREMENT, `ip` varchar(30) NOT NULL, `p_id` bigint(20) NOT NULL, `ip_date` datetime DEFAULT NULL, PRIMARY KEY (`ip_id`), FOREIGN KEY (`p_id`) REFERENCES `posts` (`id`); )
توی خط اخر هم میبینید که توی تعریف Foreign key ما بعدش از کلمه References استفاده کردیم،خوب واسه اینه که مرجع این ستون ما (p_id) همون ستون id جدول باشه دیگه،دلیلشم بالا گفتم.
حالا باید شروع کنیم به ساخت صفحه php منبع،اگه یادتون باشه ما توی تابعهای درخواست ای جکس خودمون توی متد open یه کوئری استریگ رو تعریف کردیم حالا بایدتوی این صفحه مقادیر اون کوئری استریگ رو دریافت کنیم.
include_once('database.php'); $func=null; $id=null; if(isset($_GET['func']) && isset($_GET['id'])) { $func=$_GET['func']; $id=$_GET['id']; if(empty($func) || empty($id)) { exit; } }
اول بگم فایل database توی فایل پروژه هست پس نگران نباشید،ما دو تا متغییر دریافت میکنیم یکی func یکی هم id (این id همون id مطلب ما هست که باید برای ثبت لایک اینجا لازمش داریم،البته من اینو توی قسمت ویرایشها اضافه کردم و توضیحش برا قسمت بعده پس اصلا نگران نباشید)،متد ارسال ما GET بود پس با GET دریافت میکنیم،متغییرهای func و id رو که تعریف کردیم مقدار دهی میکنیم و چک میکنیم که اگه خالی بودن ار برنامه خارج شو (این برا اینه که یکی شیطونی نکنه و ادرس رو مستقیم بده و اطلاعات خالی بفرسته و دردسرهای بعدش پیش بیاد).
ما برای حالتهای مختلفی که داشتیم توی قسمت ای جکس یه تابع نوشتیم حالا باید به تناسب هر درخواستی که دریافت میکنیم پاسخ مناسب رو بدیم،ما برای اینجا یه دستور switch ایجاد کردیم که چک میکنه ببینه مقدار func ما چیه و بعدش تابع مناسب رو برای ما اجرا میکنه.
switch ($func) { case 'updatelike':updatelike($id); break; case 'updatedislike':updatedislike($id); break; case 'showlike':showlike($id); break; case 'showdislike':showdislike($id); break; default: exit; break; }
خوب میبینید که برای هر درخواست تابع مناسب رو فراخوانی کرده و 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
function showlike($id) { $db=new DB(); $db->connect(); $result=$db->query("SELECT * FROM posts where id='{$id}'"); $row=$db->fetch_array($result); echo $row['up']; $db->disconnect(); unset($db); }
این تابع خیلی ساده است،فقط مقدار ستون up رو میگیریم و نشون میدیم همین.
تابع showdislike
این تابع هم شبیه تابع بالایه فقط مقدار down رو دریافت میکنه و نمایش میده.
function showdislike($id) { $db=new DB(); $db->connect(); $result=$db->query("SELECT * FROM posts where id='{$id}'"); $row=$db->fetch_array($result); echo $row['down']; $db->disconnect(); unset($db); }
خوب حالا فقط میمونه تابع اعتبار سنجی کاربر :
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 برمیگردونه.
فقط یه تابع اعتبار زمان میمونه که من اینو رو نوشتم اما استفاده نکردم،میشه باهاش تنظیم کرد که هر کابر توی مثلا 24 ساعت یکبار بتونه برای مطلب لایک بزنه،دیگه تنظیم زمانش بر عهده خودتون چون سلیقه ایه،فقط اگه خواستین حتما توی تابع updatelike و updatedislike اعمالش کنید.
function validtime($time1) { $ts1=strtotime($time1); $ts2=strtotime(date("Y-m-d H:i:s")); $diff=$ts2-$ts1; $day=floor($diff/3600/24); return ($day>1)?true:fasle; }
اون مقداری که به تابع میدیم باید از جدول likes واکشی کنیم،ما اون زمان ثبت لایک رو با زمان حال مقایشه میکنیم و اگه تفاوتشون بیشتر از یک روز باشه کاربر بازم میتونه برا اون مطلب لایک بزنه.فقط اینطوری باید تو تابع اعتبار کاربر هم دستکاری بکنیم و گرنه این تابع درست کار خودشو انجام نمیده.
راستی توی فایل config.php تنظیمات دیتابیس خودتون رو وارد کنید،توی پوشه img هم دوتا تصویر لایک دیگه هست ،برای تنوع.
خوب اینم از این سیستم لایک دهی مطالب،قسمت بعد که قسمت آخر هست نحوه استفاده توی سایت رو هم نشون میدیم.
موفق و پیروز باشید.
دموی نهایی پروژه (برای دمو شرط اعتبار رو برداشتم)
اما من این افزونه رو هنوز بدون تغییر گذاشتم و تغییری ندادم کش میکنه. حالا خارج از همه اینا چطور میشه جای امتیاز منفی که شما گذاشتین اسمشو dislike کاری کرد که dislike برای برداشتن لایک باشه. یعنی مثلا من لایک کردم پستی رو حالا پشیمون شدم میخوام لایکمو بردارم وگزینه دیس لایک رو میزنم لایک برداشته بشه و spin دیس لایک تا وقتی گزینه لایک زده نشده نشون داده نشه
هم با موزیلا و هم با کروم تست کردم و وقتی موس رو هم میرم روش عددی که کنارش ظاهر میشه مقدار قبلی رای هستش و مقدار جدید که باید افزوده شده باشه نیست
الان اگه تابع اعتبار سنجی فعال باشه شما دیگه نمیتونید رای بدید،باید از دیتابیس پاکش کنید تا بتونید دوباره بدید.
داداش منظور من اصلا اینچیزا نیست. من ساختار کلی این سیستم رو متوجه شدم. یه توضیح ساده میدم تو تیبل posts جدول up مقدار امتیازات مثبت رو ذخیره میکنه حالا مثلا ما دستی این مقدار رو میذاریم 300 و وقتی صفحه رو رفرش میکنم باید وقتی موس روی علامت مثبت میبرم مقدارش 300 باشه ولی همون مقدار قبلی که مثلا 1 بوده هستش و هر چند بار که اف 5 هم بزنم عوض نمیشه الا زمانی که کلا هیستوری مرورگر رو خالی کنم. که نباید چنین چیزی باشه چون مقدار دیتابیس که نباید کش بشه . احتمالا مشکلی تو نوشتن این کد ها وجود داشته که مقدار هارو کش میکنه
بعضی از افزونه ها دیتابیس رو کش میکنن،ما این کد رو تست کردیم و مشکلی نداشته.
مشکل رو رفع کردم . فقط موضوعی این مقدا ها بصورت ایجکس تغییر نمیکنه برام و تو کوکی و کش مرورگر ثبت میشه مثلا رای میدم تغییر نمیکنه مقدارش به همون صورت میمونه و تو کوکی ذخیره میشه و باید تمام کوکی مرورگرو پاک کنم تا دوباره مقدار رای رو نشون بده. ❗
رای ها بر اساس آی پی و در دیتابیس ثبت میشه.
متوجه منظور بنده نشدید به ادرس فوق نگاه کنید http://iran-sky.ir/iran/vot/ لایک یا دیس لایک که میزنم میزنه با موفقیت ثبت گردید اما مقدارش یک نمیشه و باید کل هیستوری و کش مرورگر رو تخلیه کنم تا نشون بده
دوست عزیز کد شما مشکلی نداره و بعد از ثبت رای اگر موس رو روی تصویر نگه دارید عدد رو نشون میده.با یه مرورگر دیگه مثل فایرفاکس تست کنید.
سلام من اموزش شما رو کامل خوندم و برای اطمینان از فایل کاملی که از پروژه گذاشتین استفاده کردم و فایل های دبتابیس رو هم ایمپرت کردم اما کار نکرد. ایا این باید روی اسکریپیتی اجرا بشه یعنی بصورت خام نمیشه همینجوری ازش استفاده کرد؟ چون فایل index.php چیزی توش نیست که دیتابیس رو فراخوانی و مطالب رو بیاره توش. ادرس دمو هم که گذاشتین کار نکرد . ممنون میشم پاسخ بدید
سلام دمو که قبلا تست شده و جواب هم داده،شما چک کنید برای ایجاد کردن دیتابیس و جدول ها و هم چنین فایل config و اتصال به دیتابیس.
من فایل نهایی پروژتون دانلود کردم ریختم تو قالب سایت.کدای درون فایل ایندکسو به داخل جایی که میخواستم لایکو نمایش بده بردم سی اس اس رو هم به کدای سی اس اس اضافه کردم فایل config رو هم ویرایش کردم حالا این فایل ایجکس و دیتابیس مونده!اینه رو باید تو فایل header فراخوانی بکنم؟؟اگه اره چطور باید اینکارو بکنم؟
به جای اینکار همراه با آموزش ها از جلسه اول پیش برید تا بهتر متوجه کدها و طریقه استفاده از اون ها بشید.
get_the_id رو تو حلقه پست بنویسم؟؟
من دارم این سیستم لایک و طبق آموزشتون درست میکنم
تو لوکال هاست که اجرا میکنم وقتی یه مطلب رو لایک میکنم لودینگش همینجوری میچرخه
بله دقیقا،وقتی لودینگش میچرخه یعنی مشکلی توی اجکسش وجود داره که درست ننوشتین،یا پاسخی دریافت نمیشه،یا اینکه اطلاعات به درستی ارسال نمیشه.
اون بالا نوشتین ایدی تو وردپرس با get-id به دست میاد
اینو چجوری تو وردپرس استفاده کنم تا ایدی رو به دست بیارم؟
توی وردپرس آیدی مطلب رو با get_the_ID بدست میارن.
سلام
ببخشید چجوری میشه آیدی رو تو وردپرس پیدا کرد؟؟؟
سلام.
افزونه ی wp-show-ids رو نصب کنید
سلام آدی چی رو ؟؟پست ها,دسته ها…؟؟کدوم