Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Гостевая книга


Автор: PARROT 21.1.2005, 22:40
Пишу гостевую книгу, с добавлением коментариев.
Ничего не получается, в базу не добавляется, вообщем финиш.
база:
# MySQL-Front Dump 2.5
#
# Host: localhost Database: reviews
# --------------------------------------------------------
# Server version 4.1.8-max


#
# Table structure for table 'review'
#

CREATE TABLE review (
id smallint(3) NOT NULL auto_increment,
data date default NULL,
txt text,
name varchar(50) default NULL,
parent smallint(3) default NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'review'
#

сам скрипт:
<?
mysql_connect("localhost","reviews","1538733");
mysql_select_db("reviews");
?>
<Form action="index.php" Method="POST">
<table cellpadding="0" cellspacing="0" align="center" bgcolor="#E8F0FB">
<tr>
<td style="padding-right:20">Имя:</td>
<td><Input Type="text" Name="name" maxlength="40" size="48"></td>
</tr>
<tr>
<td colspan=2>Сообщение:</td>
</tr>
<tr>
<td colspan=2 align=center><TextArea name="txt" rows=5 cols=30></TextArea></td>
</tr>
<tr>
<td><Input Type="submit" name="send" Value="Добавить" style="cursor:hand"></td>
<td align="right"><Input Type="reset" Value="Очистить" style="cursor:hand"></td>
</tr>
</table>
</Form>
<?
if($send)
{
$data=date("Y-m-d");
mysql_query("insert into review values(' ','$data','$txt','$name',' ')");
}
?>

Объясните пожалуйста.

Автор: BIG BROTHER 21.1.2005, 23:13
INSERT INTO review (`data`, `txt`, `name`, `parent`) VALUES ('$data','$txt','$name',' ')

используй лучше $_POST $_GET и тп

Автор: Opik 22.1.2005, 00:36
Советую переорганизовать скрипт:
Код
<?
mysql_connect("localhost","reviews","1538733");
mysql_select_db("reviews");

if($_POST['send']){
$data=date("Y-m-d");
mysql_query("insert into review values(' ','".mysql_escape_string($_POST['data'])."','".mysql_escape_string($_POST['txt'])."','".mysql_escape_string($_POST['name'])."',' ')") or die(mysql_error()); // 1) Пришло из POST запроса 2) Обрабаываем на бяки :) 3) Ещё бы проверку HTML тегов ))) если ошибка - выводим причину
Header("Location: gbook.php"); // Редиректимся для очистки $_POST
exit();
} else {
?>
<Form action="index.php" Method="POST">
<table cellpadding="0" cellspacing="0" align="center" bgcolor="#E8F0FB">
<tr>
<td style="padding-right:20">Имя:</td>
<td><Input Type="text" Name="name" maxlength="40" size="48"></td>
</tr>
<tr>
<td colspan=2>Сообщение:</td>
</tr>
<tr>
<td colspan=2 align=center><TextArea name="txt" rows=5 cols=30></TextArea></td>
</tr>
<tr>
<td><Input Type="submit" name="send" Value="Добавить" style="cursor:hand"></td>
<td align="right"><Input Type="reset" Value="Очистить" style="cursor:hand"></td>
</tr>
</table>
</Form>
<?
}
?>

Автор: PARROT 22.1.2005, 21:31
Спасибо. Решила вопрос.
Но возник еще один:
Для чего и в каких случаях, и зачем употребляются ` `
Я раньше с этим не сталкивалась.

Автор: Irokez 22.1.2005, 21:43
кажется ими заменяют одинарные кавычки...

Автор: Mal Hack 22.1.2005, 22:04
Irokez
нет. в SQL они используются для обособления имен баз, таблиц и столбцов.

Автор: Irokez 22.1.2005, 22:13
Mal Hack а ... точно ... и только для этого?

Автор: Mal Hack 22.1.2005, 22:39
Irokez
В PHP ни разу не видел их применение. В SQL тока так.

Автор: Gold Dragon 23.1.2005, 11:59
на сколько я знаю, это синтаксис самого MySQL

Автор: IZ@TOP 23.1.2005, 12:20
Они обычно используются для избежания конфликтов имен столбцов и зарезервированных слов синтаксисиа MySQL.

Автор: PARROT 23.1.2005, 20:59
Почему у меня не получилось как раньше :

mysql_query("insert into review values(' ','$data','$txt','$name',' ')");

просто занести заполненные данные в базу, не перечисляя перед этим названия полей базы в ` `

smile

Может причина в совпадающих полях и переменных?

Тогда стоит ли использовать одинаковые имена?

Автор: Opik 24.1.2005, 00:10
Irokez
нет, не только.
Mal Hack
увидь:
`` можно использовать для выполнения комманд, попробуй например в винде запустить файлик:
Код
<?
print '<pre>';
print `dir`;
print '</pre>';
?>

Автор: Mal Hack 24.1.2005, 00:19
Цитата(Opr @ 24.1.2005, 00:10)
увидь:
`` можно использовать для выполнения комманд, попробуй например в винде запустить файлик:

Не знал об этом...
А в линуксе команды shell так же можно вызвать?

Автор: Opik 24.1.2005, 00:19
Mal Hack
сорри, не проверял, думаю да.

Автор: PARROT 24.1.2005, 00:41
Цитата(Opr @ 24.1.2005, 00:10)
Irokez
нет, не только.
Mal Hack
увидь:
`` можно использовать для выполнения комманд, попробуй например в винде запустить файлик:
Код
<?
print '<pre>';
print `dir`;
print '</pre>';
?>

Запустила, и что он показывает?
Время последнего открытия или создания файлов, данного каталога?

Автор: Opik 24.1.2005, 00:44
PARROT
он выполняет команды ms-dos
Код
print `ipconfig`; // Win XP

Добавлено @ 00:44
MS - dos - под виндой

Автор: PARROT 24.1.2005, 00:46
Цитата(Opr @ 24.1.2005, 00:44)
PARROT
он выполняет команды ms-dos
Код
print `ipconfig`; // Win XP

Добавлено @ 00:44
MS - dos - под виндой

Да, век живи, ничего не узнаешь.
По Cron, на русском языке его описание имеется?

Автор: Opik 24.1.2005, 00:47
http://www.nncron.ru/nncronlt/help/RU/working/cron-format.htm
http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/configtuning-cron.html

Автор: PARROT 24.1.2005, 00:50
Спасибо!
Прочту.

Автор: Mal Hack 24.1.2005, 01:06
Opr
завтра на сервере проверю
+ за полезную, интересную вещь...
Буду еще знать, что надо обрубать в плане безопасности.

Автор: Opik 24.1.2005, 01:08
Цитата
Warning:  shell_exec() has been disabled for security reasons in /home/bk/public_html/tmp/cmd.php on line 3

smile)) вообщем в unix тоже работает smile

Автор: PARROT 28.1.2005, 10:20
Здравствуйте.
Назрел еще один важный вопрос:
Как и чем можно узнать количество просмотра комментариев, пользователями?


Только большая просьба, если можно, от простого к сложному.

Суть такая, есть главная страница с сообщениями, по ссылке пользователь выходит на другую страницу для просмотра оставленных комментариев к сообщению.

Нужно узнать сколько раз пользователи просмотрели комментарии.
smile

Автор: IZ@TOP 28.1.2005, 10:26
Да. Создать еще таблицу в которой будет два поля:

Код
create table stat_view_comments (
  cmid int not null default 0,
  cnt int 11 not null default 0,
  primary key (cmid)
);

Где cmid это идентификатор комментария, а cnt количество просмотров, которое обновляется каждый раз след. образом:

Код
update stat_view_comments set cnt = (cnt+1) where cmid = сюда_впишешь_переменную_с_ид_коммента


Думаю так должно быть понятно что к чему, если нет, пиши, объясню что не понятно.

Автор: PARROT 28.1.2005, 20:51
Цитата(IZ @ 28.1.2005, 10:26)
Да. Создать еще таблицу в которой будет два поля:

Код
create table stat_view_comments (
  cmid int not null default 0,
  cnt int 11 not null default 0,
  primary key (cmid)
);

Где cmid это идентификатор комментария, а cnt количество просмотров, которое обновляется каждый раз след. образом:

Код
update stat_view_comments set cnt = (cnt+1) where cmid = сюда_впишешь_переменную_с_ид_коммента


Думаю так должно быть понятно что к чему, если нет, пиши, объясню что не понятно.

В базе есть поле parent, если parent=0, то это новое сообщение, а если parent=id (1, 2, и т.д.), то это комментрий к сообщению по id сообщения.

А без создания дополнительной таблицы никак не обойтись?

Я согласна на создание дополнительной таблицы, если это необходимо, глвное в этом случае не запутаться.

smile

Автор: IZ@TOP 29.1.2005, 21:06
PARROT, вообще-то лучше делать для комментов отдельную таблицу. Можно без создания доп. таблицы, просто добавить поле к основной таблице cnt_view_comments, значение которого увеличевается при просмотре комментариев.

Автор: PARROT 30.1.2005, 00:47
Добавила в базу для подсчета комментариев следующее поле cnt int(11) not null default '0', соответственно после поля parent, далее, если я правильно поняла, то при щелчке на заголовок сообщение открывается другая страница с основным сообщением и добавленными к нему комментариями, только вот не желает он считать...

вот код:

<table width=700 align=center>
<tr>
<td align=right><a href="add.php"><img src="img/nt.gif" border=0></a></td>
</tr>
</table>
<?
$db=mysql_pconnect("localhost","reviews","1538733");
mysql_select_db("reviews");
$res=@mysql_query("SELECT id,data,caption,name,txt FROM review WHERE id='$idp'");
for($i=0;$i<mysql_num_rows($res);$i++)
{
$mas=mysql_fetch_row($res);
$mas[1]=stripslashes($mas[1]);
$mas[2]=stripslashes($mas[2]);
$mas[3]=stripslashes($mas[3]);
$mas[4]=stripslashes($mas[4]);
$up=@mysql_query("UPDATE review SET cnt = cnt+1 where parent = '$idp'");
?>
<table width=700 align=center border border bordercolor=silver style=border-collapse:collapse cellpadding=0 cellspacing=0>
<tr>
<td rowspan=3 width=200 align=center><b><? echo $mas[3]; ?></b></td>
<td style='padding-left:10'><u><b>дата</b></u> <? echo $mas[1]; ?></td>
</tr>
<tr>
<td style='padding-left:10'><? echo $mas[2]; ?></td>
</tr>
<tr>
<td style='padding-left:10'><? echo $mas[4]; ?></td>
</tr>
<?
}
$res1=@mysql_query("SELECT id,data,caption,name,txt FROM review WHERE parent='$idp'");
for($i=0;$i<mysql_num_rows($res1);$i++)
{
$mas_com=mysql_fetch_row($res1);
$mas_com[1]=stripslashes($mas_com[1]);
$mas_com[2]=stripslashes($mas_com[2]);
$mas_com[3]=stripslashes($mas_com[3]);
$mas_com[4]=stripslashes($mas_com[4]);
?>
<tr>
<td rowspan=3 width=200 align=center><b><? echo $mas_com[3]; ?></b></td>
<td style='padding-left:10'><u><b>дата</b></u> <? echo $mas_com[1]; ?></td>
</tr>
<tr>
<td style='padding-left:10'><? echo $mas_com[2]; ?></td>
</tr>
<tr>
<td style='padding-left:10'><? echo $mas_com[4]; ?></td>
</tr>
<?
}
?>
</table>
<table width=700 align=center>
<tr>
<td align=right><a href=add.php?idp=<? echo $mas[0]; ?> ><img src="img/dc.gif" border=0></a></td>
</tr>
</table>

Насколько правильно я воткнула нужную строчку, незнаю, знаю точно что считать не желает.
Спасите Попугая!
Объясните пожалуйста.

Автор: PARROT 30.1.2005, 01:33
Спасибо IZ@TOP , все работает!
Догадалась сама, хоть и методом тыка, пока.
Теперь мне осталось дописать проверку на заполнение полей и соединить все с регистрацией пользователя.
Вопрос 1.
В каком формате можно и нужно хранить пароль? md5() или можно в открытую?
А если пользователь забыл пароль, то придется генерировать новый и добавлять его в базу по мылу или имени?
Что проще?
Потом, хочется еще, чтобы пользователи смогли загружать свои аватары (это у вас так называется), как это правильно сделать?

Только не говори, что вопросов много, это еще не все!

Автор: Mal Hack 30.1.2005, 02:00
Цитата(PARROT @ 30.1.2005, 01:33)
В каком формате можно и нужно хранить пароль? md5() или можно в открытую?

ну в открытую точно хранить нельзя, а вот быбор алгоритма хэширования - как твоей душе угодно.

Цитата(PARROT @ 30.1.2005, 01:33)
то придется генерировать новый и добавлять его в базу по мылу или имени?

Как минимум - генерировать новый пасс, писать на место старого и отсылать на мыло.

Автор: IZ@TOP 30.1.2005, 12:21
Цитата(Mal @ 30.1.2005, 03:00)
Как минимум - генерировать новый пасс, писать на место старого и отсылать на мыло.

Желательно с подтверждением, как на этом форуме.


Цитата(PARROT @ 30.1.2005, 02:33)
Потом, хочется еще, чтобы пользователи смогли загружать свои аватары (это у вас так называется), как это правильно сделать?

Прочти внимательно это http://forum.vingrad.ru/index.php?showtopic=11017 . Аватары храни в отдельной папке, имена аватаров должны быть названы в соответствии с ID пользователя (что-то вроде как в IBP av-1239.gif).


Цитата(PARROT @ 30.1.2005, 01:47)
Насколько правильно я воткнула нужную строчку, незнаю, знаю точно что считать не желает.
Спасите Попугая!

У тебя же вроде как я понял комментарии к гостевой книге хранятся в тойже таблице что и сами сообщения, и parent связывает их с сообщением в гостевой книге? Тогда тебе нужно не по parent cnt+1, а по id записи комментарии которой в данный момент просматривают.

Автор: PARROT 30.1.2005, 13:01
По сути я хочу сделать гостевую (форум) похожую на ваш форум:
Поэтому возник еще один вопрос (правда о реализации его я еще сама не думала, лучше спросить...)

В меню вашего форума есть:
Тема|Автор|Ответов|Просмотров|Обновление

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

Вопрос:
Как это реализовать?
Можно пример, простой.
С подсказкой лучше думается.
Спасибо!
smile

Автор: PARROT 30.1.2005, 13:19
И еще...
Добавленные сообщения выводятся массивом:

if (!isset($s)) $s=1;
$s=$s-1;
echo"<center>";
$res4=mysql_query("select count(id) from review WHERE parent=0");
$num=mysql_fetch_row($res4);

$numstr=ceil($num[0]/10);
for($i=0; $i<$numstr; $i++){
$start=$i*10+1;
$stop=($i+1)*10;
if($stop>$num[0])
{$stop=$num[0];}
if($start!=$stop)
{
print "<a href=index.php?s=$start style='text-decoration:none'>[$start - $stop]</a> ";
}
else{
print "<a href=index.php?s=$start style='text-decoration:none'>[$start]</a> ";
}
}

И печатаются [1-10] [11-20] и т. д.
Данный вариант меня не очень устраивает, хочу чтобы на одной странице было 10 сообщений, но при этом печаталась [1], следующие 10 сообщений [2], но незнаю как правильно изменить скрипт, пыталась...
Пока тщетно.
Объясните пожалуйста.

Автор: IZ@TOP 30.1.2005, 13:21
FAQ: http://forum.vingrad.ru/index.php?showtopic=25984

Автор: Mal Hack 30.1.2005, 16:53
Цитата(IZ @ 30.1.2005, 12:21)
Желательно с подтверждением, как на этом форуме.

Это уже как максимум...

Автор: PARROT 30.1.2005, 17:06
Цитата(PARROT @ 30.1.2005, 13:01)
По сути я хочу сделать гостевую (форум) похожую на ваш форум:
Поэтому возник еще один вопрос (правда о реализации его я еще сама не думала, лучше спросить...)

В меню вашего форума есть:
Тема|Автор|Ответов|Просмотров|Обновление

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

Вопрос:
Как это реализовать?
Можно пример, простой.
С подсказкой лучше думается.
Спасибо!
smile

smile

Автор: IZ@TOP 30.1.2005, 23:02
Ну так и бери из базы самое свежее сообщение!

например есть у нас таблица с сообщениями:
Код
create table messages (
   id int not null auto_increment,
   thread_id int not null default '0',
   author varchar(30),
   message text,
   lastupdate int(10),
   primary key(id)
);

В поле thread_id, допустим, хранится идентификатор темы, в поле lastupdate записанный timestamp последнего сообщения (то есть мы туда записываем результат работы функции time()), далее выбираем все самые свежие записи для всех имеющихся тем:

Код
select id, author, from_unixtime('%d.%m.%Y', lastupdate) as ddmmyy
   group by thread_id order by lastupdate desc


Получаем данные следующего типа:
Код

array(
   id => 1
   author => IZ@TOP
   ddmmyy => 30.01.2005
)


Ну и т.п.
Добавлено @ 23:05
ЗЫ этот запрос вернет не просто последний ответ в тему, а вернет все последние ответы во все темы. Можно конечно отобрать по ID, тогда надо просто добавить условие на отбор по thread_id.
Добавлено @ 23:05
PARROT, ты только потом обязательно покажи свое твоерение.

Автор: PARROT 30.1.2005, 23:34
Обязательно покажу.
Обновление доделаю, выложу к себе на сервер, остальное по мере дописывания.
Мы еще вместе помучаемся, надеюсь.

Вопрос: Как добавляются плюсы в репутацию?
У меня не получилось добавить.

Автор: IZ@TOP 31.1.2005, 01:32
PARROT, по достижении 100 постов и более smile

Автор: PARROT 31.1.2005, 12:05
Цитата(IZ @ 31.1.2005, 01:32)
PARROT, по достижении 100 постов и более smile

IZ@TOP, я вам хотела добавить ++++, много, за помощь постоянную.

Автор: IZ@TOP 31.1.2005, 12:15
PARROT, думаю это еще успеется smile Можно отблагодарить и пивом smile

Так, ладно, давайте приедрживаться темы и не разводить здесь флейм smile

Автор: PARROT 31.1.2005, 13:09
Цитата(IZ @ 31.1.2005, 12:15)
PARROT, думаю это еще успеется smile Можно отблагодарить и пивом smile

Так, ладно, давайте приедрживаться темы и не разводить здесь флейм smile

Пивом так пивом, без вопросов!

Автор: PARROT 31.1.2005, 20:19
С обновлением я справилась, завтра займусь защитой и сразу возник вопрос:
Как защитить форму от обновления по F5 ?
smile

Автор: IZ@TOP 31.1.2005, 20:54
Код
header('location: file.php');
Юзер даже не заметит что его перенесло, а POST "остаточное явление" исчезнет smile
Можно правда писать юзеру в куки хеш его сообщения и если он совпадет с хешем вновь передаваемых данных, то ни чего в базу не заносим. smile

Автор: PARROT 1.2.2005, 16:28
IZ@TOP, защиту написала, все работает.
Возник вопрос по использованию смайликов (он возникал и раньше, на что ответ был таким: Что мне это не нужно!)

Вот код:
<table width=900>
<tr>
<td align=right><a href="index.php">Посмотреть сообщения</td>
</tr>
</table>
<?
$name=$_POST['name'];
$txt=$_POST['txt'];
$capt=$_POST['capt'];
if(isset($send) and $send=="Добавить")
{
if (empty($name) || empty($capt) || empty ($txt)){
echo "<center><font color=red>Не заполнены обязательные поля!</font></center>";
}else{
$text = str_replace(":smile:", "<img src='smile/smile.gif' border=0>", $text);
$text = str_replace(":biggrin:", "<img src='smile/biggrin.gif' border=0>", $text);
$text = str_replace(":cry:", "<img src='smile/cry.gif' border=0>", $text);
$text = str_replace(":eek:", "<img src='smile/eek.gif' border=0>", $text);
$text = str_replace(":razz:", "<img src='smile/razz.gif' border=0>", $text);
$text = str_replace(":cool:", "<img src='smile/cool.gif' border=0>", $text);
$text = str_replace(":mad:", "<img src='smile/mad.gif' border=0>", $text);
$text = str_replace(":rolleyes:", "<img src='smile/rolleyes.gif' border=0>", $text);
$text = str_replace(":redface:", "<img src='smile/redface.gif' border=0>", $text);
$text = str_replace(":confused:", "<img src='smile/confused.gif' border=0>", $text);
$text = str_replace(":wink:", "<img src='smile/wink.gif' border=0>", $text);
$db=mysql_pconnect("localhost","reviews","1538733");
mysql_select_db("reviews");
$data=date("Y.m.d G:i:s");
mysql_query ("INSERT INTO review VALUES ('', '$data', '$capt', '$txt', '$name', '$idp','')");
$msg="<table width=700 border align=center border bordercolor=silver style=border-collapse:collapse><tr><td rowspan=3 valign=top align=center width=100><b>$name</b></td><td style='padding-left:10'><u><b>дата</b></u> $data</td></tr><tr><td colspan=2>$capt</td></tr><tr><td colspan=2>$txt</td></tr></table>";
}
}
?>
<Form action="add.php" Method="POST">
<table height=200 cellpadding="0" cellspacing="0" align="center" border bordercolor=silver style=border-collapse:collapse>
<tr>
<td>
<table cellpadding="0" cellspacing="0" align="center">
<tr>
<td style="padding-left:10">Имя:</td>
<td><Input Type="text" Name="name" maxlength="40" size="48"></td>
</tr>
<tr>
<td style="padding-left:10">тема:</td>
<td><Input Type="text" Name="capt" maxlength="40" size="48"></td>
</tr>
<tr>
<td colspan=2 align=center>Сообщение:</td>
</tr>
<tr>
<td align=justify><img src='smile/smile.gif' border=0><img src='smile/biggrin.gif' border=0><img src='smile/cry.gif' border=0><img src='smile/eek.gif' border=0><br><img src='smile/razz.gif' border=0><img src='smile/cool.gif' border=0><img src='smile/mad.gif' border=0><img src='smile/rolleyes.gif' border=0><br><img src='smile/redface.gif' border=0><img src='smile/confused.gif' border=0><img src='smile/wink.gif' border=0></td>
<td><TextArea name="txt" rows=5 cols=30></TextArea></td>
</tr>
<tr>
<td><Input Type="submit" name=send Value="Добавить" style="cursor:hand"></td>
<td align="right"><Input Type=reset Value="Очистить" style="cursor:hand"></td>
</tr>
</table>
<input type=hidden name=idp value=<? echo $idp; ?>>
</td>
</tr>
</table>
</Form>
<? echo $msg;?>

Я просто даже не понимаю, как это сделать.
Объясни плиз, smile

Как их хранить, выводить и т.д.

Автор: IZ@TOP 1.2.2005, 16:37
PARROT, у тебя допущено несколько ошибок:

1) Для оптимизации замены смайликов испоьзуй массивы:

Код
$Smiles    = array(
   ':smile:' => '<img src="smile.gif">',
   ':smile2:' => '<img src="smile.2.gif">',
);


$Text = str_replace(array_keys($Smiles), $Smiles, $Text);

Как видишь, при таком обращении с кодом у нас убралось очень много лишнего smile

2) При замене смайлов в переменной $text у тебя появляется много одинарных кавычек в тексте. При добавлении в базу
Код
mysql_query ("INSERT INTO review VALUES ('', '$data', '$capt', '$txt', '$name', '$idp','')");
Скорее всего произойдет ошибка (хотя я последнее время убеждаюсь что у многих начинающих работает то что и вообразить невозможно smile ), так как данные из переменных заклбючены в одинарные кавычки, первая кавычка в тексте закончит поле и далее текст из переменной будет интерпретироваться MySQL как команды...

Автор: PARROT 1.2.2005, 20:37
IZ@TOP, посмотри тут мое творение, жду замечаний.

http://www.admin.traktora.spb.ru/

Правда пока без регистрации... не дописала еще.

smile

Автор: IZ@TOP 2.2.2005, 10:51
В общем для начала неплохо.
Чего не хватает:

1) Дизайна.
2) Переадресации на тему когда создал сообщение.
3) Если это все же гостевая, а не форм, то ответы в сообщение лучше всеже как то выделять.

Автор: PARROT 2.2.2005, 13:29
Цитата(IZ @ 2.2.2005, 10:51)
В общем для начала неплохо.
Чего не хватает:

1) Дизайна.
2) Переадресации на тему когда создал сообщение.
3) Если это все же гостевая, а не форм, то ответы в сообщение лучше всеже как то выделять.

Пускай будет форум, гостевая, как название мне не очень нравится.
Вопрос:
Нет Переадресации на тему когда создал сообщение, как ее сделать?
Я не совсем поняла суть.
Как она должна выглядеть?

По поводу дизайна, я еще о нем не думала, это уже в конце, когда допишу все доконца.
В голове еще мысли появились.


Автор: IZ@TOP 2.2.2005, 14:17
Цитата(PARROT @ 2.2.2005, 14:29)
Нет Переадресации на тему когда создал сообщение, как ее сделать?
Я не совсем поняла суть.
Как она должна выглядеть?

Ну как на этом форуме, когда создаешь тему, тебя переадресовывает на нее. То есть тебе после добавления записи нужно взять ее ИД (mysql_insert_id()), и переадресовать на тему:
Код
<?php

// ... здесь у нас идет добавление записи в базу.

header('location: http://www.admin.traktora.spb.ru/comment.php?idp='.mysql_insert_id());
exit;

?>


Думаю этот пример должен быть понятен. Главное не забудь что надо делать переадресацию до любого вывода.

Автор: Opik 2.2.2005, 15:52
http://www.admin.traktora.spb.ru/comment.php?idp=90 сама догадаешься? или помочь?

Автор: IZ@TOP 2.2.2005, 16:03
Opr, не понял smile

Автор: Opik 2.2.2005, 16:12
Я ответил в несуществующей теме.
Добавлено @ 16:16
+ Хотелось бы что бы по умолчанию при ответе тема указывалась текущая:
Re: Тема.
Добавлено @ 16:20
+ можно "опускать" обязательные поля:
http://www.admin.traktora.spb.ru/comment.php?idp=28
перед проверкой делай: trim($str) - что бы отсечь пробелы по краям

Автор: PARROT 2.2.2005, 19:06
Цитата(Opr @ 2.2.2005, 16:12)
Я ответил в несуществующей теме.
Добавлено @ 16:16
+ Хотелось бы что бы по умолчанию при ответе тема указывалась текущая:
Re: Тема.
Добавлено @ 16:20
+ можно "опускать" обязательные поля:
http://www.admin.traktora.spb.ru/comment.php?idp=28
перед проверкой делай: trim($str) - что бы отсечь пробелы по краям

Re: Тема- Я подумаю. Сегодня много работы.
Что значит "опускать" обязательные поля?
Перед какой проверкой делать trim($str) ?
Перед записью в базу?

Вообще мыслей много, надо бы разобраться и выстроить их последовательно, а то запутаюсь.

smile
Добавлено @ 19:10
Цитата(Opr @ 2.2.2005, 15:52)
http://www.admin.traktora.spb.ru/comment.php?idp=90 сама догадаешься? или помочь?

В чем догадаться? Что подставив в ссылку http://www.admin.traktora.spb.ru/comment.php любой номер idp, можно создать сообщение?
Да можно smile
А как этого избежать?
Исправить?


Автор: PARROT 3.2.2005, 13:53
Я тут все про адресацию (header) думаю, да сейчас все работает, а стоит подключить какие-то файлы сверху и будет ошибка.
Как поступить?
На яваскрипте ошибок не дает.

Автор: Opik 3.2.2005, 14:14
Цитата
А как этого избежать?

select * from topics where id = $_GET['id'];
если записей нет - писать что ошибся темой))
Цитата
Перед какой проверкой делать trim($str) ?

зайди к себе на форум и сразу нажми "добавить", вылезит, что не все заполнено, вот перед этим и делай ))
Цитата
какие-то файлы сверху и будет ошибка.
Как поступить?

подключать снизу smile)

Автор: IZ@TOP 3.2.2005, 16:47
PARROT, даю совет всех времен и народов.
В начале файла который будет запущен из браузера и в котором могут быть проблемы с передачей заголовков используем функцию ob_start:

Код
<?php
// Самое начало файла
ob_start();

// ... а далее уже ижет и HTML и твой код и т.п.


// Самый конец файла
ob_end_flush();
?>

Автор: Kurt 3.2.2005, 17:23
PARROT
Все сообщения при просмотре через Opera представляют собой набор нечитаемых каракулей. В IE все ОК. Разберись, пожалуйста, с кодировкой.

Автор: PARROT 3.2.2005, 18:02
Цитата(Kurt @ 3.2.2005, 17:23)
PARROT
Все сообщения при просмотре через Opera представляют собой набор нечитаемых каракулей. В IE все ОК. Разберись, пожалуйста, с кодировкой.

До кодировки как и до дизайна дело еще не дошло, с этим не так плохо, как с программированием на php, этот вопрос сейчас главный!
smile

Автор: PARROT 3.2.2005, 18:15
Цитата(Opr @ 2.2.2005, 16:12)
Я ответил в несуществующей теме.
Добавлено @ 16:16
+ Хотелось бы что бы по умолчанию при ответе тема указывалась текущая:
Re: Тема.
Добавлено @ 16:20
+ можно "опускать" обязательные поля:
http://www.admin.traktora.spb.ru/comment.php?idp=28
перед проверкой делай: trim($str) - что бы отсечь пробелы по краям

Исправила все кроме re: тема
Не доходит пока. Прошу подсказки. smile
Добавлено @ 18:22
Бред какой-то, переадресация не работает, просьба исправить, моя голова на сегодня соображать видимо закончила, если можно еще, объяснить ошибки:

Код

<html>
<head>
<script language=JavaScript src="anim.js"></SCRIPT>
</head>
<body>
<table width=900>
<tr>
<td align=right><a href="index.php">Посмотреть сообщения</td>
</tr>
</table>
<?
$db=mysql_pconnect("localhost","reviews","1538733");
       mysql_select_db("reviews");
$name=$_POST['name'];
$txt=$_POST['txt'];
$capt=$_POST['capt'];
if(isset($send) and $send=="Добавить")
{
if (mysql_num_rows(mysql_query("select count(id) from review where id=$idp"))==0)
{
echo "Такой темы нет!";
}
if (empty($name) || empty($capt) || empty ($mess)){
 echo "<center><font color=red>Не заполнены обязательные поля!</font></center>";
}
else
{
$data=date("Y.m.d  G:i:s");
mysql_query ("INSERT INTO review VALUES ('', '$data', '$capt', '$mess', '$name', '$idp','')");
?>
<script>document.location.href="comment.php?idp=<? echo $idp;?>";</script>
<?
}
}
?>
<Form name=myform action="add.php" Method="POST">
<table height=200 cellpadding="0" cellspacing="0" align="center"  border bordercolor=silver style=border-collapse:collapse>
<tr>
<td>
<table cellpadding="0" cellspacing="0" align="center">
<tr>
<td style="padding-left:10">Имя:</td>
<td><Input Type="text" Name="name" maxlength="40" size="48"></td>
</tr>
<tr>
<td style="padding-left:10">тема:</td>
<td><Input Type="text" Name="capt" maxlength="40" size="48"></td>
</tr>
<tr>
<td  colspan=2 align=center>Сообщение:</td>
</tr>
<tr>
<td colspan=2 align=center><TextArea id=txtmes name="mess" rows=5 cols=30></TextArea></td>
</tr>
<tr>
<td><Input Type="submit" name=send Value="Добавить" style="cursor:hand"></td>
<td align="right"><Input Type=reset Value="Очистить" style="cursor:hand"></td>
</tr>
</table>
<input type=hidden name=idp value=<? echo $idp; ?>>

