zahr..
3 سال پیش توسط zahr.. مطرح شد
20 پاسخ

دستور mysql برای شمارش تعداد کامنت های یک دیدگاه

سلام دوستان
من هرچی از دستور استفاده میکنم نشون نمیده و خطا هم نمیده که بفهمم مشکل چیه!
ممنون میشم دستور رو برام قرار بدید
فرض کنین یک جدول post داریم
و یک جدول comment داریم و این جدول یک ستون به اسم idpost داره یعنی هر کامنتی ک ثبت میشه ایدی پست اونم نوشته میشه
الان میخام سلکت کنم تعداد کامنت های اون پست و نشون بدم چیکار کنم؟


ثبت پرسش جدید
سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

خوب الان شما دارید کوئری صحیح میزنید و این مشکل اول حل شد. پس اون نحوه پاس دادن متغیرتون به کوئری اشتباهه در درجه اول منظورم اینجا هست:

$sql = "SELECT count(*) FROM comment WHERE id_post='$postid_db'";
// نیازی به تک کوتیشن ها نیست!
$sql = "SELECT count(*) FROM comment WHERE id_post=$postid_db";

مورد بعدی اینکه این مربوط به sql هست میتونید اسم ستون رو تغییر بدید. کوئری رو به این صورت بنویسید

$sql = "SELECT count(*) as tedad FROM comment WHERE id_post=$postid_db";

اینطوری از این به بعد داخل ارایه دریافتیتون کلید مقادیر tedad هست و بصورت $row->tedad بهش دسترسی دارید.
کلا هم باید دانش خوبی از SQL داشته باشید و هم PHP. خیلی چیزها به مرور زمان و تجربه ب دست میاد. اما پیشنهاد میکنم باز هم روی مطالب مرور کنید و به یک دوره خاص اکتفا نکنید.
امیدوارم که این مطالب مشکلتون حل کرده باشه. اگر هنوز مشکلی بود مطرح کنید


امیر علی
تخصص : طراح و توسعه دهنده fullstack
@ajdar9667 3 سال پیش آپدیت شد
0

SELECT count(*) FROM comments WHERE id_post = $id

zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@ajdar9667
ممنون ولی من خودمم همینطوری وارد میکنم ولی چیزی اتفاق نمیفته

$sql = "SELECT count(*) FROM comment WHERE id_post='$postid_db'";
                        $res = mysqli_query($connection,$sql);
                        while ($row = mysqli_fetch_assoc($res)){
                            $id_row_post = $row['id_post'];

                        }

امیر علی
تخصص : طراح و توسعه دهنده fullstack
@ajdar9667 3 سال پیش آپدیت شد
0

😐چرا روش حلقه زدی ؟ این تعداد کامنت های یک پست رو بر میگردونه حلقه براچی میزنی
اصلا حلقه ای که زدی عجیبه


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@ajdar9667
خب منم مشکلم همینه میگم بی حلقه گذاشتهب ودم نشد ، گفتم شاید حلقه بزنم همه رو بیاره بازم نشد هرچی میزنم این نشون نمیده
برا همین پیام دادم یکی ی توضیح بده 🙏


امیر علی
تخصص : طراح و توسعه دهنده fullstack
@ajdar9667 3 سال پیش آپدیت شد
0

معلومه حلقه بی نهایته !اصن کارتون رو نمیفهمم الان قراره داخل شرطه while چی بشه ؟ اصلا حلقه نمخواد همین مقداری که گرفتی رو چاپ کن


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@ajdar9667
متاسفانه چاپ نمیکنه موقعی که پیام دادم هم ذکر کردم که چاپ نمیشه
تو خروجی هم ب همون شکلی که کد مینویسم چاپ میشه به همون شکل کد🤕


امیر علی
تخصص : طراح و توسعه دهنده fullstack
@ajdar9667 3 سال پیش مطرح شد
0

یه عکس بده از نتیجه اش


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش آپدیت شد
0

@ajdar9667

ببینید اینطوری تو جدول چاپ میشه و ایدی اخرین مقاله هست برا بقیه مقاله ها هم همین ایدی چاپ میشه

1


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

سلام. چیزی که مشخصه شما دارید خود کوئری رو یعنی متغیر $sql رو میفرستید برای فرانت!
باید نتیجه کوئریتون رو ارسال کنید.
حلقه هم نیاز ندارید.

  • به عنوان پیشنهاد دوباره مفهوم استفاده از حلقه ها رو یک مروری بکنید. هرچقدر جلو تر برید و مباحث پیشرفته تر اضافه بشه ولی هنوز مفاهیم اولیه واستون جا نیفتاده باشه خسته تر و ناامید تر میشید :)

