Не могу избавиться от переменных в GET

storng

Новичок
Не могу избавиться от переменных в GET

Есть скрипт, который формирует html-страницу в зависимости от условий
Действие скрипта – изменение названия категории новости при нажатии на ссылку (в которой в качестве get параметра передаётся id категории и режим (в данном случае mode=rename)

1. При нажатии на ссылку, я открываю этот же скрипт и считываю параметры и формирую страницу ввода нового имени и кнопки (ren) отправки данных этому же скрипту методом POST.

2. Так же в начале скрипта я проверяю если передан режим то запускаю запрос к БД на переименование
PHP:
if (isset($_POST['ren']))
Но тут возник вопрос.

Когда я снова обращаюсь к скрипту (этап 2) для проверки режима – в строке браузера всё-равно передаются значения get

category.php?mode=rename&id_cat=11

Странно, но ведь я не передавал значения get через форму, а эти значения у меня висят с этапа 1 (когда формировалась страница для ввода нового имени). Почему так ?
И ещё удивительно, удалить значение mode из массива get я не могу!

Пишу вот так в функции вывода окна для ввода нового имени:
PHP:
unset($_GET['mode']);
Действительно удаляет (проверял print_r’ом)
Но при клике по кнопке отправки (метод POST) вызывается этот же скипт и в строке браузера мы снова видим category.php?mode=rename&id_cat=11

Т..е. снова в get есть mode=ren

Как это убрать ,можно ли ?

-~{}~ 29.08.07 10:27:

Вот подробности.
В самом начале я выдаю список категорий ( из БД) и рядом колонка с такими ссылками
PHP:
<a href=\"category.php mode=rename&id_cat=$id_categ\">Rename</a>";
В начале скрипта я проверяю режим и если он rename то я генерирую окно для ввода нового имени:

PHP:
elseif (isset($_GET['mode']))
{
if ($_GET['mode']=='rename')
{
show_form_cat_for_rename();
}
}
Вот сама функция для отображения окна для ввода нового имени категории:

PHP:
function show_form_cat_for_rename()
{
unset($_GET['mode']);
echo "
<form action=\"\" method=\"POST\">
    Категория<br><input type=\"text\" name=\"new_name\" size=\"100\" maxlength=\"100\"
	value=\"введите новое имя\"><br><br>
    <input type=\"submit\" name=\"ren\" value=\"Создать\"> 
</form>";
}
Ну и снова в начале скрипта условие,
PHP:
elseif (isset($_POST['ren']))
{
rename_category($_GET['id_cat'],$_POST['new_name']);
}

Вот собственно на всех этапах передаётся в GET mode=rename
И ни как не удаляется :(
 

Фанат

oncle terrible
Команда форума
что такое "массив get" в твоем понимании, и какое отношение он имеет к масиву $_GET?

-~{}~ 29.08.07 10:30:

кстати, я не понял - а чем она тебе там мешает?
 

storng

Новичок
*****
Под массивом GET я имею ввиду массив $_GET
А вот в последней форме, где происходит ввод нового имени, я же не подставляю значения в $_GET а наборот удаляю, но всё равно, параметр mode торчит в адресе.
.
По поводу нужны мне они или нет - просто эстетически, хотелось бы от ненужных параметров избавиться, тем более не совсем понимаю как это сделать, и почему они передаются.
Если буду это понимать, то можно и оставить :) не мешают как бы.
 

Фанат

oncle terrible
Команда форума
я же не подставляю значения в $_GET а наборот удаляю
1. куда не подставляешь?
2. откуда удаляешь?

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

а почему у тебя они там висят, написано в учебнике по html. наверное...
 

storng

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

Фанат

oncle terrible
Команда форума
Ну для того, что бы значения передавались скрипту, можно использовать массив $_GET.
фигню ты какую-то написал.
массив $_GET никуда ничего не передает.

очень плохо, что ты не ответил на два моих конкретных вопроса.
ответы на них нужны не мне. а тебе. чтобы ты для себя сформулировал, и понял, в каком месте говоришь чушь.
 

storng

Новичок
Ну вот когда я делаю ссылку, и параметры указываю
открываю скрипт по ссылке, в нём получаю эти параметры из массива $_GET
Когда я жму на кнопку в последней форме - данные скрипту передаю методом post а не get, но в шапке всё равно куча значений.
Удаляю из массива $_GET одно значение unset($_GET['mode']);
Но всё равно параметры передаются и всё, хотя я просто вызываю этот же скрипт.

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

storng

Новичок
*****
Сейчас прочитаю материал, ещё раз всё продумаю, что бы лишний раз глупые вопросы не задавать.
Если снова будет не понятно, спрошу но уже грамонтно детализирую :)
 

Фанат