</td>
</tr>
</table>
</Form>
<center>Для добавления смайла щелкни по картинке.<br>
<table width=100% style="border:1 solid silver;border-collapse:collapse">
<tr align=center>
<?
for($i=1;$i<=10;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align=center>
<?
for($i=11;$i<=20;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr></table></center>
</body>
</html>

Автор: IZ@TOP 4.2.2005, 10:16
Эх... вот, я немного переделал.

Код
<?php
ob_start();
// Как я уже говорил, эта функция буферезует вывод, и соответственно проблем
// с отправкой заголовков быть не должно.

error_reporting(E_ALL);
// После отладки выставь в 0
?>
<html>
<head>
<script language=JavaScript src="anim.js"></SCRIPT>
</head>
<body>
<table width=900>
<tr>
 <td align=right><a href="index.php">Посмотреть сообщения</td>
</tr>
</table>
<?
$db = mysql_pconnect("localhost","reviews","1538733");
mysql_select_db("reviews");

// Отсюда присвоения переменных я убрал. Незачем засорять память лишними перемнными.
// Тем более если у тебя register_globals на сервере = on, тебе использование $_POST, $_GET и т.п.
// не так уж и нужно. Однако если ты хочешь чтобы твои скрипты работали в будущем как надо и везде,
// то тебе необходимо пользоваться глобальными массивами и забыть о register_globals = on!

if(isset($send) and $send=="Добавить") {
if (mysql_num_rows(mysql_query("select count(id) from review where id=".intval($_POST['$idp'])))==0) {
 echo "Такой темы нет!";
}
if (empty($_POST['name']) || empty($_POST['capt']) || empty ($_POST['mess'])) {
 echo "<center><font color=red>Не заполнены обязательные поля!</font></center>";
}
} else {
$data=date("Y.m.d  G:i:s");
mysql_query ("INSERT INTO review VALUES ('', '".mysql_escape_string($data).
 "', '".mysql_escape_string($_POST['capt'])."', '".mysql_escape_string($_POST['mess'])."', '".
 mysql_escape_string($_POST['name'])."', '".intval($_POST['idp'])."','')");

// Более тщательная проверка передаваемых переменных.
// Надо всегда помнить самое главное правило: ни когда и ни при каких обстоятельствах,
// не доверять тому что ввел пользователь.

header('location: comment.php?idp='.$idp);
ob_end_flush();
exit;

// Переадресовываем пользователя на тему в которую он ответил, выводим содержимое буфера и заканчиваем сценарий.

}
}
$q = mysql_query("select capt from review where id=".intval($idp));
list($subject) = mysql_fetch_array($q, MYSQL_NUM);

// По поводу "re: тема". Выбираем из юазы тему сообщения в которую отвечаем, и выводим re: $subject в соотв. поле.

?>
<Form name=myform action="add.php" Method="POST">
<table height=200 cellpadding="0" cellspacing="0" align="center"  border bordercolor=silver style=border-collapse:collapse>
 <tr>
  <td>
   <table cellpadding="0" cellspacing="0" align="center">
    <tr>
     <td style="padding-left:10">Имя:</td>
      <td><Input Type="text" Name="name" maxlength="40" size="48"></td>
     </tr>
     <tr>
      <td style="padding-left:10">тема:</td>
      <td><Input Type="text" Name="capt" maxlength="40" value="Ответ: <?php echo $subject; ?>" size="48"></td>
     </tr>
     <tr>
      <td  colspan=2 align=center>Сообщение:</td>
     </tr>
     <tr>
      <td colspan=2 align=center><TextArea id=txtmes name="mess" rows=5 cols=30></TextArea></td>
     </tr>
     <tr>
      <td><Input Type="submit" name=send Value="Добавить" style="cursor:hand"></td>
      <td align="right"><Input Type=reset Value="Очистить" style="cursor:hand"></td>
    </tr>
   </table>
   <input type=hidden name="idp" value="<? echo $idp; ?>">
  </td>
 </tr>
</table>
</Form>
<center>Для добавления смайла щелкни по картинке.<br>
<table width=100% style="border:1 solid silver;border-collapse:collapse">
<tr align="center">
<?
for($i=1;$i<=10;$i++) {
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align="center">
<?
for($i=11;$i<=20;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
</table></center>
</body>
</html>
<?php
ob_end_flush();
?>

Автор: PARROT 4.2.2005, 16:08
Спасибо большое IZ@TOP.
Почти все работает.
smile
Ща еще доковыряю, немного осталось.

Вот, доковыряла, требует проверки и дальнейших советов.

Автор: IZ@TOP 4.2.2005, 20:41
PARROT, дизайн требует доработки smile

Автор: PARROT 4.2.2005, 21:34
Цитата(IZ @ 4.2.2005, 20:41)
PARROT, дизайн требует доработки smile

Дизайн не главное! Пока...
При нажатии на количество ответов, открывается окно с авторами и кол. комментариев добавленных пользователями.
Как этого добиться?

Желательно подсказку, с вашими подсказками и усилиями у меня что-то стало получаться, вошла в раж smile

С открытием окна определенного размера проблем не будет.
$coll=@mysql_query("SELECT count(name) FROM review WHERE caption=$idp");
Так?
$names=mysql_fetch_row($coll);
А дальше?
Запуталась я помоему smile

Автор: IZ@TOP 7.2.2005, 10:00
Такс, а чего непонятного? Выбираем имена всех написавших в той теме и все smile

Код
select name from review where id = $idp order by data desc

По моему все очень просто smile

Автор: PARROT 7.2.2005, 20:17
У меня еще один вопрос:
Не получается правильный вывод смайликов к теме собщений, на первой странице (вообщем как у вас)
вот код:
$smale=@mysql_query("SELECT MAX(smile) FROM review WHERE parent=$mas[0]");
$smale=mysql_fetch_row($smale);
if ($mas[7]=='') $mas[7]=$smale[0];
echo "<tr><td align=center><img src=smile/$smale[0].gif></td>

Что у меня не так?

Если смайликов к теме сообщения небыло добавлено, то должна быть пустая ячейка, если добавлен смайлик, то должен выводиться смайлик.
У меня выводятся смайлики, а там где их нет, кресты, видимо из-за img src.

Автор: IZ@TOP 8.2.2005, 12:47
Код

$smale = @mysql_query("SELECT MAX(smile) FROM review WHERE parent={$mas[0]}");
$smale = mysql_fetch_row($smale);
if ($mas[7] == '') {
   $mas[7] = $smale[0];
   echo "<tr><td align=center><img src=smile/{$smale[0]}.gif></td>";
} else {
   echo "<tr><td align=center>&nbsp;</td>";
}

Может так? А трабла была в запросе: для того чтобы массив в строке интерпретировался, необходимо его выделять, либо фигурными скобками, либо при помощи конкантенации (" ... ".$mas[0]." ... ").

Автор: PARROT 9.2.2005, 13:10
Сделала.
Как организовать редактирование сообщений?
Любой юзер может редактировать любые сообщения или только свои?
Желательно пример.
Спасибо!

Автор: Opik 9.2.2005, 15:33
PARROT
Нужно что бы каждый мог редактировать только свои, но тут уже нужна авторизация.
ну так принцип такой:
PHP:
Код
$query = mysql_query("select * from review");
while($row = mysql_fetch_array($query)){
if($row['name'] = $user['name']){
print 'Редактировать';
}
}

В $user - инфо о пользователе.
А само редактирование. Сначала по ид считываем информацию. Потом её загружаем в форму. Потом делаем упдайт записи.

Автор: PARROT 9.2.2005, 16:14
Авторизацию дописываю.
Как должна выглядеть база данных для авторизации?
Сколько полей должно быть?
У меня сейчас: id, name, email, login, parol.
Этого хватит?
Как таблица для авторизации должна перекликаться с таблицей для сообщений?

smile

Автор: Opik 10.2.2005, 01:05
PARROT
напрямую никак.
полей по идее хватит. Остальные ты добавишь по надобности, если будет расширять скрипт smile

Автор: PARROT 10.2.2005, 09:54
В чем лучше хранить, в Сессиях или Куках, посетителей?

Автор: Opik 10.2.2005, 13:42
не знаю, как лучше, но я храню в куках, этот форум кстати, тоже smile

Автор: PARROT 10.2.2005, 13:50
Цитата(Opr @ 10.2.2005, 13:42)
не знаю, как лучше, но я храню в куках, этот форум кстати, тоже smile

Хороший форум!
Можно пример?
На что и когда ставятся куки?
И можно, все что с этим связано, именно с форумом.
Я куками пользовалась только в голосовании, для запрета накручивания.
Юзер зарегистрировался, вводит в форму логин и пароль, а дальше что?
smile

Автор: Opik 10.2.2005, 14:26
http://detail.phpclub.net/article/page_password2

Автор: PARROT 10.2.2005, 15:50
Для цитаты:
Цитированное сообщение имеет две переменные $text - сообщение и $text1- цитируемое сообщение, в двух разных техтареа, с разными именами.
Вопрос:
Для $text1 нужно создавать поле в базе?
Если можно без него, то как?
smile

Автор: Opik 10.2.2005, 16:01
можно без него, ведьтвбазе не хранятя коды, там только хтмл!

Автор: PARROT 10.2.2005, 17:55
Цитата(Opr @ 10.2.2005, 16:01)
можно без него, ведьтвбазе не хранятя коды, там только хтмл!

А что лучше без или с ним?
Удобнее?
И проще smile

Автор: Opik 10.2.2005, 22:07
PARROT
рассуждай логически. Если ты в базе хранишь в виде BBCode то при показе сообщения тебе надо делать замену на HTML, что при большом кол-ве кодов и сообщений вызовет немалую нагрузку. Так что хранить в базе надо тока HTML, вроде так объяснил)

Автор: PARROT 12.2.2005, 13:59
В базе хранится значение переменных, либо записанных пользователем или...
Вопрос:
У меня получается слишком много файлов для добавления, редактирования и цитирования, можно ли их объединить в один файл?
Если можно, то как?
Я боюсь запутаться.
smile

Автор: Opik 12.2.2005, 16:09
PARROT
можно. обычные условия. (if/else)

Автор: PARROT 12.2.2005, 18:15
Все получилось! с переадресацией header. Спасибо IZ@TOP !
smile

Автор: Opik 12.2.2005, 19:16
Я бы поставил ещё фильтр на вводимость html кода.

Автор: PARROT 12.2.2005, 20:12
Цитата(Opr @ 12.2.2005, 19:16)
Я бы поставил ещё фильтр на вводимость html кода.

Это как?
Что это такое?

Автор: Irokez 12.2.2005, 20:21
htmlspecialchars(), strip_tags()

Автор: PARROT 12.2.2005, 20:51
Цитата(Irokez @ 12.2.2005, 20:21)
htmlspecialchars(), strip_tags()

Это я знаю strip_tags(), эта функция вырезает теги Html
А эта что делает? htmlspecialchars()
К сожалению книга по php у меня на работе, мне сейчас не посмотреть.
И пожалуйста пример, так легче думается.
smile
Добавлено @ 20:56
Ну вот, выложила новую версию своего форума, сильно не ругайте, а советов жду с нетерпением.
Чего еще не хватает?
Авторизацию еще не сделала, кроме нее еще есть недоделки.
Цитирование пока не работает, я так и не поняла, как его сделать.
То есть фактически оно выводится, правильно, я не поняла, нужно для цитирования заводить еще одно поле или нет.
Короче еще в раздумьях.

http://www.admin.traktora.spb.ru

С уважением, ко всем, моим учителям!

Автор: Irokez 12.2.2005, 21:07
Описание
string htmlspecialchars ( string string [, int quote_style [, string charset]])


В HTML некоторые символы имеют специальное значение и для сохранения своего значения должны быть преобразованы в HTML сущности. Эта функция возвращает строку, над которой проведены некоторые из таких преобразований. Этих преобразований достаточно для большинства задач веб-программирования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities().

Эта функция полезна при отображении данных, введенных пользователем, которые могут содержать нежелательные HTML тэги, например в форуме или гостевой книге. Необязательный второй аргумент quote_style определяет режим обработки одиночных и двойных кавычек. В режиме по умолчанию, ENT_COMPAT, преобразуются двойные кавычки, одиночные остаются без изменений. В режиме ENT_QUOTES преобразуются и двойные, и одиночные кавычки. а в режиме ENT_NOQUOTES и двойные, и одиночные кавычки остаются без изменений.

Производятся следующие преобразования:


'&' (амперсанд) преобразуется в '&amp;'

'"' (двойная кавычка) преобразуется в '&quot;' when ENT_NOQUOTES is not set.

''' (одиночная кавычка) преобразуется в ''' только в режиме ENT_QUOTES.

'<' (знак "меньше чем") преобразуется в '&lt;'

'>' (знак "больше чем") преобразуется в '&gt;'

Пример 1. Пример использования htmlspecialchars()

<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href='test'&gt;Test&lt;/a&gt;
?>


Автор: Opik 13.2.2005, 17:52
И делать htmlspecialchars надо до занесения в базу. И перед обработкой на bbcode

Автор: PARROT 13.2.2005, 18:03
Цитата(Opr @ 13.2.2005, 17:52)
И делать htmlspecialchars надо до занесения в базу. И перед обработкой на bbcode

Поняла.
Завтра займусь.
Меня сейчас больше волнует вопрос с цитируемым сообщением, никак не могу придти, ни к какому выбору.
Нужно создать еще одно поле для цитируемого или не нужно?
И еще, просьба проверить форум
http://www.admin.traktora.spb.ru/index.php

Автор: Opik 13.2.2005, 22:09
Нет, отдельного поля делать не надо.
Добавлено @ 22:11
Хм, а почему я могу редактировать любой пост?

Автор: PARROT 13.2.2005, 23:42
Цитата(Opr @ 13.2.2005, 22:09)
Нет, отдельного поля делать не надо.
Добавлено @ 22:11
Хм, а почему я могу редактировать любой пост?

А потому как еще регистрация не сделана, можно редактировать любой пост!
Цитирование вообще не работает, тоже пока.
Как раз по поводу него мой вопрос:
Если сделать так:
то, что введено в поле, цитированное сообщение (нижнее поле) заключать
в такие штуки, например: <#></#>, а то, что введено пользователем -
не заключать ни в какие.
И в базу писать строку:<#>цитата</#> + текст написанный пользователем.
А потом делить все это при выводе, выделяя там курсивом цитату
в теле которого будут определенные символы, говорящие скрипту, что эту фразу надо выделить курсивом и отделить от остального текста.

И написать обработчик напиши при выводе в текстареа.

А?

Мысль есть, только незнаю как правильнее ее реализовать, может подскажете?

Эта мысль без дополнительного поля!

smile

Автор: Opik 13.2.2005, 23:49
вот что делаешь после post запроса:

Код
$txt = preg_replace("/\[quote\](.*)\[\/quote\]/i", "<span class=\"quote\">\\1</span>", $txt);

ну или оформляешь html как нужно. Далее заносишь в базу и из базы показываешь сообщения никак не обрабаывая. При реактирование перед подставкой сообщения в форму делаешь обратную замену. т.е:

Код
$txt = preg_replace("/<span class=\"quote\">(.*)<\/span>/i", "[quote]\\1[/quote]", $txt);

за правильность регулярок не ручаюсь, писал на скорую руку. только принцип.

Автор: PARROT 14.2.2005, 00:09
Да...
Чем дальше в лес, тем больше...
Попробую.
Правда поняла не доконца.
Местами...

Автор: Axxent 14.2.2005, 05:24
Opr
Практика показывает, что в базе теги действительно лучше хранить в виде, скажем, <!#Cite>цитата</!#Cite>. Почему? Потому что какой бы быстрый не был PCRE, str_replace все равно быстрее smile Другое дело, что bbcode обрабатывать нужны реги, но тут у меня свое субьективное мнение - в bbcode параметры все лучше исключить к чертям. Потому что обычно люди допускают ошибку с обработкой вложенных тегов bbcode. В общем предлагаю так:

Из поля ввода в базу:
Код

$txt=str_replace("[quote]","<!#Cite>",$txt);
$txt=str_replace("[/quote]","</!#Cite>",$txt);

Из базы на экран:
Код

$txt=str_replace("<!#Cite>","<div class=\"cite\">",$txt);
$txt=str_replace("</!#Cite>","</div>",$txt);


Да, ну и обратно - из базы в поле редактирования - обратить первый код.

Автор: IZ@TOP 14.2.2005, 09:38
Axxent, а теперь представь что я ввел только одну [quote] а закрывающую не поставил - что произойдет? Если использовать регулярные выражения, то такой ошибки не будет, он заменит только парные бб_коды.


PARROT, думаю что лучше всего подойдет вариант Opr'a.

Автор: PARROT 14.2.2005, 12:05
Попробую. Если что буду кричать SOS!
Можно?
Я просто само выражение не доконца поняла.
Регулярными выражениями пользовалась, но помоему всего один раз, на курсах своего препода.
А он объясняет так классно, что лучше ничем не пользоваться кроме if и else.
smile

Автор: Axxent 14.2.2005, 12:40
IZ@TOP
А элементарная проверка при помощи strpos? Впрочем, со вложенными будут проблемы, это правда. smile Тем не менее остаюсь при своем мнении по поводу вида данных в БД.

Автор: Opik 14.2.2005, 12:41
Axxent
И ты гонишься за 0.0001 работы скрипта? Зачем? Это ведь делается только при добавлении и редактировании и всё. на показ это никак не влияет smile
PARROT
конечно можно, не вопрос smile
ссылки вдогонку:
http://detail.phpclub.net/article/regexp_1
http://detail.phpclub.net/article/regexp_2

Автор: Axxent 14.2.2005, 12:43
Opr
Уже не гонюсь smile А что касается вида данных в БД, то разбирать конкретные параметры имхо проще чем хтмл. Впрочем, решать как всегда разработчику.

Автор: Opik 14.2.2005, 13:12
Axxent
что мешает сделать те же комментарии перед тем или иным тегом?

Автор: PARROT 14.2.2005, 16:58
Я кричу SOS!
Не поняла ничего, вот что получается, но не работает, просьба исправить и желательно объяснить:

Код

<?php
ob_start();
error_reporting(0);
?>
<html>
<head>
<link rel="stylesheet" href="styles.css">
<script language=JavaScript src="anim.js"></SCRIPT>
</head>
<body>
<?
$db=mysql_pconnect("localhost","reviews","1538733");
mysql_select_db("reviews");
$name=$_POST['name'];
$txt=$_POST['txt'];
$capt=$_POST['capt'];
if(isset($send) and $send=="Цитировать")
{
if (mysql_num_rows(mysql_query("select count(id) from review where parent=".intval($idp)))==0)
{
echo "Такой темы нет!";
}
if (empty ($mess) | empty ($mess1) | empty ($mess2)){
 echo "<center><font color=red>Не заполнены обязательные поля!</font></center>";
}
else
{
if ((isset($smil)) OR (!isset($smil)))
{
$mess=$mess1.$mess2;
$data=date("Y.m.d G:i:s");
mysql_query ("UPDATE review SET `txt`='$mess' WHERE id=$idp");
header('location: comment.php?idp='.$idp);
ob_end_flush();
exit;
}
}
}
?>
<table width=700 height=400 align=center height=210 style="border:1 solid blue;border-collapse:collapse"  bgcolor=#EDE9ED>
<tr>
<td colspan=2 bgcolor=#C4CDEE class=2 style="padding-left:20">Введите сообщение:</td>
</tr>
<tr>
<td valign=top>
<table height=300  align=center style="border:1 solid blue;border-collapse:collapse"  bgcolor=white>
<tr align=center>
<?
for($i=1;$i<=4;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align=center>
<?
for($i=5;$i<=8;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align=center>
<?
for($i=9;$i<=12;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align=center>
<?
for($i=13;$i<=16;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
<tr align=center>
<?
for($i=17;$i<=20;$i++)
{
?>
<td><img src='smile/<? echo"$i.gif"?>' onClick="smile('#<?=$i?>')" onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''"></td>
<?
}
?>
</tr>
</table>
</td>
<td valign=top>
<?
$txt=@mysql_query("SELECT txt FROM review WHERE id=$idp");
for($i=0;$i<mysql_num_rows($txt);$i++)
{
$mess=mysql_fetch_row($txt);
$mess[0]= preg_replace("/\[quote\](.*)\[\/quote\]/i", "<table border><tr><td class=\"quote\">\\1</td></tr></table>", $mess[0]);
}

?>
<Form name=myform action="quote.php" Method="POST">
<table width=400 height=400 cellpadding="0" cellspacing="0" align="center"  border bordercolor=blue style=border-collapse:collapse bgcolor=white>
<tr>
<td>
<table cellpadding="0" cellspacing="0" align="center"  bgcolor=white>
<tr>
<td colspan=2 align=right><TextArea id=txtmes name="mess1" rows=15 cols=36></TextArea></td>
</tr>
<tr>
<td colspan=2 bgcolor=#C4CDEE class=2 style="padding-left:20">Цитируемое сообщение</td>
</tr>
<tr>
<td colspan=2 align=right><TextArea id=txtmes name="mess2" rows=15 cols=36><? echo $mess[0]; ?></TextArea></td>
</tr>
</table>
</td>
</tr>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class=1 valign=top style="padding-left:30">Иконки к сообщению:</td>
<td valign=top>
<table height=10 align=center>
<tr>
<?
for($i=21;$i<=26;$i++)
{
echo "<td><img src='smile/$i.gif' align=absmiddle><input type=radio name=smil value=$i></td>";
}

?>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan=2 style="padding-left:350" bgcolor=#C4CDEE><Input Type="submit" name=send Value="Цитировать" style="cursor:hand"></td>
</tr>
<input type=hidden name=idp value=<? echo $idp; ?>>
</Form>
</table>
<br>
<table width=700 align=center  border bordercolor=blue style=border-collapse:collapse cellpadding="0" cellspacing="0">
<tr>
<td valign=top>
<table width=700 align=center cellpadding="0" cellspacing="0"  bgcolor=#EDE9ED  border bordercolor=white style=border-collapse:collapse cellpadding="0" cellspacing="0">
<tr>
<td colspan=2 style='padding-left:20' class=1>Последние 10 сообщений [ в обратном порядке ]</td>
</tr>
<tr>
<td  width=500 style='padding-left:10' colspan=2><? echo $mas[3]; ?></td>
</tr>
<?
$res1=@mysql_query("SELECT id,data,caption,txt,name,parent,cnt,smile FROM review WHERE parent='$idp' order by id desc limit 10");
for($i=0;$i<mysql_num_rows($res1);$i++)
{
$mas_com=mysql_fetch_row($res1);
$mas_com[0]=stripslashes($mas_com[0]);
$mas_com[1]=stripslashes($mas_com[1]);
       $mas_com[2]=stripslashes($mas_com[2]);
       $mas_com[4]=stripslashes($mas_com[4]);
       $mas_com[7]=stripslashes($mas_com[7]);
       $mas_com[3]=ereg_replace("#([0-9]+)","<img src='smile/\\1.gif'>",$mas_com[3]);
       if ($mas_com[7]==0) $smile="";
       else $smile="<img src=smile/$mas_com[7].gif>";
?>
<tr>
<td colspan=2 bgcolor=#C4CDEE width=700 align=right class=1>&nbsp;</td>
</tr>
<tr>
<td width=200 align=center rowspan=2><b><? echo $mas_com[4]; ?></b></td>
<td  width=500 style='padding-left:10'><? echo $smile; ?><u><b>дата</b></u> <? echo $mas_com[1]; ?></td>
</tr>
<tr>
<td  width=500 style='padding-left:10' colspan=2><? echo $mas_com[3]; ?></td>
</tr>
<?
}
?>
</table>
</td>
</tr>
</table>



</body>
</html>
<?php
ob_end_flush();
?>


smile smile smile

Ну вот так цитирует, но выводит цитируемое сообщение сверху и без бордюра.
Такое впечатление, что оно не цитирует вовсе, а редактирует.

Автор: Opik 15.2.2005, 00:14
может <table border=1>?

Автор: PARROT 15.2.2005, 11:51
Цитата(Opr @ 15.2.2005, 00:14)
может <table border=1>?

Незнаю, но помоему я так пробовала, только тут не исправила.
Пойду смотреть.
smile

Автор: PARROT 15.2.2005, 14:35
Ну вообщем я нашла решение, может быть более примитивное, но мне более, пока, понятное.
Без регулярок (не от того, что я их поняла, как раз наоборот).
Если $mess2 запихать в таблицу, со всеми вытекающими отсюда последствиями с <br> на конце, после $mess=$mess1.$mess2;
И записать все это в базу, только наверно нужно не апдейтить базу, а записывать это сообщение, вместе с цитатой, как новое, ну можно еще дату цитаты, в таблицу вписать к $mess2. (что наверно лучше делать для редактированного сообщения (отредактировал Вася 14.56)).
Это уже по желанию.
Тогда точно все работать будет.
Тяжелый, но интересный путь, написание форума.
Спасибо!
Как вам мое решение задачи?

Про border=1 забыла:
насколько я помню, этот параметр совсем не обязателен =1, если написать просто border, бордер будет, но стандартный конечно.

Автор: PARROT 16.2.2005, 13:36
Проблема остается до сих пор открытой.
Что мой вариант, что ваш, правильно не работает.
Мой на этапе добавления 3 цитаты, начинает глючить, а заключается это в том, что цитата есть, но она не выводится из базы.
Ваша версия добавляет в базу, но выводит без бордюра и никак с этим не справится.
Как он ведет себя дальше не отследить.
Хотелось бы решить эту проблему, покажите пожалуйста работающий вариант (скрипт).
И как все таки сообщение с цитатой должно выводиться из базы?
Меня вчера эта тема довела до слез, наверно от бессилия.
smile

Автор: Axxent 16.2.2005, 18:30
Цитата
Ваша версия добавляет в базу, но выводит без бордюра и никак с этим не справится.

Если версия работает, то по части оформления глянь в стили - может чего не так с классом quote? Или допиши туда (в стили) что-нибудь вроде border: 1px solid #444444;


Opr
Ничего не мешает. Ладно, проехали smile

Автор: PARROT 16.2.2005, 20:12
Цитата(Axxent @ 16.2.2005, 18:30)
Цитата
Ваша версия добавляет в базу, но выводит без бордюра и никак с этим не справится.

Если версия работает, то по части оформления глянь в стили - может чего не так с классом quote? Или допиши туда (в стили) что-нибудь вроде border: 1px solid #444444;


Opr
Ничего не мешает. Ладно, проехали smile

Проехали будет тогда, когда я справлюсь,(или с помощью вас), найду выход из создавшейся ситуации.
Все равно спасибо! Завтра гляну.
Я просто не могу кинуть и идти дальше.
Я баран. smile
Может еще какие варианты есть?

Автор: IZ@TOP 17.2.2005, 10:14
PARROT, думаю что в твоем случае больше подойдет вариант предлодженный Axxent.
Заносим в базу цитаты таким образом:
Код
<div class="quote">текст цитаты</div><!-- endquote -->

Класс quote определяем в таблице стилей:
Код
div.quote {
   border-width:1px;
   border-style:solid;
   border-color:#CCCCCC;
   padding:10px;
}


При редактировании, меняем тег div.quote на ББ_Код:
Код
// ... в $editMessage находится текст сообщения который нуждается в замене цитат.
// мы еще можем сделать небольшую примочку для экономии процессорного времени.
// то есть, проверять на наличие цитат
if(strpos($editMessage, '<div class="quote">')) {
   $editMessage = str_replace(
       array('<div class="quote">', '</div><!-- endquote -->'),
       array('[quote]', '[/quote]'),
       $editMessage
   );
}
// ...

Автор: PARROT 17.2.2005, 21:51
Спасибо, IZ@TOP!
Ты!!!
Настоящий, стоящий учитель, цены тебе нет!
Только я попробую это позже.
Купила новый комп, устанавливаю систему и копирую свои файлы.

smile

Неудалось изменить второй раз репутацию IZ@TOP, так вот добавляю тут:
Знаешь и ждешь, что он придет, исправит, подскажет, это того стоит.

Автор: IZ@TOP 18.2.2005, 09:38
smile
PARROT, думаю учительские способности тут ни при чем. Если у человека есть желание учиться и желание дойти до цели, то он рано или поздно придет. А я всего лишь помог немного быстрее добраться до желаемого smile

Автор: PARROT 25.2.2005, 09:46
Сложная оказалась задача с цитированием, кое-как справилась.
Немного по другому, нужно проверить, вечером выложу в инет.
И с редактированием тоже возникли, почти такие же проблемы.
Ну вообщем намучилась.
Остается написать регистрацию... smile

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

Какие будут советы?

Потом, у меня тут еще одна мысль возникла, а если юзер не зарегистрирован, он все равно может создавать сообщения, но около его собщений, всегда добавляется, что он гость, а редактировать свои сообщения он может?
Или только добавлять новые?
А цитировать?
А редактировать?

Опять кучка вопросов...
smile

Автор: PARROT 5.3.2005, 23:43
Ну что, с редактированием я несколько решила вопрос. Временно правда.
Теперь редактировать юзеры могут только свои сообщения.
Пора начинать писать регистрацию, сегодня прикидывала как, в мозгах...
smile

Автор: Opik 6.3.2005, 02:00
PARROT
выложи мысли, мы подскажем что, и как сделать лучше smile

Автор: PARROT 6.3.2005, 11:43
Начну писать, что будет не понятно спрошу.

Автор: PARROT 6.3.2005, 19:48
Начала писать, почти сразу возникли проблемы.
Регистрация проходит нормально, но на страницу не войти, пишет неправильный пароль или логин и все тут. smile
Вот код регистрации:
Код

<?
if(isset($send) and $send=="зарегистрироваться")
{
$name=$_POST['name'];
$meil=$_POST['meil'];
$log=$_POST['log'];
$par=$_POST['par'];
$db=mysql_pconnect("localhost","grolvasp_disc","1538733");
       mysql_select_db("grolvasp_disc");
mysql_query ("INSERT INTO reg VALUES ('', '$name', '$meil', '$log', '". md5($par). "')");
header('location: open.php');
ob_end_flush();
exit;
}
?>
<form action="reg.php"  Method="POST">
<table width=400>
<tr>
<td>имя</td>
<td><input type=text name=name></td>
</tr>
<tr>
<td>e-mail:</td>
<td><input type=text name=meil></td>
</tr>
<tr>
<td>логин</td>
<td><input type=text name=log></td>
</tr>
<tr>
<td>пароль</td>
<td><input type=password name=par></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit name=send value="Зарегистрироваться"></td>
</tr>
</table>
</form>


Вот код для входа:
Код

<?
if(isset($send) and $send=="войти")
{
$log=$_POST['log'];
$par=$_POST['par'];
$db=mysql_pconnect("localhost","grolvasp_disc","1538733");
       mysql_select_db("grolvasp_disc");
$login_result = mysql_query("SELECT id_r FROM reg WHERE login='$log' AND parol='". md5($par). "'");
if (!mysql_error() && @mysql_num_rows($login_result)==1)
{
 setcookie($COOKIE_LOGIN_NAME, $log, time()+3600, $COOKIE_PATH);
 setcookie($COOKIE_PASSW_NAME, $par, time()+3600, $COOKIE_PATH);
 header("Location: index.php");
 exit;
 }
elseif (!mysql_error()) {
 print ("Неверный пароль или логин.");
 }
else
 print (mysql_error());

}
?>
<form>
<table width=200>
<tr>
<td>логин</td>
<td><input type=text name=log></td>
</tr>
<tr>
<td>пароль</td>
<td><input type=password name=par></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit name=send value="войти"></td>
</tr>
</table>
</form>


Укажите на ошибки пожалуйста. smile

Автор: Opik 8.3.2005, 01:24
Код

$name=$_POST['name'];
$meil=$_POST['meil'];
$log=$_POST['log'];
$par=$_POST['par'];

делай проверку на безопастность вводимых данных для БД smile
т.е:
$name=mysql_escape_string($_POST['name']);
и т.д.
Код

setcookie($COOKIE_LOGIN_NAME, $log, time()+3600, $COOKIE_PATH);
setcookie($COOKIE_PASSW_NAME, $par, time()+3600, $COOKIE_PATH);

setcookie("login", $log, time()+3600);
setcookie("password", md5($par), time()+3600);
первое аргумент - имя куки, второй - значение, третий время жизни..
+ я добавил md5 в куку пароля, не надо его хранить открытым smile
Код

if(isset($send) and $send=="войти")

Ну если быть "правильным", то:
Код

if(isset($_POST['send']) and $_POST['send']=="войти")

Автор: PARROT 8.3.2005, 14:04
Понятно, а в чем моя ошибка была?
Почему пароль не принимается?
Выдается сообщение Неправильный пароль или логин?
Когда мы выбираем логин=логину пароль=паролю, пароль в каком формате должен быть запрошен если
он хранится в MD5()?
Как много неизведанного, но хочется узнать!

Автор: IZ@TOP 8.3.2005, 22:06
Небольшие замечания по форме регистрации и оформлении кода
Код
<?
if(isset($_POST['send'])) { // Думаю что в проверке на значение переменной кнопки нет необходимости. Лишний код и при error_reporting(E_ALL) должен выдать ошибку в случае если форма не отправлена.

// Инициализаия переменных, пусть и небольшого количества, приводит к большему потреблению памяти.

$db = mysql_pconnect("localhost", "grolvasp_disc", "1538733");
mysql_select_db("grolvasp_disc");

mysql_query ("INSERT INTO reg VALUES (NULL, '{$_POST['name']}', '{$_POST['meil']}', '{$_POST['log']}', '".md5($_POST['par'])."')");

header('location: open.php');
ob_end_flush(); // В начале файла ведь есть ob_start?
exit;
}
?>

<form action="reg.php"  Method="POST">
<table width=400>
 <tr>
  <td>имя</td>
  <td><input type=text name=name></td>
 </tr>
 <tr>
  <td>e-mail:</td>
  <td><input type=text name=meil></td>
 </tr>
 <tr>
  <td>логин</td>
  <td><input type=text name=log></td>
 </tr>
 <tr>
  <td>пароль</td>
  <td><input type=password name=par></td>
 </tr>
 <tr>
  <td colspan=2 align=center><input type=submit name=send value="Зарегистрироваться"></td>
 </tr>
</table>
</form>

Плюс ко всему, советую обрамлять атрибуты HTML тегов в кавычки.

В общем кое какие недоработки есть, но мне кажется что все должно работать.
Код
<?
if(isset($_POST['send'])) {

$db = mysql_pconnect("localhost","grolvasp_disc","1538733");
mysql_select_db("grolvasp_disc");

$login_result = mysql_query("SELECT id_r FROM reg WHERE login = '".
 mysql_escape_string($_POST['log'])".' AND parol = '".md5($_POST['par'])."'");

if (@mysql_num_rows($login_result) > 1) {

setcookie($COOKIE_LOGIN_NAME, md5($_POST['log'].'main_secret_word'), time() + 3600, $COOKIE_PATH);
setcookie($COOKIE_PASSW_NAME, md5($_POST['par'].'main_secret_word'), time() + 3600, $COOKIE_PATH);
// Интересно правда откуда берется COOCKIE_LOGIN_NAME и COOKIE_PASWD_NAME, как и COOKIE_PATH...?
// md5($_POST['par'].'main_secret_word' необходимо для предотвращения расшифровки имени или пароля методом подбора.
// если разумеется взломщик не узнает это самое main_secret_word.
// Можно так же генерировать это main_secret_word и хранить его в базе, и при проверке подставлять.

header("Location: index.php");
exit;

} elseif (mysql_errno() > 0) {
print (mysql_error());
} else {
print ("Неверный пароль или логин.");
}
?>
<form method="post">
<table width=200>
 <tr>
  <td>логин</td>
  <td><input type=text name=log></td>
 </tr>
 <tr>
  <td>пароль</td>
  <td><input type=password name=par></td>
 </tr>
  <tr>
  <td colspan=2 align=center><input type=submit name=send value="войти"></td>
 </tr>
</table>
</form>

Автор: PARROT 9.3.2005, 19:28
IZ@TOP, проверь пожалуйста файл аунтификации пользователей, если надо исправь.
Код

<?
$db=mysql_pconnect("localhost", "grolvasp_disc", "1538733");
mysql_select_db("grolvasp_disc");

$out = mysql_query("SELECT id_r FROM reg WHERE login='".mysql_escape_string($_COOKIE['log']."' and par = '".
        mysql_escape_string($_COOKIE['par'])."'"); 
// Вроде я так понял что у тебя и пароль тоже записывается в куки, причем в md5?
// тогда делаем проверку и на пароль. Иначе я допустим могу зарегестрироваться в твоей системе, 
// после чего отредактировав cookie на своем компьютере (изменив там своя имя на имя, допустим PARROT), 
// писать под чужим именем.


if (@mysql_num_rows($out) > 0) {

         // $auth=mysql_fetch_row($out); #??? Немного не понял смысл этой строки. В ней нет необходимости, 
         // так как переменная auth все равно примет значение "OK", и данные переданные ей будут потеряны.
         $auth="OK"; // Может быть лучше воспользоваться будевым значением? т.е. $auth = true;

} else {
         header("Location: reg.php");
         exit;
}
?>

smile

Автор: IZ@TOP 10.3.2005, 12:19
Подправил smile

Автор: PARROT 10.3.2005, 16:36
Спасибо, IZ@TOP!
Код на вход пользователей исправила, теперь работает:
Код

<?
if(isset($send) and $send=="войти")
{
$log=$_POST['log'];
$par=$_POST['par'];
$db=mysql_pconnect("localhost","grolvasp_disc","1538733");
        mysql_select_db("grolvasp_disc");
$login_result = mysql_query("SELECT id_r,parol FROM reg WHERE login='$log'");
if (!mysql_error() && @mysql_num_rows($login_result)==1) 
{
  $prl=mysql_fetch_row($login_result);
  if ($prl[1]==md5($par)) {
    setcookie('log', $log, time()+3600);
    setcookie('par', $par, time()+3600);
    header("Location: index.php");
    exit;
    }
  else{
  print ("Неправильный пароль или логин.");
  }
  }
elseif (!mysql_error()) {
  print ("Неправильный пароль или логин.");
  }
else
  print (mysql_error());

}
?>

Я только не пойму, зачем два раза печатать вот эту строку Неправильный пароль или логин?

Автор: IZ@TOP 11.3.2005, 13:12
PARROT, подожди, я не говорил что надо дважды его печатать... и лучше логин с паролем проверять одновременнов SQL запросе. + Проверку делать не при помощи mysql_error, а при помощи mysql_num_rows, вернет 1 - значит авторизовался, 0 - значит нет таких логина или пароля.
А я вот что писал:

Код

<?
if(isset($_POST['send'])) {

$db = mysql_pconnect("localhost","grolvasp_disc","1538733");
mysql_select_db("grolvasp_disc");

$login_result = mysql_query("SELECT id_r FROM reg WHERE login = '".
 mysql_escape_string($_POST['log'])".' AND parol = '".md5($_POST['par'])."'");

if (@mysql_num_rows($login_result) != 0) {

setcookie($COOKIE_LOGIN_NAME, md5($_POST['log'].'main_secret_word'), time() + 3600, $COOKIE_PATH);
setcookie($COOKIE_PASSW_NAME, md5($_POST['par'].'main_secret_word'), time() + 3600, $COOKIE_PATH);
// Интересно правда откуда берется COOCKIE_LOGIN_NAME и COOKIE_PASWD_NAME, как и COOKIE_PATH...?
// md5($_POST['par'].'main_secret_word' необходимо для предотвращения расшифровки имени или пароля методом подбора.
// если разумеется взломщик не узнает это самое main_secret_word.
// Можно так же генерировать это main_secret_word и хранить его в базе, и при проверке подставлять.

header("Location: index.php");
exit;

} elseif (mysql_errno() > 0) {
print (mysql_error());
} else {
print ("Неверный пароль или логин.");
}
?>
<form method="post">
<table width=200>
 <tr>
  <td>логин</td>
  <td><input type=text name=log></td>
 </tr>
 <tr>
  <td>пароль</td>
  <td><input type=password name=par></td>
 </tr>
  <tr>
  <td colspan=2 align=center><input type=submit name=send value="войти"></td>
 </tr>
</table>
</form> 
 

Автор: PARROT 9.11.2005, 20:21
Сорри, пришлось поднять старый свой пост, так как обнаружилась такая проблема:
В последней колонке обновление даты и имени, дата обновляется на последнюю добавленную пользователем, а вот имя не меняется.
Понять не могу, почему. Получается что работает до определенного момента, а именно добавив 2 ответа в топик, имя добавившего 3 ответ в пост не изменяется.
Ошибки не дает.
Чтобы это могло быть?
Код

<?
require("aut.php");
if ($auth=="OK") {
        echo "Пользователь: ".$imya;
}
?>
<html>
<head>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<table width=900>
<tr>
<td align=right><a href="add.php"><img src="img/nt.gif" border=0></a></td>
</tr>
</table>
 <table width=900 border align=center border bordercolor=blue style=border-collapse:collapse cellpadding=0 cellspacing=0>
 <tr>
 <td>
 <table width=900 border align=center  bgcolor=#EDE9ED border bordercolor=white style=border-collapse:collapse cellpadding=0 cellspacing=0>
 <tr>
 <td colspan=6 bgcolor=#C4CDEE class=2 style="padding-left:20"> Тема</td>
 </tr>
 <tr>
 <td width=20 align=center class=1>&nbsp;</td>
 <td width=300 align=center class=1>Темы форума</td>
 <td width=200 align=center class=1>Автор</td>
 <td width=85 align=center class=1>Ответов</td>
 <td width=85 align=center class=1>Просмотров</td>
 <td width=200 align=center class=1>Обновление</td>
 </tr>
<?
if (!isset($s)) $s=0;
$res2=@mysql_query("SELECT id,data,caption,txt,name,parent,cnt,smile FROM review WHERE parent=0 order by id desc limit $s,10");
for($i=0;$i<mysql_num_rows($res2);$i++)
{
        $mas=mysql_fetch_row($res2);
        $mas[1]=stripslashes($mas[1]);
        $mas[2]=stripslashes($mas[2]);
        $mas[4]=stripslashes($mas[4]);
        $mas[7]=stripslashes($mas[7]);
        $res3=mysql_query("SELECT id FROM review WHERE parent=".$mas[0]) or die(mysql_error());
        $col=mysql_num_rows($res3);
$add=mysql_query("SELECT MAX(data) FROM review WHERE parent=".$mas[0]) or die(mysql_error());
$arr_add=mysql_fetch_row($add);
if ($arr_add[0]=='') $arr_add[0]=$mas[1];
echo "SELECT MAX(name) FROM review WHERE parent=".$mas[0];
$name=mysql_query("SELECT MAX(name) FROM review WHERE parent=".$mas[0]) or die(mysql_error());
$name_add=mysql_fetch_row($name);
if ($name_add[0]=='') $name_add[0]=$mas[4];
if ($mas[7]==0) $smile="";
else $smile="<img src=smile/$mas[7].gif>";

   echo "<tr><td align=center>$smile</td>

<td align=center><a href=comment.php?idp=$mas[0]>$mas[2]</a></td>
<td align=center>$mas[4]</td>
<td align=center><a href=\"javascript:window.open('answer.php?idp=$mas[0]','example','scrollbars,resizable,width=200,height=300');void(0);\">$col</a></td>
<td align=center>$mas[6]</td>
<td align=center>$arr_add[0]<br><u><b>автор:</b></u> $name_add[0]</td>
</tr>";
}
 echo "</table></td></tr></table><br>";

$res4=mysql_query("select count(id) from review WHERE parent=0");
$num=mysql_fetch_row($res4);

$numstr=ceil($num[0]/10);
echo "<table><tr><td style=padding-left:30>Страницы: ($numstr)</td>";
for($i=1; $i<=$numstr; $i++){
        $start=($i-1)*10;
        if ($start==$s OR ($s==0 AND $i==1));
        print "<td><a href=index.php?s=$start>[$i]</a></td> ";
}
?>
</tr></table>
</body>
</html>

Проверить можно тут: http://www.admin.traktora.spb.ru/
Почему он прекращает выбирать последнее имя не понятно, но присходит это даже если запрос проверить в РНРадмин.

Автор: PARROT 9.11.2005, 22:22
Спасибо, проблему решили с IZ@TOP smile

Автор: IZ@TOP 9.11.2005, 22:36
Код

mysql_query("SELECT data, name FROM review WHERE parent=".$mas[0]." order by data desc limit 1");

Думаю так можно убить двух кроликов разом. MAX предназначен для работы с числами.

Автор: Гитарист 9.1.2006, 17:53
Мда, весь топ просматрел!!! Приятно, что знающие люди встают на наше место и не отмахиваются от вопросов, а четко, локонично, методично объясняют!!!

Только я начал PHP изучать 2 дня назат и мне многое не понятно, но как только я втянусь, я то же буду вопросы задавать!!! Можно???

Заранее спасибо!!!


С уважением гитарист!!!

Автор: PARROT 2.3.2006, 13:15
Ну вот продолжаю:
Пока вместо регистрации решила сделать голосование для своего форума, есстественно как у нас на Винград smile
Вопрос:
Мне не совсем понятен алгоритм хранения голосов.
Где их хранить? В файле не хочется, в базе, тогда как? Если максимум пунктов опроса может быть 25.
Делать отдельую таблицу для голосования, со связью?
Надеюсь с выводом не возникнет особых трудностей smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)