Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятки с формами на Php

6.1K
13 января 2005 года
Bronepoezd
25 / / 13.01.2005
Начал делать гостевуху на PHP... Вот, написал несколько строк:

<?
global $text;
global $prov;

print "
<center><h4>ГОСТЕВАЯ КНИГА</h4></center>
";

@mysql_connect("localhost","web","") or die("Could not connect to MYSQL server!");
@mysql_select_db("guest") or die("Could not select company database!");

print "<form method=post>";
print "<textarea name=text rows=3 cols=40 Value=\"Введите сообщение...\">";
print "</textarea>";
print "<input type=hidden name=prov value=\"1234567890\">";
print "<input type=submit value=Отправить>";
print "</form>";

if ($prov=="1234567890") {
$query1="INSERT INTO guest VALUES('$text')";
mysql_query($query1) or die("mysql_error!");


$query2="SELECT*FROM guest";
$result=mysql_query($query2) or die("mysql_error!");

while ($row=mysql_fetch_array($result)):

print $row['text'];
print "
";

endwhile;
}

mysql_close();

?>

Вообщем проблема такая: Когда я пытаюсь обновить страницу, выскакивает сообщение IE: "Не удаётся обновить страницу без повторной отправки данных. Нажмите соответствующую кнопку для повторной отправки данных или отмените операцию для возврата к открываемой странице."
Когда я нажимаю ПОВТОР, то в происходит повторная отправка данных и в БД записывается то, что было введено раньше...

Подскажите пожалуйста, как этого избежать... Необходимо, чтобы при обновлении страницы никаких сообщений не выводилось и чтобы гостевуха нормально работала...
4
13 января 2005 года
mike
3.7K / / 01.10.2002
Вот так:

Код:
global $text;
global $prov;

print "<center><h4>ГОСТЕВАЯ КНИГА</h4></center>";

@mysql_connect("localhost","web","")
or die("Could not connect to MYSQL server!");
@mysql_select_db("guest")
or die("Could not select company database!");

print "<form method=post action=thisfile.php>";
print "<textarea name=text rows=3 cols=40 Value=\"Введите сообщение...\">";
print "</textarea>";
print "<input type=hidden name=prov value=\"addrecord\">";
print "<input type=submit value=Отправить>";
print "</form>";

if ($prov=="addrecord") {
    $query1="INSERT INTO guest VALUES('$text')";
    mysql_query($query1) or die("mysql_error!");
    header("Location: thisfile.php");
    exit;
    }

$query2="SELECT*FROM guest";
$result=mysql_query($query2) or die("mysql_error!");

while ($row=mysql_fetch_array($result)) {
    print $row['text'];
    print "
"
;
    }

mysql_close();
6.1K
13 января 2005 года
Bronepoezd
25 / / 13.01.2005
Цитата:
Originally posted by mike
Вот так:



Я изменил:

<?
global $text;
global $prov;

print "<center><h4>ГОСТЕВАЯ КНИГА</h4></center>";

@mysql_connect("localhost","web","") or die (mysql_error());
@mysql_select_db("guest") or die(mysql_error());

?>

<form method ="post" action="forum.php">
<input type = "hidden" name = "prov" value = "addrecord">

<textarea name="text" rows="3" cols="40" Value="Введите сообщение..."></textarea>
<input type="submit" value="Отправить">
</form>

<?
if ($prov=="addrecord") {
$query1="INSERT INTO guest VALUES('$text')";
mysql_query($query1) or die(mysql_error());
header ("Location: forum.php");
exit;
}

$query2="SELECT*FROM guest";
$result=mysql_query($query2) or die(mesql_error());

while ($row=mysql_fetch_array($result)) {
print $row['text'];
print "
";
}

mysql_close();
?>

В результате, после отправки формы выдаётся такая ошибка:

Warning: Cannot modify header information - headers already sent by (output started at z:\home\footstats.ru\www\forum.php:5) in z:\home\footstats.ru\www\forum.php on line 22

Подскажите, пожалуйста, что означает эта ошибка?

4
13 января 2005 года
mike
3.7K / / 01.10.2002
А точно :)

перед header() не должно быть никаких выводов типа print и echo:

Код:
global $text;
global $prov;

@mysql_connect("localhost","web","")
or die("Could not connect to MYSQL server!");
@mysql_select_db("guest")
or die("Could not select company database!");

if ($prov=="addrecord") {
    $query1="INSERT INTO guest VALUES('$text')";
    mysql_query($query1) or die("mysql_error!");
    header("Location: thisfile.php");
    exit;
    }

print "<center><h4>ГОСТЕВАЯ КНИГА</h4></center>";

print "<form method=post action=thisfile.php>";
print "<textarea name=text rows=3 cols=40 Value=\"Введите сообщение...\">";
print "</textarea>";
print "<input type=hidden name=prov value=\"addrecord\">";
print "<input type=submit value=Отправить>";
print "</form>";

$query2="SELECT*FROM guest";
$result=mysql_query($query2) or die("mysql_error!");

while ($row=mysql_fetch_array($result)) {
    print $row['text'];
    print "
"
;
    }

mysql_close();
4
13 января 2005 года
mike
3.7K / / 01.10.2002
И не забудь проверить передавыаемые переменные на наличие неправильных символов. А то эксплоит зашлют, маргнуть не успеешь.
6.1K
13 января 2005 года
Bronepoezd
25 / / 13.01.2005
Цитата:
Originally posted by mike
И не забудь проверить передавыаемые переменные на наличие неправильных символов. А то эксплоит зашлют, маргнуть не успеешь.



Ок. Спасибо большое... Вроде всё работает...

Только не могли бы вы объяснить смысл header() и для чего он нужен?

4
13 января 2005 года
mike
3.7K / / 01.10.2002
Ответ сервера по HTTP протоколу делится на две части.

1. заголовок
2. тело дукомента

в заголовке передается код ответа, кукисы, тип документа и т.п.

заголовок от тела отделяется ПУСТОЙ СТРОКОЙ.

в теле передается сам документ (например HTML)

так вот, PHP Должен отправит заголовок серверу до того, как ты начнешь что-то выводить в тело:

Вот пример:

 
Код:
HTTP/1.0 200 OK
Date: Thu, 13 Jan 2005 11:10:50 GMT
Server: Apache/1.3.28 (Unix) PHP/4.3.4RC1
X-Powered-By: PHP/4.3.4RC1
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<TITLE>CodeNet - все для программиста.</TITLE>


чтобы сделать редирект, нужно послать следущий заголовок, а тело документа оставить пустым:

 
Код:
HTTP/1.0 302 Found
Location: /document.html


так вот если сделать print "test" то получится следующее

 
Код:
HTTP/1.0 200 OK
Date: Thu, 13 Jan 2005 11:10:50 GMT
Server: Apache/1.3.28 (Unix) PHP/4.3.4RC1
X-Powered-By: PHP/4.3.4RC1
Connection: close
Content-Type: text/html


test
Location: /document.html


и функция выдаст warning, что заголовок уже отправлен, и функция header ничего дописать к нему не может!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог