Перейти к содержимому



Постраничная навигация

#1 cap4369

cap4369
  • Неактивные
  • 62 сообщений
  • Репутация: 1
0

Отправлено 12 Сентябрь 2013 - 14:51

Здравствуйте! Не могу разобраться с проблемой. Сделал постраничную навигацию для статей, все чудесно! А вот с комментариями проблема. В браузере выводится ошибка: "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 ' 2' at line 1"
Вот код functions.php:
<?php
/* Постраничная навигация статей */
function link_article($page, $pages_count, $parametr){
for ($j = 1; $j <= $pages_count; $j++){
  if ($j == $page){
   echo '<a class="nav_active"><b>'.$j.'</b></a>';
  }
  else{
   echo '<a class="nav_link" href='.$_SERVER['PHP_SELF'].'?category_id=' .$parametr. '&page='.$j.'>'.$j.'</a>';
  }
  if($j !=$pages_count) echo '';
}
return true;
}
/* Постраничная комментариев */
function link_comment($page, $pages_count, $parametr){
for ($j = 1; $j <= $pages_count; $j++){
  if ($j == $page){
   echo '<a class="nav_active"><b>'.$j.'</b></a>';
  }
  else{
   echo '<a class="nav_link" href='.$_SERVER['PHP_SELF'].'?article_id=' .$parametr. '&page='.$j.'#comments>'.$j.'</a>';
  }
  if($j !=$pages_count) echo '';
}
return true;
}
?>
А вот код со статьей комментариями и формой добавления комментариев
<?php
require_once './config.php';
require_once './functions.php';
session_start();
// Вывод статьи
$article_id = (int)$_GET['article_id'];
$perpage = 2; // Количество комментариев, выводимых на одной странице из БД
if(empty($_GET['page']) || ($_GET['page'] <=0)){
$page = 1;
}
else{
$page = (int) $_GET['page']; // Считывание текущей страницы
}
/* Получение количества комментариев */
$res = mysql_query("SELECT `name`, `comment`, `date_comment` FROM `comments` WHERE `article_id`=".$article_id." AND `visible`='1' ORDER BY `comment_id` DESC LIMIT {$start_pos}, {$perpage}") or die(mysql_error());
$count = mysql_num_rows($res); // Количество комментариев
$pages_count = ceil($count / $perpage); // Количество страниц
if($page > $pages_count) $page = $pages_count; // Если запрошенная страница по номеру превышает количество страниц
$start_pos = ($page - 1) * $perpage; // Начальная позиция для запрса к БД

