MYSQL выберите комментарии, ограничение 3, «нажмите, чтобы увидеть все» и отобразить на той же странице. PHP - PullRequest
1 голос
/ 08 мая 2011

У меня есть некоторый код, который извлекает комментарии пользователей из моей базы данных:

$comments = mysql_query("SELECT * FROM comments WHERE ref = '$theID'LIMIT 0, 3;")
  or die(mysql_error());

while ($rowC = mysql_fetch_array($comments)) {
  echo "<p>On " .$rowC['date']. ", ";
  echo $rowC['username']. " said: <br/>";
  echo $rowC['comment'];
  echo "</p><hr/>";
}
if (mysql_num_rows($comments) == 0) { 
  echo "<p>(No comments have been made yet)</p>"; 
}

Комментарии хранятся с уникальной ссылкой пользователя в базе данных и извлекаются там, где они соответствуют идентификатору пользователя, это вызывается вверхняя часть страницы:

$theID = $_GET['id'];

Я пытаюсь ограничить количество отображаемых комментариев, а если их больше 3, покажите кнопку или ссылку типа «нажмите, чтобы увидеть больше», которая отображает всекомментарии пользователей на той же странице так же, как и выше.

ОБНОВЛЕНИЕ, я сейчас использую это, пытаясь реализовать предложение Йохана, но все еще не могу заставить его отображать больше, когда нажата ссылка:

  $comments = mysql_query("SELECT * FROM comments WHERE ref = '$theID' LIMIT 0, 4") or die(mysql_error());

    while ($rowC = mysql_fetch_array($comments)) {
      echo "<p>On " .$rowC['date']. ", ";
      $username = htmlspecialchars($rowC['username']). " said: <br/>";
        echo $username;
        $comment = htmlspecialchars($rowC['comment']);
        echo $comment;
      echo "</p><hr/>";
    }

    $num_rows = mysql_num_rows($result);
    if ($num_rows > 3) {
    $query = "SELECT * FROM comments WHERE ref = '$theID' LIMIT 4, 20";
    } echo "<p><a href=''>click to see more</a></p>";

    if (mysql_num_rows($comments) == 0) { 
      echo "<p>(No comments have been made yet)</p>"; 
    }

Ответы [ 2 ]

0 голосов
/ 08 мая 2011

Yikes: У вас есть пара ошибок / проблем.

SQL-инъекции

$theID = $_GET['id'];

Исправьте это к

$theID = mysql_real_escape_string($_GET['id']);

Чтобы избавиться от зияющей дыры SQL-инъекции.
См .: Как работает SQL-инъекция из комикса XKCD "Таблицы Бобби"?

XSS уязвимость

Заменить этот код:

echo $rowC['username']. " said: <br/>";
echo $rowC['comment'];

С этим

$username = htmlspecialchars($rowC['username']). " said: <br/>";
echo $username;
$comment = htmlspecialchars($rowC['comment']);
echo $comment;

См .: Сохраняют ли htmlspecialchars и mysql_real_escape_string мой код PHP в безопасности от внедрения?
И: Когда лучше всего дезинфицировать пользовательский ввод?

Ошибка в коде
Измените это:

$comments = mysql_query("SELECT * FROM comments WHERE ref = '$theID'LIMIT 0, 3;")

К этому

$comments = mysql_query("SELECT * FROM comments WHERE ref = '$theID' LIMIT 0, 3")

Вернуться к вопросу

если вы измените запрос на:

SELECT * FROM comments WHERE ref = '$theID' LIMIT 0, 4"

Затем вы можете проверить количество возвращаемых результатов. Если это 4, то отобразите кнопку more....

Используйте этот запрос, чтобы получить еще 20 результатов

$num_rows = mysql_num_rows($result);
if $num_rows > 3 {
  $query = "SELECT * FROM comments WHERE ref = '$theID' LIMIT 4, 20";
  ...
0 голосов
/ 08 мая 2011

Попробуйте это:

<?

if($_GET['allcomments'] == 1 && preg_match("/([0-9]+)/", $_GET['id'])){

   $comments = mysql_query("SELECT * FROM comments WHERE ref = '".$_GET['id']."'") or die(mysql_error());

   for($c=0; ($rowC = mysql_fetch_array($comments)) !== FALSE; $c++) {
       echo "<p>On " .$rowC['date']. ", ";
       echo htmlentities($rowC['username']). " said: <br/>";
       echo htmlentities($rowC['comment']);
       echo "</p><hr/>";
   }

}else{


$comments = mysql_query("SELECT * FROM comments WHERE ref = '$theID' LIMIT 0, 4;" ) or die(mysql_error());

for($c=0; ($rowC = mysql_fetch_array($comments)) !== FALSE; $c++) {
    echo "<p>On " .$rowC['date']. ", ";
    echo htmlentities($rowC['username']). " said: <br/>";
    echo htmlentities($rowC['comment']);
    echo "</p><hr/>";
    if($c == 3){
       echo "<p><a href='?allcomments=1&id=$theID'>click to see more</a></p>";
       break;
    }
}

if (!$c) { 
   echo "<p>(No comments have been made yet)</p>";
}

}
?>

Я считаю, что переменная $ theID содержит только цифры от 0 до 9. Если нет, измените регулярное выражение (preg_match).

...