oncle terrible
Команда форума
Вообще, главная твоя проблема в обоих вопросах - в неверных выводах.
В принципе, это хорошо, что ты пытаешься думать самостоятельно. Но недостаток знаний приводит тебя к неверной интерпретации проблемы.

в прошлый раз ты валил на типы, хотя, разумеется, проблема была в твоем коде, который подставлял все время одно и то же значение.

Сейчас ты валишь все на массив $_GET, который тут совсем не при чем, да еще и путаешь его с адресной строкой.
 

С.

Продвинутый новичок
form action="" <-- вот тут все твои геты сидят, прям промеж кавычек.
 

storng

Новичок
*****
Да, ты прав, мало знаний, но будем стараться :)
.
C. А ведь действительно сидят там, прописал название скрипта - и геты отпали. Thx
Но опять же, хотелось бы узнать принципы работы, почему так получается.

-~{}~ 29.08.07 11:56:

Добавил в форму ввода новой новости - скрытое поле, для передачи id редактируемой рубрики
теперь функция отображения формы ввода выглядит так:

PHP:
function show_form_cat_for_rename()
{

$id_cat=$_GET['id_cat'];

echo "
    <form action=\"category.php\" method=\"POST\">
    Категория<br><input type=\"text\" name=\"new_name\" size=\"100\" maxlength=\"100\"
	value=\"введите новое имя\"><br><br>
	<input type=\"hidden\" name=\"id_c\" value=$id_cat>
    <input type=\"submit\" name=\"ren\" value=\"Создать\"> 
    </form>
	";
}
 

Фанат

oncle terrible
Команда форума
1. "геты" должны бвли отпасть совсем по другой причине. из-за правильной обработкуи формы, отправленной постом.
2. отучайся от привычки называть адресную строку "гетами". сам путаешься ,и других с толку сбиваешь
3. при чем здесь форма ввода новости, если изначально речь шла о переименовании категорий?
 

С.

Продвинутый новичок
Но опять же, хотелось бы узнать принципы работы, почему так получается.
А ты когда пустую строку там поставил, что имел в виду? Что-то типа "mailto://дедушка@деревня.ru"?
 

storng

Новичок
ФАНАТ
1. а как её нужно обрабатывать ,что бы отпали геты ?
2. Окей !
3. Форма ввода названия новости, т.е. когда я кликаю по ссылке рядом с категориями - открывается форма ввода нового названия и кнопка
.
.
C. Да я просто увидел что так делают, и что при нажатии на кнопку выполняется этот же скрипт - думал разницы нет, что писать название скрипта или просто ""
 

Фанат

oncle terrible
Команда форума
1. я давал ссылку, где написано.
3. а что у тебя за странные новости, состоящие из одного названия?
 

storng

Новичок
*****
1.Угу, читаю
3. Опечатался, речь идёт о категориях новости, под них есть своя таблица, в которой ключ + наименование
 

Фанат

oncle terrible
Команда форума
Вот именно. Я и сам невнимательный, но твоя - из ряда вон выходит. И может тебе все испортить даже при полном пониматии технологии.

Две рекомендации.
Не нужно писать столько функций. И уж тем более не нужно писать функции для вывода хтмл. последний желательно вообще выносить в отдельные файлы, для удобства редактирования.

Зачем в скрипте столько функций, если у него очень простая логика?
вот тебе пример работы с базой, который реализует классическую связку "форма-раблица". причем это практически готовый редактор твоих категорий:

PHP:
<? 
mysql_connect();
mysql_select_db("new");
$table="test";
if($_SERVER['REQUEST_METHOD']=='POST') { 
  if ($id=intval($_POST['id'])) {
    $query="UPDATE $table SET name='".mysql_real_escape_string($_POST['name'])."' WHERE id=$id";
  } else {
    $query="INSERT INTO $table SET name='".mysql_real_escape_string($_POST['name'])."'";
  }
  mysql_query($query);
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 
  exit; 
} 
if (!isset($_GET['id'])) { 
  $LIST=array();
  $query="SELECT * FROM $table"; 
  $res=mysql_query($query);
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
  include 'list.php';
} else { 
  if ($id=intval($_GET['id'])) {
    $query="SELECT * FROM $table WHERE id=$id"; 
    $res=mysql_query($query);
    $row=mysql_fetch_assoc($res);
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
  } else {
    $row['name']='';
    $row['id']=0;
  }
  include 'form.php';
} 
?>

form.php
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>

list.php
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
 

storng

Новичок
ого, интересно !
Очень понравилась идея выносить html-форму в отдельный файл.
По поводу функций -задумаюсь, что бы их уменьшить но и каши не получалось, просто как-то удобнее разграничивать всё по небольшим блокам, а потом их них уже логику лепить.
Thx!
 

Фанат

oncle terrible
Команда форума
не только форму.
а вообще любой html. это называется шаблонизацией, и очень сильно поможет в будущем.

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