campaign-edianeh-98

آموزش کامل ایجاد سیستم like مطالب با PHP و AJAX (قسمت چهارم)



visibility  
mode_comment   ۴۸

سلام دوستان،توی قسمت های قبلی ما کد های مربوط به قسمت طراحی و هم چنین کد های درخواست ای جکس رو نوشتیم ،تو این قسمت کد های PHP و mysql رو می نویسیم،قبل از شروع من باید یه نکته بگم و اونم اینه که به خاطر کارکرد بهتر کد های من تغییرات جزئی رو در کد های HTML و جاوا اسکریپت دادم که شما می تونید از فایل پروژه دانلود کنید و توضیح این قسمت های ویرایش شده هم میمونه برای قسمت بعدی که قسمت آخر هم هست.

شروع مرحله به مرحله

خوباول از همه باید جدول های دیتابیس خودمون رو بسازیم،ما اینجا دو تا جدول داریم یکی جدول مطالب (posts) و یکی هم جدول likes،جدول مطالب به غیر از ستون های معمول خودش که میتونه عنوان مطلب یا متن مطلب یا هر چیز دیگه ای که داره،دارای تو ستون up و down هست که تعداد لایک های مثبت و منفی رو توی خودشون نگهداری میکنن.

خوب این کد SQL ساخت جدول مطالب :

البته ما این جا برای راحتی کار ستون ها رو ساده گرفتیم چون کار اصلی ما با همون دو تا ستون 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:

توی خط اخر هم میبینید که توی تعریف Foreign key ما بعدش از کلمه References استفاده کردیم،خوب واسه اینه که مرجع این ستون ما (p_id) همون ستون id جدول باشه دیگه،دلیلشم بالا گفتم.

حالا باید شروع کنیم به ساخت صفحه php منبع،اگه یادتون باشه ما توی تابع های درخواست ای جکس خودمون توی متد open یه کوئری استریگ رو تعریف کردیم حالا بایدتوی این صفحه مقادیر اون کوئری استریگ رو دریافت کنیم.

اول بگم فایل database توی فایل پروژه هست پس نگران نباشید،ما دو تا متغییر دریافت میکنیم یکی func یکی هم id (این id همون id مطلب ما هست که باید برای ثبت لایک اینجا لازمش داریم،البته من اینو توی قسمت ویرایش ها اضافه کردم و توضیحش برا قسمت بعده پس اصلا نگران نباشید)،متد ارسال ما GET بود پس با GET دریافت میکنیم،متغییر های func و id رو که تعریف کردیم مقدار دهی میکنیم و چک میکنیم که اگه خالی بودن ار برنامه خارج شو (این برا اینه که یکی شیطونی نکنه و ادرس رو مستقیم بده و اطلاعات خالی بفرسته و دردسر های بعدش پیش بیاد).

ما برای حالت های مختلفی که داشتیم توی قسمت ای جکس یه تابع نوشتیم  حالا باید به تناسب هر درخواستی که  دریافت میکنیم  پاسخ مناسب رو بدیم،ما برای اینجا یه دستور switch ایجاد کردیم که چک میکنه ببینه مقدار func ما چیه و بعدش تابع مناسب رو برای ما اجرا میکنه.

خوب می بینید که برای هر درخواست تابع مناسب رو فراخوانی کرده و id مطلب رو هم بهش ارسال کرده،حالا به ترتیب این توابع رو می نویسیم .

تابع update like

