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

Реферальная программа Мегаплана


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

#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

#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