$res_article = mysql_query("SELECT * FROM `articles` WHERE `article_id`= $article_id AND `visible` = '1'") or die(mysql_error());
$row_article = mysql_fetch_assoc($res_article);
// Добавление комментария
if($_POST['submit']){
$name = trim(mysql_real_escape_string(mb_substr($_POST['name'],0,20,'UTF-8')));
$comment = trim(mysql_real_escape_string(mb_substr($_POST['comment'],0,1000,'UTF-8')));
$date_comment = date("Y-m-d");
$error = '';

if(empty($name)) $error .= '<p>Вы не представились!</p>';
if(empty($comment)) $error .= '<p>Вы не написали комментарий!</p>';
if($_POST['aspam'] == 'on') $error .= '<p>Вы не отключили метку!</p>';

if(empty($error)){
  $res = mysql_query("INSERT INTO `comments` SET
			 `name` = '{$name}',
			 `comment` = '{$comment}',
			 `date_comment` = '{$date_comment}',
			 `article_id` =".$article_id) or die(mysql_error());		
  if(mysql_affected_rows() > 0) {
   $_SESSION['res'] = '<p style="color: green;"><strong>Спасибо! После модерации Ваш комментарий будет добавлен на сайт.</strong></p>';
  header("Location: {$_SERVER['PHP_SELF']}?{$_SERVER['QUERY_STRING']}#res");
  exit();	
  }
  else {
   $_SESSION['res'] = '<p><strong>Ошибка! Попробуйте позже.</strong></p>';
  header("Location: {$_SERVER['PHP_SELF']}?{$_SERVER['QUERY_STRING']}#res");
  exit();
  }   
}
else {
  $_SESSION['res'] = '<p><strong>Ошибка заполнения формы:</strong></p>'.
  $error;
  $_SESSION['name'] = $name;
  $_SESSION['comment'] = $comment;
  header("Location: {$_SERVER['PHP_SELF']}?{$_SERVER['QUERY_STRING']}#res");
  exit();
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><?=$head_title;?> | <?=htmlspecialchars($row_article['title']);?></title>
<meta name="keywords" content="<?=htmlspecialchars($row_article['keywords']);?>" />
<meta name="description" content="<?=htmlspecialchars($row_article['description']);?>" />
<link rel="stylesheet" href="style.css" type="text/css" media="screen, projection" />
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/equalHeight.js"></script>
</head>
<?php
require_once './header.php';
require_once './menu.php';
?>
<div id="middle">
<div id="container">
<div id="maincontent">

<?php
  if(mysql_num_rows($res_article) > 0) {
  
   //При каждом новом обращении к БД, значение поля 'views', увеличивается на 1, для этого создаем переменную:
   $views = $row_article['views'] + 1;
   $res = mysql_query("UPDATE `articles` SET `views` = '{$views}' WHERE `article_id` = '{$article_id}'");
  
   //Вывод заголовка статьи
   echo '<div id="article_title"><h2>' . $row_article['title'] . '</h2>' . '</div>' . "rn" . '<br />';
  
   //Вывод полного текста статьи
   echo $row_article['content'];
  
   // Вывод автора, даты и количества просмотров
    echo '<div id="sign">' . "rn";
	 echo 'Автор: ' . '<span>' . $row_article['author'] . '</span>' . '<br />' . "rn";
	 echo 'Дата создания: ' . '<span>' . $row_article['date'] . '</span>' . '<br />' . "rn";
	 echo 'Проосмотров: ' . '<span>' . $views . '</span>' . '</div><div id="clr">' . "rn";
    echo '</div>'. "rn" . "rn";
  }
  else echo 'Такой статьи нет!';
?>

<div id="comments">


<h2>Комментарии(<?=mysql_num_rows($res);?>)</h2>
</div><!-- #comments-->

<?php
  if(mysql_num_rows($res) > 0) {
   while($row = mysql_fetch_assoc($res)) {
?>
    <div class="comment">
	 <p class="comment_meta"><span><?=$row['date_comment'];?></span> <?= htmlspecialchars($row['name']);?></p>
	 <p class="comment_meta_text"><?= nl2br(htmlspecialchars($row['comment']));?></p>
    </div> 
<?php  }
  }
  else echo 'Комментариев к этой статье нет, Вы можете быть первым.';
?>

<div class="nav">
<?php
if($count >0){
  // Вызов функции, для вывода ссылок в браузере
  link_comment($page, $pages_count, $article_id);
}
?>
</div><!-- .nav -->

<p><strong>Для того, чтобы оставить свой комментарий, заполните форму ниже. <span style="color: red;">Внимание! Содержимое комментария проверяется модератором, после чего выводится на сайте.</span></strong></p>
<div class="form_comment">
  <form method="post">
   <table cellspacing="10">
    <tr>
	 <td>Имя: </td>
	 <td><input type="text" name="name" maxlength="20" size="50" value="<?= htmlspecialchars($_SESSION['name']);?>"/></td>
    </tr>
    <tr>
	 <td>Текст комментария: </td>
	 <td><textarea name="comment" cols="50" rows="5"><?= htmlspecialchars($_SESSION['comment']);?></textarea></td>
    </tr>
    <tr>
	  <td><strong>Отключите метку!</strong></td>
	  <td><input type="checkbox" name="aspam" checked="checked" /></td>
    </tr>
    <tr>
	 <td colspan="2">
	  <input type="submit" name="submit" value="Добавить комментарий" />
	 </td>
    </tr>
   </table>
  </form>
  <a name="res"></a>
  <div id="error">
   <?php
   echo $_SESSION['res'];
   unset($_SESSION['res']);
   unset($_SESSION['name']);
   unset($_SESSION['comment']);
   ?>
  </div><!-- .error -->
</div><!-- .form_comment -->

</div><!-- #maincontent-->
</div><!-- #container-->
<?php
require_once './left.php';
require_once './right.php';
require_once './footer.php';
?>

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Сортировка страниц по 10 обзоров на каждой? как сделатЬ?
  2. Постраничная навигация на готовом mp3 движке
  3. Обратная нумерация строк, нужна помощь
  4. Как лучше организовать пагинацию на сайте
  5. Правильная оптимизация постраничной навигации

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 12 Сентябрь 2013 - 15:17

Здравствуйте.
Для получения количества страниц ($pages_count) Вы оперируете значением переменной $count (кол-во комментариев)... при этом значение данной переменной ($count) еще попросту не определено, его Вы определяете почему-то ниже... вот так у Вас:
$pages_count = ceil($count / $perpage); // Количество страниц
...
// кстати, с запросом та же беда
$res = mysql_query("SELECT `name`, `comment`, `date_comment` FROM `comments` WHERE `article_id`=".$article_id." AND `visible`='1' ORDER BY `comment_id` DESC LIMIT {$start_pos}, {$perpage}") or die(mysql_error());
$count = mysql_num_rows($res); // Количество комментариев
Соответственно, в $pages_count попадает ноль... поскольку:
echo ceil(null / 2); // вернет 0
В итоге получается ноль страниц... а должна быть, как минимум одна... местами, наверное, нужно поменять:
// вначале получаем кол-во комментариев
$res = mysql_query("SELECT `name`, `comment`, `date_comment` FROM `comments` WHERE `article_id`=".$article_id." AND `visible`='1' ORDER BY `comment_id` DESC LIMIT {$start_pos}, {$perpage}") or die(mysql_error());
$count = mysql_num_rows($res); // Количество комментариев
...
// а затем рассчитываем необходимое кол-во страниц, исходя из кол-ва комментов
$pages_count = ceil($count / $perpage); // Количество страниц

Ну и после определения кол-ва страниц также неплохо было бы добавить проверку... поскольку, если комментариев нет, то у нас также получится 0 страниц, а страница-то одна все равно нужна:
// вначале получаем кол-во комментариев
$res = mysql_query("SELECT `name`, `comment`, `date_comment` FROM `comments` WHERE `article_id`=".$article_id." AND `visible`='1' ORDER BY `comment_id` DESC LIMIT {$start_pos}, {$perpage}") or die(mysql_error());
$count = mysql_num_rows($res); // Количество комментариев
...
// а затем рассчитываем необходимое кол-во страниц, исходя из кол-ва комментов
$pages_count = ceil($count / $perpage); // Количество страниц
if(!$pages_count) $pages_count = 1; // минимум 1 страница должна быть... мы ведь куда-то обращаемся все же

UPD. Пока писал ответ, смотрю Вы немного подправили код поста... местами поменяли, но запрос на получение кол-ва комментов страдает той же бедой... ну и непонятно, зачем для получения общего количества комментов, пытаться получить часть из них?
Такой запрос может быть правильным:
$res = mysql_query("SELECT `name` FROM `comments` WHERE `article_id`=".$article_id." AND `visible`='1'") or die(mysql_error());

  • 1


#3 cap4369

cap4369
    Topic Starter
  • Неактивные
  • 62 сообщений
  • Репутация: 1

Отправлено 12 Сентябрь 2013 - 22:23

Спасибо, все получилось так как надо! Мне еще учиться и учиться. Но я настырный, у меня надеюсь получится. <_<
  • 0


Оформление форума – IPBSkins.ru