خوب اول از همه ip کاربر رو دریافت کردیم،بعدش به بانک متصل شدیم،یه کوئری انجام دادیم که تمام فیلدهای جدول پست رو متناسب با id  دریافت کن،مقادیر رو هم گرفتیم و توی row$ گذاشتیم،بعدش ما نیاز داریم تا کاربر رو اعتبار سنجی کنیم ببینیم فبلا امتیاز داده یانه پس براش یه تابع نوشتیم که آخر کار توضیح میدم،مقدار id مطلب و اون ip رو هم براش ارسال میکنیم (شما می تونید این اعتبار سنجی رو بذارید اول تابع حالا من سلیقه ای گذاشتم اینجا،البته بهتره بذارید اول تابع)،اگه کاربر اعتبار سنجی شد که میره برا ثبت لایک،اگه نه پیغام نشون میده رای شما قبل ثبت شده،خوب حالا اگه اعتبار سنجی شد مقدار فیلد up رو یکی افزایش میدیم و با یه کوئری توی دیتابیس ثبتش میکنیم،یه کوئری هم میزنیم برای جدول likes که ip کاربر،id, و تاریخ رو براش ثیت می کنیم (البته من تاریخ رو به صورت NULL گذاشتم که مجبور نباشیم حتما براش مقداری ارسال کنیم،شما اگه خودتون خواستین می تویند براش تاریخ جاری رو ارسال کنید)،خوب بعدشم قطع ارتباط از دیتابیس و نشون دادن پیغام رای شما ثبت شد.

تابع updatedislike  

خوب دقیقا شبیه همون تابع بالاست فقط ستون down رو چک میکنیم،پس توضیح خاصی نداره.

تابع showlike

این تابع خیلی ساده است،فقط مقدار ستون up رو می گیریم و نشون میدیم همین.

تابع showdislike

این تابع هم شبیه تابع بالایه فقط مقدار down رو دریافت میکنه و نمایش میده.

خوب حالا فقط میمونه تابع اعتبار سنجی کاربر :

خوب این جا هم id مطلب و ip کاربر رو که از تابع اصلی گرفتیم (updatelike یا updatedislike) توی کوئری ارسال کردیم و اگه مقداری برگشت داده بشه معلومه این کاربر به این مطلب قبلا رای داده پس مقدار false برمیگردونه و اگه نه که true برمیگردونه.

فقط یه تابع اعتبار زمان میمونه که من اینو رو نوشتم اما استفاده نکردم،میشه باهاش تنظیم کرد که هر کابر توی مثلا 24 ساعت یکبار بتونه برای مطلب لایک بزنه،دیگه تنظیم زمانش بر عهده خودتون چون سلیقه ایه،فقط اگه خواستین حتما توی تابع updatelike و updatedislike اعمالش کنید.

اون مقداری که به تابع میدیم باید از جدول likes واکشی کنیم،ما اون زمان ثبت لایک رو با زمان حال مقایشه میکنیم و اگه تفاوتشون بیشتر از یک روز باشه کاربر بازم میتونه برا اون مطلب لایک بزنه.فقط اینطوری باید تو تابع اعتبار کاربر هم دستکاری بکنیم و گرنه این تابع درست کار خودشو انجام نمیده.

راستی توی فایل config.php تنظیمات دیتابیس خودتون رو وارد کنید،توی پوشه img هم دوتا تصویر لایک دیگه هست ،برای تنوع.

خوب اینم از این سیستم لایک دهی مطالب،قسمت بعد که قسمت آخر هست نحوه استفاده توی سایت رو هم نشون میدیم.

موفق و پیروز باشید.

دموی نهایی پروژه (برای دمو شرط اعتبار رو برداشتم)

دانلود فایل های نهایی پروژه

متخصص جاوا اسکریپت
با جاوا اسکریپت جادوگری کنید! آیا می دونید با زبان جاوااسکریپت می تونید، برای فرانت اند و بک اند وبسایت ها برنامه نویسی کنید؟ همینطور اپلیکیشن دسکتاپ و موبایل بسازید؟ اگر دوست داری اینکارها رو انجام بدی و React, ElectronJS, ReactNative, NodeJS,MongoDB و ... رو تو یه دوره یاد بگیری، متخصص جاوااسکریپت سون لرن رو حتما ببین : متخصص جاوا اسکریپت arrow_back
comment دیدگاه کاربران
cezar1375

خوب بود ممنون

حامد مودی

