[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передача переменной
SunSet
Принцип работы скрипта:
С формы файла А летят данные в некий файл Б, тут они обрабатываются, заносятся в базу и возврат на предыдущую страницу таким образом:
PHP
<meta http-equiv='Refresh' content='0; URL=".$_SERVER['HTTP_REFERER']."'>

Как сделать, чтоб резульат обработки возвращался в страницу А ? То есть чтоб переменная при переходе обратно не терялась. Сессии не подходят.

А если еще примитивней: В файле А жмем кнопку, файл Б смотрит, если это нужная кнопка то в файл А возвращается значение той кнопки и TRUE.



Спустя 17 минут, 14 секунд (12.09.2009 - 00:06) kirik написал(а):
ничего не понял)

Спустя 5 минут, 27 секунд (12.09.2009 - 00:11) SunSet написал(а):
kirik
Так уже так растолковал, что даже сам понял что хотел laugh.gif

Ну вот смотри. Жмешь ты на кнопку "отправить", данные (id твоего ответа) летят в файл forum.php, там проверка. Если запись добавлена, то со страницы forum.php в первый файл с которого ты нажимал кнопку "отправить" прилетает ответ по типу "ваши запись добавлена" и возвращается та же id твоего ответа.

Спустя 26 минут, 16 секунд (12.09.2009 - 00:37) DeeKeiD написал(а):
HTML
<input type="hidden" name="theme_id" value="'.$_GET['id'].'">

PHP
$theme_id $_POST['theme_id'];
echo 
'<meta http-equiv='Refresh' content='0URL="forum.php?id='.$theme_id.'"'>';

Спустя 3 минуты, 18 секунд (12.09.2009 - 00:41) SunSet написал(а):
DeeKeiD
Хм.. чтото похожее. Ночью посмотрю, наверное подойдет. Спасибо user posted image

Спустя 21 минута, 12 секунд (12.09.2009 - 01:02) SunSet написал(а):
Все же, чуть не то. Сейчас приведу наглядный пример работы:

index.php
HTML
<form name="form1" method="post" action="page.php">
<label>
<input type="text" name="textfield" id="textfield" value ="">
<input type="submit" name="button" id="button" value="Submit">
</label>
</form>


page.php
идет проверка того что прилетело с файла индекс и вносим в базу данные.
INSERT "значение текстового поля" ...
echo "Добавлено";
и перенаправляем обратно на index.php
PHP
<meta http-equiv='Refresh' content='0; URL=".$_SERVER['HTTP_REFERER']."/index.php'>


Так вот, как чтоб результат echo "Добавлено"; вывелось на индексе, а не на page.php.

Неохота через index.php?any=добавлено, както некрасиво.

Спустя 5 минут, 15 секунд (12.09.2009 - 01:07) DeeKeiD написал(а):
инклюд page.php в index.php

Спустя 7 минут, 38 секунд (12.09.2009 - 01:15) SunSet написал(а):
DeeKeiD
В приципе, подходит) Побежал тестить) smile.gif

Спустя 2 часа, 3 минуты, 28 секунд (12.09.2009 - 03:18) SunSet написал(а):
Немного переделал. Поместил с двух файлов в один, по нажатию кнопки добавляется в базу, выводится под формой ввода сообщение "Добавлено". Все как надо. Но не знаю теперь как сделать чтоб F5 не добавляло эту статью снова.
Пытался через
PHP
header('location: '$_SERVER['PHP_SELF'] .'?rnd='time());

както придумать, но вызывает ошибку. Наверно, не правильно использую.
Как от Ф5 защитить?

Спустя 13 минут, 28 секунд (12.09.2009 - 03:32) kirik написал(а):
SunSet
мудришь...
index.php
PHP
if(isset($_POST['save']))
{
    
// ....
    
header('Location: index.php?saved');
}
else
{
    if(isset(
$_GET['saved']))
        echo 
'Сохранено все!';
    echo 
'<form target="_self" method="post">.....<input type="submit" name="save" value="Сохранить" /></form>';

}

под себя заточи тока..

Спустя 12 часов, 50 минут, 35 секунд (12.09.2009 - 16:22) SunSet написал(а):
kirik
Почему мудрю.. по мануалу twin'a смотрел smile.gif

Твой пример не могу разобрать. Где ж тут защита от Ф5?