الان سعی کنید عبارت داخل پرانتر رو بیرون بیارید ، حلقه رو حذف کنید و همون متغیر $row رو ارسال کنید! قاعدتا یک ارایه تک عضوی هست که تعداد کامنت های مربوط به یک مقاله خاص( همونی که به عنوان $postid_db توی شرط کوئری گذاشتید) رو برمیگردونه.


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@SobhanDadkhah
ممنون از شما ، کارایی ک گفتین رو انجام دادم ولی بازم نشد


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش آپدیت شد
0

@SobhanDadkhah
اینم یادم رف بگم ، کامنتای هیچ پستی رو برنمیگردونه ، این چیزی ک برمیگردونه ایدی پست اخر هست که برا همه سطر جدولا یکی برمیگردونه


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

در اینصورت باید هم از کد های کوئری زدنتون که الان تغییر دادید رو قرار بدید هم کد های مربوط به نمایش فرانت اند تا بشه راهنمایی کرد.
یک نکته که الان به چشمم خورد حس میکنم کوئریتون چیزی برگشت نمیده.

$sql = "SELECT count(*) FROM comment WHERE id_post='$postid_db'";
 $res = mysqli_query($connection,$sql);
$row = mysqli_fetch_assoc($res)

از متغیر row یک vardump بگیرید ببینید چیزی برمیگردونه؟

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

بخاطر اینه که شما دارید فقط یک آیدی پست رو در کوئری لحاظ میکنید. برای اینکه تعداد کامنت های هر پست رو برگردونید یا باید برای تک تک پست ها یک کوئری مثل بالا بزنید یا با استفاده از join با یک کوئری تعداد کامنت هارو استخراج کنید.

شما با ویدیو و دوره ی اموزشی خاصی دارید پیش میرید؟


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش آپدیت شد
0

@SobhanDadkhah
من اموزشای زیادیی دیدم ولی تا حالا به این موردا برنخوردم ، یکی از دوستان قبلا پیشنهاد دادن شما sql بلد نیستین او نرو ببینید من اون دوره رو خریدم تمومش کردم ولی چیزی در این مورد ندیدم ،حتی درباره count توضیح دادن ها، ولی چیزی ک میخاستم اصلا نبود کلا در مورد ی چیز دیگ توضیح دادن ! من ای نروشی ک خودم رفتم قبلش بدون حلقه بود همه جا سرچ کردم همون بود دیدم نشد انداختم داخل حلقه ، خودم میدونم حلقه اشتباهه ولی گفتم شاید من اشتبا میکنم ولی دیگ کلا هیچی درس در نمیاد

با vardump هم گرفتم کلا null برمیگردونه

این از کد : id_post_article هم ستونی هست داخل جدول comment که وقتی کامنت گذاشته میشه ایدی اون پست رو اینجا ذخیره میکنم

$sql_post = "SELECT * FROM post";
                        $res_post = mysqli_query($connection, $sql_post);
                        while ($row_post = mysqli_fetch_assoc($res_post)) {
                            $postid_db = $row_post['id_post'];
                        }

                        $sql = "SELECT COUNT FROM comment WHERE id_post_article='$postid_db'";
                        $res = mysqli_query($connection, $sql);
                        $row = mysqli_fetch_assoc($res);
                         var_dump($row);

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

echo '<td>'.$row.'</td>';

سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

باید برای count یک مقدار مشخص کنید. count(*).
اگر باز حل نشد سعی کنید دستی یک آیدی بدین:

    $sql = "SELECT COUNT(*) FROM comment WHERE id_post_article=2";

ببینید چیزی برمیگرده از vardump


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@SobhanDadkhah
الان این و برمیگردونه ولی ب صورت ارایه برمیگردونه و الان تعداد کامنت برا این پست دو عدد

  'COUNT(*)' => string '2' (length=1)

ولی خطای ارایه میده
Notice: Array to string conversion

خاستم ارایاه رو تبدیل به همون مقدارم بکنم خطاش برطرف میشه ولی باز null برمیگردونه


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

خوب الان شما دارید کوئری صحیح میزنید و این مشکل اول حل شد. پس اون نحوه پاس دادن متغیرتون به کوئری اشتباهه در درجه اول منظورم اینجا هست:

$sql = "SELECT count(*) FROM comment WHERE id_post='$postid_db'";
// نیازی به تک کوتیشن ها نیست!
$sql = "SELECT count(*) FROM comment WHERE id_post=$postid_db";