سلام از متدهای ای جکس جی کوئری استفاده کنیم بهتر نیست؟

لقمان آوند

فرقی نداره . ازونم میشه استفاده کرد ولی اینجا خواستیم از جاوااسکریپت صرفا استفاده کنیم . لود کردن جی کوئری فقط بزای یه کار ساده (به خاطر حجمش و زمان لودش) به صرفه نیست …

الناز

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

کیوان علی محمدی

سلام شما یا باید از سیستم های درگاه پرداخت مثل زرین پل یا پارس پال استفاده کنید یا اینکه خودتون از بانک درگاه بگیرید که برای این کار نیاز هست تا شرکت ثبت کنید،رو سیستم های وبلاگ عمومی مثل پرشن بلاگ هم نمیشه این سیستم رو راه اندازی کنید چون امکان کد نویسی سمت سرور برای شما وجود نداره.

الناز

ممنون از راهنماییتون

metro

tnq ali bood 😎

star

sepase faravan
♥ 🙂

EFYJACKSON

سلام. من نمی تونم به database متصل شم. حتی بعد از ایجاد جداول و تغییر dbname در config
چه کنم؟؟؟؟

کیوان علی محمدی

سلام خوب پیغام خطایی نشون میده یا نه؟

EFYJACKSON

آره. وقتی like میکنم یه پیغام طولانی میده شبیه کد html . بالاش هم نوشته the page at localhost says

کیوان علی محمدی

خوب اون متنی که گذاشتی واسه alert صفحه است،متن بعدیش چیه؟احتمال زیاد توی ارتباط با دیتابیس خطایی رخ میده،کانکشن رو دوباره چک کن.

ارمین

سلام

این دستور Foreign Key که گفتید رو قرار می دم و TABLE رو وصل می کنه به اون یکی TABLE مشکل اینه که فقط

مثلا الان در TABLE اول اومدیم چیزی رو insert کردیم بعد می رم table دوم می بینم چیزی inset نشده اینجا فقط موقع insert دیگه نمی ذاره id بدم می گه فقط از id های که در table اول ایجاد شده می تونی استفاده کنی

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

راستی میشه مراجل کلی کار رو هم بگید به صورت نوشتاری؟؟؟

تو 3 4 خط بگید چیکار می خوایم بکنید از اول تا اخر

کیوان علی محمدی

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

ارمین

ممنون بابت پاسخ

من الان کمی گیج شدم الان فرض کنیم ما یک مطلب ارسال می کنیم و ایدی مطلب 20 هست خوب این رو میشه با INSRT که موقع ارسال مطالب میشه داخل id ,table نوشته ها درج کرد.

بعد چطور می خوایم بررسی کنیم که برای این مطلب لایک ثبت شده یا نه؟؟؟وقتی موقع ارسال مطالب در داخل table لایک id درج نمیشه

کیوان علی محمدی

من منظور شما رو خوب متوجه نمیشم،اما این توضیح رو بدم که وقتی مطلب ارساب شد توی جدول مطالب یه ایدی بهش اختصاص داده میشه،هر مطلب دارای یه ستون up برای لایک مثبت و یه ستون down برا لایک منفی هست،که در هنگام ارسال مطلب به طور پیش فرض صفر هستن،حالا وقتی ما مطالب رو نشون میدیم ما و تعداد لایک مثبت و منفی رو هم نشون میدیم(همش هم به صورت ای جکس هست یعنی با hover شد ما آیدی مطلب رو میفرستیم سمت سرور و اونجا تعداد ستون up یا down رو میگیریم و برمیگردونیم).بعدشم اگه کاربر کلیک کرد مشخصات کاربر ثبت میشه و یکی به لایکی که انتخاب کرده اضافه میشه؛چه مثبت و چه منفی،حالا نمیدونم کجاش برای شما مشکله؟

ارمین

مظور من این بود که

الان ما مطلب ارسال کردیم این مطلب ایدیش هست 20

حالا در table نوشته ها id 20 شد

کاربری میاد لایک کنه بار اول لایک کرد و داخل table لایک مشخصات اون مثل ip و … درج شد .بار دوم بازم می خوام همون مطلب لایک کنه چطور بش بگیم که لایک کردی دیگه نمی تونی؟؟یعنی سرور از کجا بفهمه که می خواد دو بار یک مطلب لایک کنه که جلوش رو بگیره؟؟

کیوان علی محمدی

خوب تابع user_validation برای همین هست دیگه.

ارمین

بازم سپاس
الان من دقیق کار این FOregin key رو نمی دونم اینم یک توضیح بدید ممنون میشم

کیوان علی محمدی

کلید خارجی یکی از Constraint های زبان SQL هست،کلید خارجی در یک جدول در واقع اشاره میکنه به کلید اصلی در یه جدول دیگه و برای ایجاد همون رابطه بین جدوال استفاده میشه.مثلا در جدول کاربران کلید اصلی id هست حالا توی جدول سفارشات باید مشخص باشه کدوم سفارش مربوط به کدوم مشتری هست بنابراین ما توی جدول سفارشات یه ستون مثلا به نام u_id یا مثلا customer_id ایجاد می کنیم و اونو از طریق همین کلید خارجی به ستون id جدول کاربران متصل و محدود می کنیم و این باعث میشه مثلا این ستون فقط مقادیری رو پذیره که در ستون id جدول کاربران موجود باشه،پس سفارش نامعتبر نمیتونه وجود داشته باشه،بعدشم مثلا وقتی کاربری حذف میشه یا اکانت خودشو پاک میکنه میتونیم به راحتی با همین ستون تمام سفارشاتش رو پاک کنیم.موفق باشید.

ارمین

ممنون دوست عزیز

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

majid

سلام
عالی بود
ولی اگر پیغام رو به صورت tooltip نمایش میداد خیلی بهتر می شد .ممنون میشیم اگر اونو هم آموزش بدید

saeed

با سلام من هیچ فایل sql در فایل php ندیدم و خودم هم نتوانستم FOregin key ایجاد کنم لطفا کمک کنید

کیوان علی محمدی

اول همین آموزش دستورات SQL رو قرار دادیم.

آرین بهمنی

من کد اس کیو ال دومی رو وارد میکنم این ارور رو میده
چی باید بکنم ؟؟!

Error