Спустя 7 минут, 21 секунда (12.09.2009 - 16:30) SunSet написал(а):
Свернутый текст
PHP
<?php
if (isset($add_comments))
{

  if (isset(
$mail)) {trim($mail);}
  else {
$mail "";}

  if (isset(
$author)) {trim($author);}
  else {
$author "";}

  if (isset(
$estimation)) {trim($estimation);}
  else {
$estimation "";}

  if (isset(
$text)) {trim($text);}
  else {
$text "";}

    if (empty(
$mail) or empty($author) or empty($estimation) or empty($text) or empty($country_id) or empty($region_id)  or empty($city_id) or $country_id ==or $region_id ==or $city_id ==0)
    {
    exit (
"Лажа");
    }



$date date("Y-m-d");

$add mysql_query ("INSERT INTO comments (hotel_id,author,estimation,mail,date,text) VALUES ('$city_id','$author','$estimation','$mail','$date','$text')",$db);

echo 
"DONE";
}


Так вот хотелось бы чтоб после echo "DONE"; шло какоето обнуление переменных

Спустя 2 часа, 8 минут, 21 секунда (12.09.2009 - 18:38) kirik написал(а):
Цитата (SunSet @ 12.09.2009 - 08:22)
Где ж тут защита от Ф5?

наместе smile.gif

Чет вообще запутал.. тебе нужно
Цитата (SunSet @ 12.09.2009 - 08:30)
Так вот хотелось бы чтоб после echo "DONE"; шло какоето обнуление переменных

или
Цитата (SunSet @ 11.09.2009 - 15:48)
Как сделать, чтоб резульат обработки возвращался в страницу А ?

??

Спустя 3 минуты, 13 секунд (12.09.2009 - 18:41) SunSet написал(а):
kirik
Чтоб было обнуление. Я уже два файла ж вместе склепал.

Спустя 11 минут, 43 секунды (12.09.2009 - 18:53) kirik написал(а):
Слух, а вот эти все переменные: $add_comments, $mail.. Они POST'ом приходят? Ты их переназначешь чтоли?

Спустя 3 минуты, 21 секунда (12.09.2009 - 18:56) SunSet написал(а):
kirik
Да, все есть по такому типу
PHP
if (isset($_GET['add_comments'])){$add_comments $_GET['add_comments'];}

Сам скрипт добавления работает, все проверки (на правильность регулярок потом проверю) как надо тоже фунциклируют, есдинственное - F5 пугает... не знаю как от него избавиться.

Спустя 12 минут, 56 секунд (12.09.2009 - 19:09) kirik написал(а):
Цитата (SunSet @ 12.09.2009 - 10:56)
Да, все есть по такому типу

а нафига?

Цитата (SunSet @ 12.09.2009 - 10:56)
есдинственное - F5 пугает... не знаю как от него избавиться.

посмотри еще раз этот код.

Спустя 3 минуты, 22 секунды (12.09.2009 - 19:12) SunSet написал(а):
kirik
Я намекоустойчив)) Не могу понять смысла того скрипта.

Цитата
а нафига?

По нажатию кнопки страница перезагружается, если есть нужные значения то добавляется коммент в базу. Если уберу ту проверку то этих самых значений (переменных) никогда ведь не будет, и моя проверка будет выдавать ошибку что поля не заполнены.

Спустя 7 минут, 22 секунды (12.09.2009 - 19:20) kirik написал(а):
напиши вместо echo "DONE"; - header('Location: тут_имя_твоего_скрипта.php'); и будет тебе защита от F5 smile.gif

Спустя 5 минут, 27 секунд (12.09.2009 - 19:25) SunSet написал(а):
kirik
А смысл echo тогда, если сразу производится переадресация?
Смотри как хочу: юзер заполняет формочку, жмет отправить, страничка перезагружается, и под той формой ввода (а не в одтельной странице) пишется "Все добавлено", если чтото пусто, то под этой же формой написано "Ошибка". Вот в моем варианте добавляет, пишет что "Все добавлено". Жмешь Ф5 и все.. теряется смысл жизни smile.gif