مورد بعدی اینکه این مربوط به sql هست میتونید اسم ستون رو تغییر بدید. کوئری رو به این صورت بنویسید

$sql = "SELECT count(*) as tedad FROM comment WHERE id_post=$postid_db";

اینطوری از این به بعد داخل ارایه دریافتیتون کلید مقادیر tedad هست و بصورت $row->tedad بهش دسترسی دارید.
کلا هم باید دانش خوبی از SQL داشته باشید و هم PHP. خیلی چیزها به مرور زمان و تجربه ب دست میاد. اما پیشنهاد میکنم باز هم روی مطالب مرور کنید و به یک دوره خاص اکتفا نکنید.
امیدوارم که این مطالب مشکلتون حل کرده باشه. اگر هنوز مشکلی بود مطرح کنید


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@SobhanDadkhah
خیلی ممنون کد شمارو قرار دادم دیدم نشد
بعد اینطوری نوشتم برا اون $row

$string_x = implode ($row);

و این رو string_x خروجی گرفتم عدد 2 رو چاپ کرد و as tedad رو هم برنداشتم ولی مشکلی ک هست برا همه مقاله ها 2 چاپ میکنه در حالی که دوتا مقاله هست و دوتا کامنت برا ی مقاله😑 وقاعا شرمنده سرتونم درد اوردم ممنون تا اینجا هم کمک کردین


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
0

@SobhanDadkhah
البته دلیلش هم مشخصه چرا برا همه تکرار میشه چون حلقه ای ک دارم پست هارو نمایش میدم این یکی هم داخل اون قرار داره اینطوری میشه ، جدا قرار میدم تکرار نمیکنه برا بقیه ولی خب جدول بهم میخوره


zahr..
تخصص : هک ناسا با html
@zahramalekipor 3 سال پیش مطرح شد
1

@SobhanDadkhah
اقا حلش کردم درس شد 😁
واقعا خیلی ممنونم مرسی که وقت گذاشتین خیلییی لطف کردین🌹


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
0

خواهش میکنم مشکلی نیست.
@zahramalekipor

برا همه مقاله ها ۲ چاپ میکنه

این بخاطر این هست که شما دارید آیدی رو بصورت دستی وارد میکنید. باید به ازای هر پستتون یک کوئری بزنید به دیتابیس . درواقع توی حلقه پست هاتون رو قرار میدید و به ازای هر ایتم که پست تکی هست یک کوئری میزنید و بجای اون عدد 2 آیدی همون پست رو قرار میدید. اما این مشکلی ب وجود میاره که به مشکل N+1 کوئری معروفه. یعنی شما یک کوئری میزنید که همه پست هارو دریافت کنید و به ازای هر پست یک کوئری دیگه میزنید. یعنی اگر روزی 100 پست داشته باشید 101 کوئری به دیتابیس زده میشه که اصلا بهینه نیست. (حتما راجع بهش سرچ کنید)

پیشنهادی که دارم اینه که علاوه بر طرح پرسش در راکت سعی کنید از طریق هر مقاله ای که دستتون میاد راجع به موضوعات مطالعه کنید. با هر سرچی که بزنید در گوگل بالاخره یک مقاله یا مثالی هست که بتونه کمکتون بکنه. خیلی مقالات متنوعی درباره ساخت وبلاگ با php هست که کلی میتونید از کد هاشون ایده بگیرید. مشخصا اول راه هستید و راه درازی در پیش دارید 😁 اما از مهم ترین راه های یادگیری خوندن کد های دیگه و یادگیری از اونهاست.


الان متوجه بقیه پیام هاتون شدم . خوشحالم که مشکلتون حل شده. اتفاقا خیلی چیزها واسه خودم هم مرور شد که از خوبی های شرکت کردن در بحث و گفتگو هست :))
راجع به مشکل N + 1 که بالا گفتم یک کوئری نوشتم که میتونید ازش ایده بگیرید. در واقع بجای اینکه لازم باشه برای هر پست تکی یک کوئری برای تعداد کامنت هاش اجرا کنید ، با join میتونید تعداد کامنت های مربوط به هر پست رو فقط با یک کوئری استخراج کنید که دیگه مشکل N + 1 وجود نخواهد داشت. در کنار زبان سطح بالاتون برای بک اند، حتما پیشنهاد میکنم کار با دیتابیس هارو هم خوب یاد بگیرید.

select posts.id, COUNT(comments.id) as commentsNumber from posts inner join comments on  comments.post_id = posts.id GROUP by posts.id;

با ارزوی پیشرفت همیشگی :) موفق باشید 🤞🌹


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام