BG Development


Страници: (18) « първа ... 16 17 [18]   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Как да добавя система за коментари към сайт?, Статичен сайт, без използване на CMS
Бай Аз
Публикувано на: 22-02-2024, 14:46
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21




thrawn,

Да, наистина това PHP и като цяло логиката(ако въобще има такава) на уеб програмирането не са ми ясни! То, ако бяха - досега отдавна да съм забравил този въпрос. icon_lol.gif icon_lol.gif icon_lol.gif

Проблемът е, че аз не искам да уча задълбочено PHP! А само, колкото ми трябва за този случай.
И затова ми се искаше да го направя по моя вариант, но ако обичаш - обясни ми, кое не е наред в логиката на моя последен вариант?

Още веднъж го описвам като логика и псевдокод:

1. В блока на брояча на коментарите задавам променливата $all_comments=1;

2. При натискане на бутона за показване на всички коментари - променям стойността на тази променлива - примерно на 2
(Първо го бях направил чрез JS, но се оказа, че за да го предам към php-то трябва AJAX и затова се отказах, защото не съм пил бира Хаберман относно Аякса icon_lol.gif - тоест нямам никаква представа от него и не искам да уча и него!)

Затова реших да го направя чрез PHP като;
За целта вкарвам този бутон като submit бутон в друга форма и чрез метода action при натискането му извиквам друг php файл.

Сега въпросът е какво точно трябва да съдържа този php файл:
2.1. Естествено още в началото реда: $all_comments=2;

2.2. После не ми е съвсем ясно: дали тук трябва да извърша още обработки, или трябва да извикам (включа) php файла за извеждане на коментарите commentsblock.php

Ето пак кодът във файла commentsblock.php:

CODE
<?php
include "php/config.php"; //Вмъкваме файла за връзка с базата данни            
                 
$query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC LIMIT 3";
                 
$print_comments = mysqli_query($connect, $query); //Получаваме данните от таблицата
while ($comment = mysqli_fetch_assoc($print_comments)) { // Правим цикъл, чрез който ще се извеждат коментарите
         echo "<div class='comment'>
               <span class='comment-name'><b>" . htmlspecialchars($comment['name']) . "</b></span>
                <span class='comment-date'>".$comment['date_comment']."<br></span>
               <p class='comment-text' style='white-space: break-spaces;'>" . htmlspecialchars($comment['message']) . "</p>
               </div>";
   }
?>


И трябва в него да вмъкнем условието, нещо като в този код:

CODE
if ($all_comments==1){
$query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC LIMIT 3";
}else{
$query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC ";
}

Този код трябва да бъде на мястото на SQL заявката.

3. И оттук нататък не ми е много ясно - достатъчно ли е това, за да работи?
И ако не е - какво още трябва да направя?

Това мнение е било редактирано от Бай Аз на 22-02-2024, 14:47
PMEmail Poster
Top
BIGBUGEX
Публикувано на: 22-02-2024, 14:49
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1704
Регистриран на: 30.11.04



Ако страницата ти е сайт.ком/коментари.пхп, при натискане на линк примерно сайт.ком/коментари.пхп?шоу=алл слагаш проверка в коментари.пхп:
CODE

if( $_GET("show")==="all" )
$sql = "заявка без LIMIT"
else
$sql = "заявка с LIMIT"
end if

Не знам пхп. По спомен от това което си давал.
PMEmail Poster
Top
Бай Аз
Публикувано на: 22-02-2024, 15:00
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21



BIGBUGEX,

Това, което си написал изглежда ОК!
Това е варианта с GET заявка нали така?
За нея - в момента не знам как да добавя GET параметъра "шоу=алл", но предполагам, че ако реша да го правя по този вариант - ще го прочета и разбера как става.

Не, проблемът, който беше при мен е,
че преди да стигна до кода с условието ми - не можех да получа в php кода - променливата ми $all_comments да е равна на 2

Пусках преди това да я отпечатам - показваше 1

Това последното, което написах в предния си коментар, не съм го пробвал - ще го пробвам довечера!

Това мнение е било редактирано от Бай Аз на 22-02-2024, 15:02
PMEmail Poster
Top
thrawn
Публикувано на: 22-02-2024, 15:31
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3616
Регистриран на: 17.01.17



Ами то това са основни положение, нямащи нищо общо с php а касаещи като цяло http протоколът.

HTTP е stateless протокол по дефиниция. Което значи, че няма как да различиш коя заявка от кой потребител е, защото просто не се пази състояние. Това отнесено към твоя проблем значи, че "няма как" да имаш променлива на сървърът която да отразява състоянието на конкретен клиент. Или всички клиенти ще получават само няколко коментара или всички ще получават всички коментари. Затова и в html са въведени бисквитките - парчета данни които се предават със заявките и служат за съхраняване на състояние (от страна на клиентът). В частност, бисквитките се разширяват до нещо наречено сесия (потребителски данни съхранени на сървърът които се идентифицират чрез бисквитка).

Най-простото решение на твоя "проблем" е просто да подаваш GET заявка с параметрите които следиш. Ако страницата с темата ти е page.php и тя връща само последните Х коментара, то добавяш параметър show (примерът на BIGBUGEX) със стойност all. Или казано по друг начин - просто включваш съответния линк в страницата
CODE
<a herf="page.php?show=all">Покажи всички коментари</a>


Това мнение е било редактирано от thrawn на 22-02-2024, 15:34
PMEmail Poster
Top
BIGBUGEX
Публикувано на: 22-02-2024, 15:53
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1704
Регистриран на: 30.11.04



$_GET["show"] === "all"
имах предвид. С квадратни скоби. Така е дадено в документацията на пхп.
PMEmail Poster
Top
Бай Аз
Публикувано на: 23-02-2024, 10:09
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21




С радост искам да ви съобщя, че проблемът е решен, слава Богу! icon_smile.gif icon_smile.gif icon_smile.gif
И работи! Изпробвах го и на единия сайт - работи правилно!

Благодаря на всички , които бяха съпричастни и помогнаха според силите си!

Хубавото е, че успях да намеря решение по моя вариант + варианта с GET параметър.

Един познат, който разбира от такива неща, прегледа темата и ме насочи в правилната посока за реализиране на моя вариант, показа ми и как се прави с GET параметъра в моя случай. Имам да го черпя! icon_lol.gif

Ето и за какво става въпрос на практика:

1. Правим го във връзката(не с бутон), подобно на това, което писа и thrawn в последния си коментар:
CODE
<a herf="page.php?show=all">Покажи всички коментари</a>

но не подаваме параметър, свързан със страницата, а булева променлива - както аз исках да го направя в един от по-предните си варианти, но не знаех къде да я задам тази булева променлива? (Мислех, че трябва да в php кода) icon_lol.gif
Кодът тук е следният:
CODE
<p>За да видите всички коментари - натиснете <a href="?show_all=true"><b>тук>></b></a>

Задаваме на булевата променлива show_all стойност true

И след това в html страницата, в блока за извеждане на коментарите, пишем следния код:
CODE
<div id="comments-block">
<?php
   if (isset($_GET['show_all']) && $_GET['show_all'] == 'true'){
       echo'<p id="last-comments">Всички коментари:</p>
       <div id="comment3">';                    
               $showAll = true;
               include "php/commentsblock.php";                        
       echo'</div>';
   }else{
       echo'<p id="last-comments">Последни три коментара:</p>
       <div id="comment3">';
           $showAll = false;
           include "php/commentsblock.php";
       echo'</div>';
   }
?>
</div> <!--  end comments-block-->


Тоест променливата по подразбиране(когато не сме кликнали върху връзката) е със стойност false, и се изпълнява кодът след else

При кликване върху връзката - променлива show_all вече има стойност true
и се изпълнява кодът в по-горната част, след if

Тоест практически се извиква един и същ php файл - commentsblock.php, но с различна стойност на променливата show_all!

И последно добавяме условието във файла commentsblock.php:

CODE
if (isset($showAll) && $showAll){
       $query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC";
   }else{
       $query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC LIMIT 3";
   }


Ето и целия код във файла commentsblock.php:
CODE
<?php
   include "php/config.php";

   if (isset($showAll) && $showAll){
       $query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id DESC";
   }else{
       $query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id  DESC LIMIT 3";
   }
           
          $print_comments = mysqli_query($connect, $query);
          while ($comment = mysqli_fetch_assoc($print_comments))
          echo "<div class='comment'>
                <span class='comment-name'><b>" . htmlspecialchars($comment['name']) . "</b></span>
                 <span class='comment-date'>".$comment['date_comment']."<br></span>
                <p class='comment-text' style='white-space: break-spaces;'>" . htmlspecialchars($comment['message']) . "</p>
                </div>";
          }
?>


Това е! И работи! icon_lol.gif icon_lol.gif icon_lol.gif

Това мнение е било редактирано от Бай Аз на 23-02-2024, 10:31
PMEmail Poster
Top
relax4o
Публикувано на: 23-02-2024, 11:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2799
Регистриран на: 04.04.07



Пак казвам, че не разпознаваш булева стойност от низа "true". Всички куери параметри са от тип текст.

Това, което правиш е още една безмислена гимнастика. Дали ще използваш ?show=all или show_all=true е едно и също, защото true не е истинска булева стойност в този случай.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
Бай Аз
Публикувано на: 23-02-2024, 11:21
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21



QUOTE (relax4o @ 23-02-2024, 11:11)
Пак казвам, че не разпознаваш булева стойност от низа "true". Всички куери параметри са от тип текст.

Това, което правиш е още една безмислена гимнастика. Дали ще използваш ?show=all или show_all=true е едно и също, защото true не е истинска булева стойност в този случай.

Да, прав си, че не е булева, но вече не мога да си редактирам коментара!
Ако SuN му се занимава - да го редактира, като махне думата "булева"!

Просто от радост, че стана - не обърнах достатъчно внимание! icon_lol.gif

Но важното е, че работи! icon_smile.gif

Това мнение е било редактирано от Бай Аз на 23-02-2024, 11:21
PMEmail Poster
Top
Бай Аз
Публикувано на: 24-02-2024, 00:11
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21




Пропуснах по-рано днес да приложа снимки на финалния вариант.

Затова за пълнота на изложението - прилагам и две снимки на екрана на тестовата страница в двете положения:

1. След като отворим страницата със статия, в която има 5 коментара, виждаме следното:

user posted image

Показват се само последните три коментара.

2. След като кликнем на връзката за показване на всички коментари, виждаме следното:

user posted image

Показват се всички коментари.

Това е!

Всъщност някой, ако има желание, може да покаже и свой(различен) вариант, за тази ситуация! Смятам, че ще бъде интересно!

Това мнение е било редактирано от Бай Аз на 24-02-2024, 00:26
PMEmail Poster
Top
Бай Аз
Публикувано на: 24-02-2024, 11:15
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 272
Регистриран на: 04.02.21




Да допълня нещо:

Във финалния вариант, от по-предния ми коментар, е показан вариантът, при който коментарите се показват в обратен ред - първо най-новите!

За да се се показват коментарите хронологично(както примерно тук на форума) - трябва в кода на php файла commentsblock.php, да махнем думата DESC от SQL заявките.

И кодът в този случай(в тази част) във файла commentsblock.php, ще бъде следният:
CODE
if ($all_comments==1){
$query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id LIMIT 3 ";
}else{
$query = "SELECT id, name, message, article_id, DATE_FORMAT(date_time, '%d-%m-%Yг. в %H:%iч.') AS date_comment FROM comments1 WHERE article_id='$article_id' AND moderation=1 ORDER BY id ";
}

Така, че всеки може да си избере по кой начин да го направи!

Това мнение е било редактирано от Бай Аз на 24-02-2024, 11:15
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (18) « първа ... 16 17 [18]  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0