Спустя 12 минут, 3 секунды (12.09.2009 - 19:37) kirik написал(а):
SunSet
запусти этот код:
PHP
if(isset($_POST['save']))
{
    
// ....добавляем в БД
    
header('Location: index.php?saved');
}
else
{
    echo 
'<form target="_self" method="post">..тут куча полей для ввода...<input type="submit" name="save" value="Сохранить" /></form>';
    if(isset(
$_GET['saved']))
        echo 
'Сохранено все!';
}

Спустя 8 минут, 20 секунд (12.09.2009 - 19:46) SunSet написал(а):
kirik
Запустил. Не могу понять как он работает blink.gif Все поля я после переведу в ПОСТ, разве он потом будет работать? И 'Location работает же только если до него ничег оне подгружается?

Спустя 23 минуты, 4 секунды (12.09.2009 - 20:09) kirik написал(а):
Цитата (SunSet @ 12.09.2009 - 11:46)
И 'Location работает же только если до него ничег оне подгружается?

Да, все верно. И не выводи ничего до отправки заголовков.

Цитата (SunSet @ 12.09.2009 - 11:46)
Не могу понять как он работает

Если у нас не нажимали на кнопку "Сохранить", то мы выводим форму. При этом если в GET содержится saved, то мы выводим сообщение. Если же кнопку нажали, то мы заносим данные в БД и пересылаем юзера на index.php?saved, тем самым предовращая этот самый F5.

Спустя 7 минут, 17 секунд (12.09.2009 - 20:16) SunSet написал(а):
kirik
Так если это страница с кучей хтмл кода, как же Location будет работать?
При внедрении в документ ошибку выбивает
Warning: Cannot modify header information - headers already sent by
Черт, наверно через пень-колоду прийдется делать unsure.gif

Спустя 5 минут, 32 секунды (12.09.2009 - 20:22) kirik написал(а):
Цитата (SunSet @ 12.09.2009 - 12:16)
Так если это страница с кучей хтмл кода, как же Location будет работать?
При внедрении в документ ошибку выбивает
Warning: Cannot modify header information - headers already sent by

нужно вынести все обработчики за (до) html код.

Спустя 5 минут, 37 секунд (12.09.2009 - 20:27) SunSet написал(а):
kirik
Запутался чтото я совсем. Скажи, можно както после запроса к базе (добавление коммента) присваивать вот такой строчке
http://q/comments/index.php?country_id=0&author=&mail=&estimation=&text=&add_comments=Submit2
в конце еще, например, &saved ? Сделаю проверку, что если есть saved то чтоб не добавляло ничего.

PHP
$add = mysql_query ("INSERT INTO comments (hotel_id,author,estimation,mail,date,text) 
VALUES ('$city_id','$author','$estimation','$mail','$date','$text')"
,$db);
//добавить saved
echo "DONE";

Спустя 21 минута, 31 секунда (12.09.2009 - 20:49) Гость_hara написал(а):
да хватит извращаться save не save, - делай редирект как уже пять раз сказали))

Спустя 8 минут, 51 секунда (12.09.2009 - 20:58) kirik написал(а):
Цитата (SunSet @ 12.09.2009 - 12:27)
Сделаю проверку, что если есть saved то чтоб не добавляло ничего.

Костыли, костыли...
Лан, последний раз даю код с формой:
PHP
<?php
$msg 
null;
if(isset(
$_POST['save']))
{
    if(empty(
$_POST['name']))
    {
        
$msg 'Поле "Имя" не заполнено (нужно заполнить).';
    }
//     тут можно добавлять проверяемые поля по мере надобности
//     elseif(empty($_POST['email']))
//     {
//         $msg = 'Поле "email" не заполнено (нужно заполнить).';
//     }

    // если ошибок не возникало, сохраняемся
    
if(empty($msg))
    {
//         тут добавляем в БД
//         $_POST['name'] = mysql_real_escape_string($_POST['name'], $db);
//         mysql_query ("INSERT INTO `comments` (`name`) VALUES ('{$_POST['save']}')", $db);
        
header('Location: index.php?saved');
    }
}
elseif(isset(
$_GET['saved']))
{
    
$msg 'Усе сохранено!';
}
?>
<h2>Наша форма</h2>
<?php echo $msg// здесь выводим сообщение ?>
<form target="_self" method="post">
    <input type="text" name="name" />
    <input type="submit" name="save" value="Сохранить" />
</form>

