Помогите разобратся... PHPSESSID и Валидация... :(

Бочонок

http://frontender.info
Помогите разобратся... PHPSESSID и Валидация... :(

Доброго времени суток.

Дурацкая проблема.
Есть страничка. Вполне даже валидная.
Выложил на хостинг.
И получил на валидаторе ошибку.

Line 71, column 135: document type does not allow element "input" here; missing one of "ins", "del", "h1", "h2", "h3", "h4", "h5", "h6", "p", "div", "address", "fieldset" start-tag .

...="3b6282865f10b30f6e2b3655545e24c1" />

The mentioned element is not allowed to appear in the context in which you've placed it; the other mentioned elements are the only ones that are both allowed there and can contain the element mentioned. This might mean that you need a containing element, or possibly that you've forgotten to close a previous element.

One possible cause for this message is that you have attempted to put a block-level element (such as "<p>" or "<table>") inside an inline element (such as "<a>", "<span>", or "<font>").
Посмотрел код (в валидаторе, не на машине.) и увидел следуюющее:

...
#71 <form method="post" id="mail_form" action = "mail.php"><input type="hidden" name="PHPSESSID" value="3b6282865f10b30f6e2b3655545e24c1" />
#72 <div class="form_line_f"></div>
#73
#74 <div class="form_line_s">
...
Не к месту добавленый
PHP:
<input type="hidden" name="PHPSESSID" value="3b6282865f10b30f6e2b3655545e24c1" />
делает страничку невалидным...
И я ума не приложу как с этим боротся ???

ПОМОГИТЕ !!!! Пожалуста.
Что тут можно придумать ?
Вставлять что то после формы бессмысленно - поле вставляется сразу после нее.


ЗЫ. Насколько я понял - причина этого безобразия то, что в настройках хостера для сесии отключеный cookies.
С провайдером я связываюсь, но если изменить ничего нельзя, то как можно это исправить ?

-~{}~ 16.08.06 19:33:

Если я прописываю в CSS таблице,
#mail_form{
display:block;
}
Это не помогает :(
 

Кухан

Новичок
добавляй сам вручную это поле в форму, так что оно было валидно
 

Фанат

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

-~{}~ 16.08.06 20:42:

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

Кухан

Новичок
Валидатор ругается на то, что input находится внутри form. Согласно стандартам он должен находится внутри div, p и т.п.
Line 71, column 135: document type does not allow element "input" here; missing one of "ins", "del", "h1", "h2", "h3", "h4", "h5", "h6", "p", "div", "address", "fieldset" start-tag .
Пример:
На этот код валидатор будет "ругаться":
Код:
...
<form method="post" action = "mail.php">
<input type="hidden" name="PHPSESSID" value="3b6282865f10b30f6e2b3655545e24c1" />
</form>
...
А вот так уже всё правильно будет:
Код:
...
<form method="post" action = "mail.php">
<p>
<input type="hidden" name="PHPSESSID" value="3b6282865f10b30f6e2b3655545e24c1" />
</p>
</form>
...

Теперь как решить проблему, что PHP генерирует невалидный код:
PHP:
...
<form method="post" action = "mail.php">
<p>
<input type="hidden" name="<?php echo session_name(); ?>" value="<?php echo session_id(); ?>" />
<!-- Здесь остальные ваши поля -->
</p>
</form>
...
-~{}~ 16.08.06 21:07:

Фанат, не хами.
 

Бочонок

http://frontender.info
2Кухан,Фанат:

Извините, но вы кажется не уловили сути проблемы.
Поле добавляю не я. И не мой скрипт.
Это делает интерпретатор.
В настройках которого запрещено почему то (насколько я понял - хостер пока что молчит...) использование для сессий cookies.
И эта *зараза* добавляет его сразу после тега <form>
То есть в оригинальном файле код выглядит так:

...
#71 <form method="post" id="mail_form" action = "mail.php">
#72 <div class="form_line_f"></div>
#73
#74 <div class="form_line_s">
...
И что бы я не вставлял после тега <form> этот саймый инпут ставится между ним и тегом. Тоесть написать

...
<form method="post" action = "mail.php">
<p>
<input type="hidden" name="<?php echo session_name(); ?>" value="<?php echo session_id(); ?>" />
<!-- Здесь остальные ваши поля -->
</p>
</form>
...
просто технически не получится. :(

Валидатор не с "перепугу" считает инпут неуместным внутри формы. Просто в xhtml 1.1 по какой то малоясной причине (пожалуй таки с перепугу, но это к - w3c) <form> считается строчным элементом (? Если я не напутал). И для того что бы документ был валидным поля внутри него должны быть помещены в блочный эелемент.
В идеале - <fieldset>, но DIV тоже вполне устраивает. Его и использую.

Вопрос в том, КАК уверить валидатор что это чудо валидно при том что инпут не получается внести в этот злощастный блочный элемент...

Может завтра я все таки застану когото в асе хостера, и все решится наилучшим образом - тоесть включат в настройках php поддержку cookies.
Но если нет - хостинг я уже купил. На год =8(~)=.
И таким образом сталкиваюсь с принеприятной проблемой, описанной выше.
Помогите мне решить эту головоломку.
Сегодня над ней целый день бьюсь.
Пока результата нет.

Очень надеюсь на вашу помощь.
 

Фанат

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

Ну, или делать документ валидным так, как написал Кухан
 

Бочонок

http://frontender.info
1. Как я его могу сделать валидным, так как написал Кухан, если не могу вставить тег между <form> и подставляемым елементом <input> ? Именно ответ на этот вопрос я и ищу.

2.
надо не куки включать, а передачу сида через урл выключать
Насколько я знаю, передачу сида через урл происходит в том случае, если установлен в false параметр session.use_cookies или если у пользователя отключены cookies. Что в моем случае не так.
session.use_trans_sid естественно должен быть установлен в true. Что так и есть, судя по коду. Если бы он при этом был в false - сессия вообще бы не работала. Я не прав ?
 

Фанат

oncle terrible
Команда форума
если не могу вставить тег между <form> и подставляемым елементом <input>
как это - не можешь?!
Насколько я знаю, передачу сида через урл происходит в том случае, если установлен в false параметр session.use_cookies или если у пользователя отключены cookies. Что в моем случае не так.
ну правильно.
так оно и работает у тебя.
Если бы он при этом был в false - сессия вообще бы не работала.
почему не работала? У тебя включены куки в браузере или отклоючены? Ты уж определись.
 

Бочонок

http://frontender.info
Поле добавляю не я. И не мой скрипт.
Это делает интерпретатор.
И вставляет он его упорно сразу после тега form
Если я после него вставлю div он вставится между form и div.
Сразу после form.
Именно в этом вся проблема.

У меня ВКЛЮЧЕНЫ cookie.
Это я гипотетически - если б выключил и session.use_trans_sid=false то не работало бы...
 

Бочонок

http://frontender.info
а пхп откуда об этом узнает?
ЭЭЭЭ.... Если чесно - не знаю.
Надо посмотреть.
С заголовками, как я помню, это не связано. Нет там такого.
Так что скорее всего - он не знает.
Что значит, что он добавляет их в любом случае, если установлен session.use_trans_sid...
А это в свою очередь приводит к вопросу - почему у меня документ на локальном сервере был валиден ?
А ответ - потому что я сохранял его перед передачей валидатору (?).
Но тогда есть два вопроса, на которые я не могу найти ответа:

1. Если у меня на домашнем сервере оно тоже добавлялось, то почему оно не сохранялось, через 'SaveAs' браузера и не отображалось через "page source" и т.д. ?

2. Эээээ... И что теперь делать ? Как тогда такой код сделать валидным ?

-~{}~ 17.08.06 00:02:

...Или все таки как то узнает ?... Только что нашел в книжке цитирую:
...Скрипт будет работать, как описано, только в том случае, если в браузере действительно отключены Cookies. Если же они включены, PHP просто не будет генерировать SID (она будет пустой) и задействует Cookies...
PHP4 Д.Котеров. стр. 358.
Сейчас попробую уточнить на их сайте.

-~{}~ 17.08.06 00:10:

Прямого ответа на php.net я не нашол.
Возможно php делает вывод об отключенных cookies по каким то признакам $_COOKIE (или же заголовка, содержащего cookies, что эквивалентно) ?
------------------------------------------------------
И при отключенных cookies и при отсутствии таковых $_COOKIE есть, но пустой. Завтра попробую посмотреть заголовки.


Но как бы там ни было - это не решает основного вопроса :

Как тогда такой код сделать валидным ?
Подскажите пожалуста !

-~{}~ 17.08.06 13:13:

Неужели ни кто не подскажет как с такой бедой боротся ?

-~{}~ 17.08.06 16:13:

Собственно вопрос теперь представляет чисто академический интерес.
Провайдер позволил менять настройки php.
 

Фанат

oncle terrible
Команда форума
я знаю способ.
не стартовать сессию перед выводом формы.
причём я давно его знаю, а сейчас протупил просто
 

Бочонок

http://frontender.info
эээээ....
А разве можно стартовать сессию после того, как что то вывел ?

Warning: session_start(): Cannot send session cookie - headers already sent by...
Может я не верно понял. Ты это имел в виду:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title>Тест</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
</head>
<body>
<form action=''>

<?session_start();?>

</form>
</body>
</html>
-~{}~ 17.08.06 23:12:

Или имеетсся в виду использование буфферизации вывода ?
Хотя я не пробывал так ее использовать, но подозреваю что интерпретатор обрабатывает документ после того как он полностью свое отработал и уже идет в браузер клиента. Хотя под юникс flush позволяет сливать все ксочками... так что может я заблуждаюсь...
 

Фанат

oncle terrible
Команда форума
нет, я имел в виду
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title>Тест</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
</head>
<body>
<form action=''>
</form>
</body>
</html>
 

Бочонок

http://frontender.info
я знаю способ.
не стартовать сессию перед выводом формы.
А где же ее тогда стартовать ?
Стартовать ее нужно, что бы получить переменные в сесии хранящиеся.
Но если включен session.use_trans_sid, то интерпретатор добавляет <input... сразу после тега <form> чем делает его не соответствующим стандарту XHTML 1.1

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

Фанат

oncle terrible
Команда форума
какие переменные хранятся у тебя в сессии?

-~{}~ 18.08.06 00:14:

Из твоего сообщения я сделал вывод, что ты знаешь как с этим боротся.
Обьясни пожалуста - как.
объясняю
не стартовать сессию вовсе
 

Бочонок

http://frontender.info
какие переменные хранятся у тебя в сессии?
Какая разница ?
Так как проблема решена - то гипотетические.
В моем случае - это поддержка и проверка аутентификации пользователя а так же его личные данные и т.д.

не стартовать сессию вовсе
Тоесть ваше решение - отказатся от использования сессий ради валидности документа :) :lol:
Не шутите так !
Следование стандарту вопреки здравому смыслу - обсурдно. i.m.h.o.
Конечно можно заменить сессии их самописным аналогом - но это просто глупо, если уже имеется в наличии надежный механизм реализованый и поддерживаемый самим интерпретатором.
Я конечно считаю что изобретать велосипед НУЖНО и ПОЛЕЗНО - так как можно получить и опыт и устройство лучше выполняющее свои функции, чем оригинальное, но это - i.m.h.o. - не тот случай.
 

Фанат

oncle terrible
Команда форума
В моем случае - это поддержка и проверка аутентификации пользователя
какого пользователя? валидатора? а какой у него пароль?

-~{}~ 18.08.06 15:18:

Так как проблема решена
фигасе - решена у него проблема.
взял, обрезал, за здорово живёшь, наполовину функционал сессий, и это у него называется решением проблемы

-~{}~ 18.08.06 15:22:

пупсик.
попробуй понять мои слова буквально.
Не вкладывая в них никакой отсебятины.
 
Сверху