Xwab
Форумыnavigate_nextДругие CMS

Комент
Сообщения
Borisov

sadesto, проще сказать, как сделать, что бы в базу записывалось, какой коментарий с какой страницы оставлен. Только как. ?

03 Дек 2011, 8:10
feniksmod

автор дерзай jQuery и будут тебе комменты
добавлено спустя 11 минут:
можно еще использовать AJAX в следующем посте я расскажу как сделать систему комментариев
добавлено спустя 1 минуту:
Шаг 1. SQL

В базу данных надо добавить 2 таблицы:

01
CREATE TABLE IF NOT EXISTS `s163_items` (
02
`id` int(10) unsigned NOT NULL auto_increment,
03
`title` varchar(255) default '',
04
`description` text NOT NULL,
05
`when` int(11) NOT NULL default '0',
06
`comments_count` int(11) NOT NULL,
07
PRIMARY KEY (`id`)
08
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
09

10
INSERT INTO `s163_items` (`title`, `description`, `when`, `comments_count`) VALUES
11
('Пункт #1', 'Описание пункта #1', UNIX_TIMESTAMP(), '0'),
12
('Пункт #2', 'Описание пункта #2', UNIX_TIMESTAMP()+1, '0'),
13
('Пункт #3', 'Описание пункта #3', UNIX_TIMESTAMP()+2, '0'),
14
('Пункт #4', 'Описание пункта #4', UNIX_TIMESTAMP()+3, '0'),
15
('Пункт #5', 'Описание пункта #5', UNIX_TIMESTAMP()+4, '0');
16

17
CREATE TABLE IF NOT EXISTS `s163_items_cmts` (
18
`c_id` int(11) NOT NULL AUTO_INCREMENT ,
19
`c_item_id` int(12) NOT NULL default '0',
20
`c_ip` varchar(20) default NULL,
21
`c_name` varchar(64) default '',
22
`c_text` text NOT NULL ,
23
`c_when` int(11) NOT NULL default '0',
24
PRIMARY KEY (`c_id`),
25
KEY `c_item_id` (`c_item_id`)
26
) ENGINE=MYISAM DEFAULT CHARSET=utf8;
Первая таблица - для пунктов списка, вторая - для комментариев.



Шаг 2. PHP

Код основного файла:

index.php

001
<?php
002
// Отключаем возможные предупреждения
003
if (version_compare(phpversion(), "5.3.0", ">=") == 1)
004
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
005
else
006
error_reporting(E_ALL & ~E_NOTICE);
007

008
require_once('classes/CMySQL.php'); // Включаем сервисный класс для работы с базой данных
009

010
$sCode = '';
011
$iItemId = (int)$_GET['id'];
012
if ($iItemId) { // Просматриваем данные
013
$aItemInfo = $GLOBALS['MySQL']->getRow("SELECT * FROM `s163_items` WHERE `id` = '{$iItemId}'"); // Получаем информацию из базы данных
014
$sCode .= '<h1>'.$aItemInfo['title'].'</h1>';
015
$sCode .= '<h3>'.date('d/m/Y', $aItemInfo['when']).'</h3>';
016
$sCode .= '<h2>Описание:</h2>';
017
$sCode .= '<h3>'.$aItemInfo['description'].'</h3>';
018
$sCode .= '<h3><a href="'.$_SERVER['PHP_SELF'].'">Назад</a></h3>';
019

020
// Выводим 5 последних комментариев
021
$sComments = '';
022
$aComments = $GLOBALS['MySQL']->getAll("SELECT * FROM `s163_items_cmts` WHERE `c_item_id` = '{$iItemId}' ORDER BY `c_when` DESC LIMIT 5");
023
foreach ($aComments as $i => $aCmtsInfo) {
024
$sWhen = date('d/m/Y H:i', $aCmtsInfo['c_when']);
025
$sComments .= <<<EOF
026
<div class="comment" id="{$aCmtsInfo['c_id']}">
027
<p>Автор: {$aCmtsInfo['c_name']} <span>({$sWhen})</span>:</p>
028
<p>{$aCmtsInfo['c_text']}</p>
029
</div>
030
EOF;
031
}
032

033
ob_start();
034
?>
035
<div class="container" id="comments">
036
<h2>Комментарии</h2>
037
<script type="text/javascript">
038
function submitComment(e) {
039
var sName = $('#name').val();
040
var sText = $('#text').val();
041

042
if (sName && sText) {
043
$.post('comment.php', { name: sName, text: sText, id: <?= $iItemId ?> },
044
function(data){
045
if (data != '1') {
046
$('#comments_list').fadeOut(1000, function () {
047
$(this).html(data);
048
$(this).fadeIn(1000);
049
});
050
} else {
051
$('#comments_warning2').fadeIn(1000, function () {
052
$(this).fadeOut(1000);
053
});
054
}
055
}
056
);
057
} else {
058
$('#comments_warning1').fadeIn(1000, function () {
059
$(this).fadeOut(1000);
060
});
061
}
062
};
063
</script>
064

065
<div id="comments_warning1" style="display:none">Пожалуйста, заполните оба поля (Имя и комментарий)</div>
066
<div id="comments_warning2" style="display:none">Вы можете размещать только один комментарий каждые 10 минут (защита от спама)</div>
067
<form onsubmit="submitComment(this); return false;">
068
<table>
069
<tr><td class="label"><label>Ваше имя: </label></td><td class="field"><input type="text" value="" title="Введите ваше имя" id="name" /></td></tr>
070
<tr><td class="label"><label>Комментарий: </label></td><td class="field"><textarea name="text" id="text"></textarea></td></tr>
071
<tr><td class="label">&nbsp;</td><td class="field"><input type="submit" value="Отправить" /></td></tr>
072
</table>
073
</form>
074
<div id="comments_list"><?= $sComments ?></div>
075
</div>
076
<?
077
$sCommentsBlock = ob_get_clean();
078

079
} else {
080
$sCode .= '<h1>Список пунктов:</h1>';
081

082
$aItems = $GLOBALS['MySQL']->getAll("SELECT * FROM `s163_items` ORDER by `when` ASC"); // Получаем информацию обо всех пунктах из базы данных
083
foreach ($aItems as $i => $aItemInfo) {
084
$sCode .= '<h2><a href="'.$_SERVER['PHP_SELF'].'?id='.$aItemInfo['id'].'">'.$aItemInfo['title'].'</a></h2>';
085
}
086
}
087

088
?>
089
<!DOCTYPE html>
090
<html lang="ru" >
091
<head>
092
<meta charset="utf-8" />
093
<title>Система комментирования | Материалы сайта</title>
094

095
<link href="css/main.css" rel="stylesheet" type="text/css" />
096
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
097
</head>
098
<body>
099
<div class="container">
100
<?= $sCode ?>
101
</div>
102
<?= $sCommentsBlock ?>
103
<footer>
104
<h2>Создаем систему комментирования</h2>
105
<a href="http://www.domain.com" class="stuts" target="_blank">Материалы сайта <span>domain.com</span></a>
106
</footer>
107
</body>
108
</html>
По умолчанию данный скрипт выводит список пунктов. Каждый пункт имеет свою страницу. На данной странице выводится название пункта, дата добавления в список, описание и блок комментариев. В блоке содержится форма для добавления нового комментария и выводится 5 последних комментариев.

Следующий файл PHP:

comment.php

01
<?php
02
// Отключаем возможные предупреждения
03
if (version_compare(phpversion(), "5.3.0", ">=") == 1)
04
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
05
else
06
error_reporting(E_ALL & ~E_NOTICE);
07

08
require_once('classes/CMySQL.php'); // Включаем сервисный класс
09

10
$iItemId = (int)$_POST['id']; // Получаем необходимую информацию
11
$sIp = getVisitorIP();
12
$sName = $GLOBALS['MySQL']->escape(strip_tags($_POST['name']));
13
$sText = $GLOBALS['MySQL']->escape(strip_tags($_POST['text']));
14

15
if ($sName && $sText) {
16
// Проверка - размещался недавно комментарий или нет
17
$iOldId = $GLOBALS['MySQL']->getOne("SELECT `c_item_id` FROM `s163_items_cmts` WHERE `c_item_id` = '{$iItemId}' AND `c_ip` = '{$sIp}' AND `c_when` >= UNIX_TIMESTAMP() - 600 LIMIT 1");
18
if (! $iOldId) {
19
// Если нет - добавляем комментарий
20
$GLOBALS['MySQL']->res("INSERT INTO `s163_items_cmts` SET `c_item_id` = '{$iItemId}', `c_ip` = '{$sIp}', `c_when` = UNIX_TIMESTAMP(), `c_name` = '{$sName}', `c_text` = '{$sText}'");
21
$GLOBALS['MySQL']->res("UPDATE `s163_items` SET `comments_count` = `comments_count` + 1 WHERE `id` = '{$iItemId}'");
22

23
// и выводим последние 5 комментариев
24
$sOut = '';
25
$aComments = $GLOBALS['MySQL']->getAll("SELECT * FROM `s163_items_cmts` WHERE `c_item_id` = '{$iItemId}' ORDER BY `c_when` DESC LIMIT 5");
26
foreach ($aComments as $i => $aCmtsInfo) {
27
$sWhen = date('d/m/Y H:i', $aCmtsInfo['c_when']);
28
$sOut .= <<<EOF
29
<div class="comment" id="{$aCmtsInfo['c_id']}">
30
<p>Автор: {$aCmtsInfo['c_name']} <span>({$sWhen})</span>:</p>
31
<p>{$aCmtsInfo['c_text']}</p>
32
</div>
33
EOF;
34
}
35

36
echo $sOut;
37
exit;
38
}
39
}
40
echo 1;
41
exit;
42

43
function getVisitorIP() {
44
$ip = "0.0.0.0";
45
if( ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) && ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) {
46
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
47
} elseif( ( isset( $_SERVER['HTTP_CLIENT_IP'])) && (!empty($_SERVER['HTTP_CLIENT_IP'] ) ) ) {
48
$ip = explode(".",$_SERVER['HTTP_CLIENT_IP']);
49
$ip = $ip[3].".".$ip[2].".".$ip[1].".".$ip[0];
50
} elseif((!isset( $_SERVER['HTTP_X_FORWARDED_FOR'])) || (empty($_SERVER['HTTP_X_FORWARDED_FOR']))) {
51
if ((!isset( $_SERVER['HTTP_CLIENT_IP'])) && (empty($_SERVER['HTTP_CLIENT_IP']))) {
52
$ip = $_SERVER['REMOTE_ADDR'];
53
}
54
}
55
return $ip;
56
}
57

58
?>
Данный файл принимает комментарии, переданные запросом POST, и сохраняет их базе данных.

В проекте также есть еще один PHP файл:

classes/CMySQL.php

В нем содержится класс для работы с базой данных. Именно в этом файле надо внести данные для связи с сервером баз данных:

1
$this->sDbName = 'ИМЯ_БАЗЫ_ДАННЫХ';
2
$this->sDbUser = 'ИМЯ_ПОЛЬЗОВАТЕЛЯ';
3
$this->sDbPass = 'ПАРОЛЬ';
Класс достаточно универсальный и его можно использовать в других проектах.



Шаг 3. Включаем jQuery

В проекте используется jQuery, одна из версий которого содержится в файловой структуре:

js/jquery-1.5.2.min.js



Шаг 4. CSS

Осталось определиться с используемыми стилями:

css/main.css

view sourceprint?
001
*{
002
margin:0;
003
padding:0;
004
}
005

006
body {
007
background-repeat:no-repeat;
008
background-color:#bababa;
009
background-image: -webkit-radial-gradient(600px 200px, circle, #eee, #bababa 40%);
010
background-image: -moz-radial-gradient(600px 200px, circle, #eee, #bababa 40%);
011
background-image: -o-radial-gradient(600px 200px, circle, #eee, #bababa 40%);
012
background-image: radial-gradient(600px 200px, circle, #eee, #bababa 40%);
013
color:#fff;
014
font:14px/1.3 Arial,sans-serif;
015
min-height:600px;
016
}
017

018
footer {
019
background-color:#212121;
020
bottom:0;
021
box-shadow: 0 -1px 2px #111111;
022
display:block;
023
height:70px;
024
left:0;
025
position:fixed;
026
width:100%;
027
z-index:100;
028
}
029

030
footer h2{
031
font-size:22px;
032
font-weight:normal;
033
left:50%;
034
margin-left:-400px;
035
padding:22px 0;
036
position:absolute;
037
width:540px;
038
}
039

040
footer a.stuts,a.stuts:visited{
041
border:none;
042
text-decoration:none;
043
color:#fcfcfc;
044
font-size:14px;
045
left:50%;
046
line-height:31px;
047
margin:23px 0 0 110px;
048
position:absolute;
049
top:0;
050
}
051

052
footer .stuts span {
053
font-size:22px;
054
font-weight:bold;
055
margin-left:5px;
056
}
057

058
.container {
059
border:3px #111 solid;
060
color:#000;
061
margin:20px auto;
062
padding:15px;
063
position:relative;
064
text-align:center;
065
width:500px;
066

067
border-radius:15px;
068
-moz-border-radius:15px;
069
-webkit-border-radius:15px;
070
}
071

072
#comments form {
073
background-color: rgba(255, 255, 255, 0.4);
074
margin:10px 0;
075
padding:10px;
076
text-align:left;
077
}
078

079
#comments table td.label {
080
color: #000;
081
font-size: 13px;
082
padding-right: 3px;
083
text-align: right;
084
width: 105px;
085
}
086

087
#comments table label {
088
color: #000;
089
font-size: 16px;
090
font-weight: normal;
091
vertical-align: middle;
092
}
093

094
#comments table td.field input, #comments table td.field textarea {
095
border: 1px solid #96A6C5;
096
font-family: Verdana,Arial,sans-serif;
097
font-size: 16px;
098
margin-top: 2px;
099
padding: 6px;
100
width: 250px;
101
}
102

103
#comments_list {
104
background-color: rgba(255, 255, 255, 0.4);
105
margin:10px 0;
106
padding:10px;
107
text-align:left;
108
}
109

110
#comments_list .comment {
111
border-top:1px solid #000;
112
padding:10px 0;
113
}
114

115
#comments_list .comment:first-child {
116
border-top-width:0px;
117
}
118

119
#comments_list .comment span {
120
font-size:11px;
121
}
============================
вот примерно так))))

11 Фев 2012, 8:40
sadesto

бредятина...

11 Фев 2012, 9:08
Kpegumop

Ой как все запущено. Нужно то только узнать идентификатор страницы(ид или название, как то ж автор туда попадает). Любой. Создать таблицу для записи комментария(с полем в которое записать идентификатор страницы) . Ну и на самой странице форму, запись в базу и вывод соответственно(можно сделать отдельно, так лучше даже, чтобы кучу кода не писать)

11 Фев 2012, 9:09
svoloch

Эм... Если я правильно понял, автору надо немного не то. Он хочет сделать разделение по типу данных на странице. Так и записывай в ячейку что компенсируется.

11 Фев 2012, 13:41
FeST

Блин, а вы видели дату создания темы?

11 Фев 2012, 13:49
Ответить на тему