Спустя 7 минут, 36 секунд (12.09.2009 - 21:05) SunSet написал(а):
kirik
Хорошо. Но эта форма же не работает если ее вставлять в середину документа. Не выводить же формочку в шапке. Потому что идут всякие <boby> и построения таблицы сверху.

Спустя 10 минут, 48 секунд (12.09.2009 - 21:16) kirik написал(а):
SunSet
Ты прикалываешься? smile.gif
Вынеси весь php код который занимается обработкой формы (кроме конечно того, который выводит сообщение), в самое начало файла до всяких <html>, <body> и прочих дел.
Свернутый текст
PHP
<?php
$msg 
null;
if(isset(
$_POST['save']))
{
    if(empty(
$_POST['name']))
    {
        
$msg 'Поле "Имя" не заполнено (нужно заполнить).';
    }
//     тут можно добавлять проверяемые поля по мере надобности
//     elseif(empty($_POST['email']))
//     {
//         $msg = 'Поле "email" не заполнено (нужно заполнить).';
//     }

    // если ошибок не возникало, сохраняемся
    
if(empty($msg))
    {
//         тут добавляем в БД
//         $_POST['name'] = mysql_real_escape_string($_POST['name'], $db);
//         mysql_query ("INSERT INTO `comments` (`name`) VALUES ('{$_POST['save']}')", $db);
        
header('Location: index.php?saved');
    }
}
elseif(isset(
$_GET['saved']))
{
    
$msg 'Усе сохранено!';
}
?>
<html>
<head>
<title>Вот</title>
<!-- ... -->
</head>
<body>
<h2>Наша форма</h2>
<?php echo $msg// здесь выводим сообщение ?>
<form target="_self" method="post">
    <input type="text" name="name" />
    <input type="submit" name="save" value="Сохранить" />
</form>
</body>
</html>

Спустя 40 секунд (12.09.2009 - 21:17) twin написал(а):
Напиши первой строчкой
PHP
ob_start();

а самой последней
PHP
$buffer ob_get_contents();  
ob_end_clean();
echo 
$buffer;

и не мучайся.

Спустя 21 минута, 27 секунд (12.09.2009 - 21:38) kirik написал(а):
twin
пусть сразу правильно делает smile.gif

Спустя 22 минуты, 22 секунды (12.09.2009 - 22:00) SunSet написал(а):
kirik
Голова уже вскипает.. Вроде мелочь, а так трудно решаема. Спасиб за ответы user posted image

Спустя 26 минут, 6 секунд (12.09.2009 - 22:26) twin написал(а):
Цитата
пусть сразу правильно делает

А почему ты считаешь, что это не правильно... Я всегда так делаю и даже не задуряюсь, есть там вывод, нету. Да и ровнее выдача так получается.

Спустя 31 минута, 5 секунд (12.09.2009 - 22:58) kirik написал(а):
twin
Под "правильно" я подразумевал разделение обработчика и шаблона, зачем это нужно тебе не буду объяснять smile.gif А насчет "вставить и не париться", то можно и error_reporting(0) сразу воткнуть.. ну, чтоб нотисы не парили smile.gif

Спустя 12 минут, 45 секунд (12.09.2009 - 23:10) twin написал(а):
Цитата
можно и error_reporting(0) сразу воткнуть..

Не, ну это жестко)))
А буфферизация кстати отчасти для этого и придумана, чтоб вывод упорядочить. Чтоб не греть голову где что располагать. Особенно с сессиями.

Спустя 9 минут, 28 секунд (12.09.2009 - 23:20) SunSet написал(а):
Обратно все переделал, скрипт в отдельный файл чтоб наверняка никаких Ф5 не было.. правда и сообщения "Добавлено" теперь не будет. Не соображу как с этими location все сделать, когда уже страничка от и до сделана. unsure.gif