SQL query:

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`);

MySQL said: Documentation
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 7

کیوان علی محمدی

جدول posts رو ایجاد کردین ؟

آرین بهمنی

بله جدول posts درست کردم ارور هم نداده …

کیوان علی محمدی

اون علامت سمی کالن ; رو آخرین خط (خط 7 ام توی اموزش )حذفش کنید.

مهسا

سلام
ببخشید چجوری میشه آیدی رو تو وردپرس پیدا کرد؟؟؟

وحید صالحی

سلام آدی چی رو ؟؟پست ها,دسته ها…؟؟کدوم

سجاد دریس

سلام.
افزونه ی wp-show-ids رو نصب کنید

مهسا

اون بالا نوشتین ایدی تو وردپرس با get-id به دست میاد
اینو چجوری تو وردپرس استفاده کنم تا ایدی رو به دست بیارم؟

کیوان علی محمدی

توی وردپرس آیدی مطلب رو با get_the_ID بدست میارن.

مهسا

get_the_id رو تو حلقه پست بنویسم؟؟
من دارم این سیستم لایک و طبق آموزشتون درست میکنم
تو لوکال هاست که اجرا میکنم وقتی یه مطلب رو لایک میکنم لودینگش همینجوری میچرخه

کیوان علی محمدی

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

مهسا

من فایل نهایی پروژتون دانلود کردم ریختم تو قالب سایت.کدای درون فایل ایندکسو به داخل جایی که میخواستم لایکو نمایش بده بردم سی اس اس رو هم به کدای سی اس اس اضافه کردم فایل config رو هم ویرایش کردم حالا این فایل ایجکس و دیتابیس مونده!اینه رو باید تو فایل header فراخوانی بکنم؟؟اگه اره چطور باید اینکارو بکنم؟

سجاد دریس

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

محمد

سلام من اموزش شما رو کامل خوندم و برای اطمینان از فایل کاملی که از پروژه گذاشتین استفاده کردم و فایل های دبتابیس رو هم ایمپرت کردم اما کار نکرد. ایا این باید روی اسکریپیتی اجرا بشه یعنی بصورت خام نمیشه همینجوری ازش استفاده کرد؟ چون فایل index.php چیزی توش نیست که دیتابیس رو فراخوانی و مطالب رو بیاره توش. ادرس دمو هم که گذاشتین کار نکرد . ممنون میشم پاسخ بدید

کیوان علی محمدی

سلام دمو که قبلا تست شده و جواب هم داده،شما چک کنید برای ایجاد کردن دیتابیس و جدول ها و هم چنین فایل config و اتصال به دیتابیس.

محمد

مشکل رو رفع کردم . فقط موضوعی این مقدا ها بصورت ایجکس تغییر نمیکنه برام و تو کوکی و کش مرورگر ثبت میشه مثلا رای میدم تغییر نمیکنه مقدارش به همون صورت میمونه و تو کوکی ذخیره میشه و باید تمام کوکی مرورگرو پاک کنم تا دوباره مقدار رای رو نشون بده. ❗

کیوان علی محمدی

رای ها بر اساس آی پی و در دیتابیس ثبت میشه.

محمد

متوجه منظور بنده نشدید به ادرس فوق نگاه کنید http://iran-sky.ir/iran/vot/ لایک یا دیس لایک که میزنم میزنه با موفقیت ثبت گردید اما مقدارش یک نمیشه و باید کل هیستوری و کش مرورگر رو تخلیه کنم تا نشون بده

وحید صالحی

دوست عزیز کد شما مشکلی نداره و بعد از ثبت رای اگر موس رو روی تصویر نگه دارید عدد رو نشون میده.با یه مرورگر دیگه مثل فایرفاکس تست کنید.

محمد

هم با موزیلا و هم با کروم تست کردم و وقتی موس رو هم میرم روش عددی که کنارش ظاهر میشه مقدار قبلی رای هستش و مقدار جدید که باید افزوده شده باشه نیست

کیوان علی محمدی

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

محمد

داداش منظور من اصلا اینچیزا نیست. من ساختار کلی این سیستم رو متوجه شدم. یه توضیح ساده میدم تو تیبل posts جدول up مقدار امتیازات مثبت رو ذخیره میکنه حالا مثلا ما دستی این مقدار رو میذاریم 300 و وقتی صفحه رو رفرش میکنم باید وقتی موس روی علامت مثبت میبرم مقدارش 300 باشه ولی همون مقدار قبلی که مثلا 1 بوده هستش و هر چند بار که اف 5 هم بزنم عوض نمیشه الا زمانی که کلا هیستوری مرورگر رو خالی کنم. که نباید چنین چیزی باشه چون مقدار دیتابیس که نباید کش بشه . احتمالا مشکلی تو نوشتن این کد ها وجود داشته که مقدار هارو کش میکنه

کیوان علی محمدی

بعضی از افزونه ها دیتابیس رو کش میکنن،ما این کد رو تست کردیم و مشکلی نداشته.

محمد

اما من این افزونه رو هنوز بدون تغییر گذاشتم و تغییری ندادم کش میکنه. حالا خارج از همه اینا چطور میشه جای امتیاز منفی که شما گذاشتین اسمشو dislike کاری کرد که dislike برای برداشتن لایک باشه. یعنی مثلا من لایک کردم پستی رو حالا پشیمون شدم میخوام لایکمو بردارم وگزینه دیس لایک رو میزنم لایک برداشته بشه و spin دیس لایک تا وقتی گزینه لایک زده نشده نشون داده نشه

ارسال نظرات

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