Спустя 27 минут, 26 секунд (12.09.2009 - 23:47) twin написал(а):
PHP
<?php
ob_start
();
?>
<h1>Всякая хрень - начало страницы</h1>
<?php
$msg 
null;
if(isset(
$_POST['save']))
{
    if(empty(
$_POST['name']))
    {
        
$msg 'Поле "Имя" не заполнено (нужно заполнить).';
    }
//     тут можно добавлять проверяемые поля по мере надобности
//     elseif(empty($_POST['email']))
//     {
//         $msg = 'Поле "email" не заполнено (нужно заполнить).';
//     }

    // если ошибок не возникало, сохраняемся
    
if(empty($msg))
    {
//         тут добавляем в БД
//         $_POST['name'] = mysql_real_escape_string($_POST['name'], $db);
//         mysql_query ("INSERT INTO `comments` (`name`) VALUES ('{$_POST['save']}')", $db);
        
header('Location: index.php?saved');
    }
}
elseif(isset(
$_GET['saved']))
{
    
$msg 'Усе сохранено!';
}
?>
<h2>Наша форма</h2>
<?php echo $msg// здесь выводим сообщение ?>
<form target="_self" method="post">
    <input type="text" name="name" />
    <input type="submit" name="save" value="Сохранить" />
</form>
<?php
$buffer 
ob_get_contents();  
ob_end_clean();
echo 
$buffer;

Спустя 1 час, 25 минут, 10 секунд (13.09.2009 - 01:12) SunSet написал(а):
twin
kirik

Примного благодарен, наконец-то заработало rolleyes.gif
Обясните только, ob_start(); кеширует все что после него и потом выводится, как понимаю. Для чего это?

Спустя 4 часа, 4 минуты, 12 секунд (13.09.2009 - 05:17) twin написал(а):
Не кэширует, а пишет в буффер.
Именно для этого и есть. Сначала весь вывод собирается в буффер, потом целиком отправляется в поток. Только уже упорядоченно. То есть заголовки на своем месте.

Спустя 14 часов, 31 минута, 8 секунд (13.09.2009 - 19:48) SunSet написал(а):
Я все никак успокоиться не могу) В этой строчке проблема:
PHP
header('Location: index.php?saved');

допустим, что коммент добавляется со странички index.php?id=3. Хочу чтоб после добавления переадресовывало сюда же, но переменная $id теряется при перенаправлении на другую страницу. Как быть? unsure.gif

Спустя 10 минут, 8 секунд (13.09.2009 - 19:58) kirik написал(а):
SunSet
думать ты не хочешь, вот что smile.gif
PHP
header('Location: index.php?id='.$_GET['id'].'&saved');

Спустя 2 минуты, 33 секунды (13.09.2009 - 20:00) SunSet написал(а):
kirik
tongue.gif Я думал) Твой вариант не работает - ни с гет, ни с пост.
Комент добавляется, надпись "Добавлено" есть, но ссылка такого вида получается index.php?id=&saved

Спустя 36 минут, 9 секунд (13.09.2009 - 20:37) kirik написал(а):
SunSet
=) Смотри, post ты отправляешь на index.php?id=3 ? Значит и забираешь GET'ом этот ID

Спустя 13 минут, 13 секунд (13.09.2009 - 20:50) SunSet написал(а):
kirik
У меня есть проверка до вывода
PHP
if (isset($_GET['id'])) {$id $_GET['id']; }

то есть уже в location вставлял $id. Но она равна нулю..

Спустя 40 минут, 9 секунд (13.09.2009 - 21:30) kirik написал(а):
Цитата (SunSet @ 13.09.2009 - 12:50)
то есть уже в location вставлял $id. Но она равна нулю..

Отследи - почему, и напиши сюда)

Спустя 7 минут, 16 секунд (13.09.2009 - 21:37) SunSet написал(а):
kirik
Каким методом отследить?
Както бредово получается в вот этом коде:
PHP
$insrtmysql_query ("INSERT INTO comments (hotel_id,author,estimation,mail,date,text) VALUES ('$hide','$author','$estimation','$mail','$date','$text')",$db);

    
header('Location: index.php?id='.$hide.'&saved');

$hide - переменная, в которой передается номер страницы (тот же id). В базу он заносится (значение 3) но в Location не добавляет эту тройку. unsure.gif

Спустя 7 минут, 36 секунд (13.09.2009 - 21:45) kirik написал(а):
SunSet
гм.. правда удивительно.. а если header заменить на echo?

Спустя 10 минут, 34 секунды (13.09.2009 - 21:55) SunSet написал(а):
kirik
Разобрался... спасиб, заставил подумать))

Спустя 31 минута, 2 секунды (13.09.2009 - 22:26) Pinoplast написал(а):
Без сесий прийдеться яву подключать к работе


_____________
... и помните! Каким бы ни был PHP, главное - чтобы он был защищенным! :) (PHP с Анфисой Чеховой)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.