Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не работают сессии - помогите
 
 автор: Odin Kg   (02.07.2004 в 19:57)   письмо автору
 
 

Я совсем недавно начал изучать web-технологии. Сейчас добрался до сессий. Проблема в следующем:

<?php

session_start( );

// Тут пока ничего нет

session_destroy( );

?>

Почему-то IE выдает в результате следующий текст:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at d:\webshare\wwwroot\test_session.php:11) in d:\webshare\wwwroot\test_session.php on line 18

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at d:\webshare\wwwroot\test_session.php:11) in d:\webshare\wwwroot\test_session.php on line 18

В 18-той строке находится session_start( );.

У меня установлен веб-сервер Apache 1.3, который вроде работает. По крайней мере php-страницы, которые не содержат функций сессий он обрабатывает верно.

Еще одна проблема: почему-то php не передает на страницу параметры после знака «?». Например, в IE видно, что строка содержит параметр: www........?start=10
Как я понимаю после этого открываемая страница должна получить переменную $start=10, но этого не происходит - $start остается равной 0.

   
 
 автор: cheops   (02.07.2004 в 21:52)   письмо автору
 
   для: Odin Kg   (02.07.2004 в 19:57)
 

>Почему-то IE выдает в результате следующий текст:
>Warning: session_start() [function.session-start]: Cannot
>send session cookie - headers already sent by (output
>started at d:websharewwwroot est_session.php:11) in
>d:websharewwwroot est_session.php on line 18
>В 18-той строке находится session_start( );.
А что находится в 11 строке? Судя по предупреждению, происходит вывод в окно браузера. В этом случае сессии не будут работать, так как информация для их организации формируется через HTTP-заголовок, который уже отправлен клиенту (так как вы что-то выводите в браузер).
>Еще одна проблема: почему-то php не передает на страницу
>параметры после знака «?». Например, в IE видно, что строка
>содержит параметр: www........?start=10
>Как я понимаю после этого открываемая страница должна
>получить переменную $start=10, но этого не происходит -
>$start остается равной 0.
Дело в отключенной переменной register_globals, если вы работаете на локальной машине в php.ini следует исправить её на
register_globals = On

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

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=51&page=1

   
 
 автор: Odin Kg   (03.07.2004 в 13:10)   письмо автору
 
   для: cheops   (02.07.2004 в 21:52)
 

А что находится в 11 строке? Судя по предупреждению, происходит вывод в окно браузера. В этом случае сессии не будут работать, так как информация для их организации формируется через HTTP-заголовок, который уже отправлен клиенту (так как вы что-то выводите в браузер).

Для понятности высылаю полный текст сценария заново. Проблема происходит в строке 4 из-за строки 2.

1
2 <?
3
4 session_start( );
5
6 session_destroy( );
7
8 ?>


Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at d:\webshare\wwwroot\test_session.php:2) in d:\webshare\wwwroot\test_session.php on line 4

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at d:\webshare\wwwroot\test_session.php:2) in d:\webshare\wwwroot\test_session.php on line 4

Дело в отключенной переменной register_globals, если вы работаете на локальной машине в php.ini следует исправить её на register_globals = On
Но лучше сразу разрабатывать скрипты с использованием суперглобальных массивов.

Большое спасибо – совет помог. Если можно ответьте на детский вопрос: почему так лучше не делать? И что такое суперглобальные массивы (как ими пользоваться)?
Большое спасибо

   
 
 автор: glsv (Дизайнер)   (03.07.2004 в 13:27)   письмо автору
 
   для: Odin Kg   (03.07.2004 в 13:10)
 

Пока в форуме нет cheopsa попробую ответить я.
>Но лучше сразу разрабатывать скрипты с использованием суперглобальных массивов.
>Большое спасибо – совет помог. Если можно ответьте на детский вопрос: почему так лучше не делать?
Новая 5 версия PHP вышла с отключенными по умолчанию register_globals. И скоро хостеры в массовом порядке будут переходить на php5. А вот что они сделают с register_globals (включат или оставят выключенной) большой вопрос.
А используя суперглобальные массивы Вы будете независимы от этой опции.

Суперглобальные массивы… лучше об этом расскажет cheops, а я на примере покажу

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


$var1 = $_GET['var1']; 


Вот $_GET - это и есть суперглобальный массив
А вот такие пробемы (по ссылке) могут быть из-за отключенных register_globals

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=51&page=1

   
 
 автор: cheops   (03.07.2004 в 15:40)   письмо автору
 
   для: glsv (Дизайнер)   (03.07.2004 в 13:27)
 

>Суперглобальные массивы… лучше об этом расскажет cheops
Разделение труда? :)))

   
 
 автор: cheops   (03.07.2004 в 16:09)   письмо автору
 
   для: Odin Kg   (03.07.2004 в 13:10)
 

Давайте попробуем вот так:
1 <?
2 session_start( );
3 session_destroy( );
4 ?>
Символ переноса строки перед <? тоже может отправлятся в окно браузера.

Использование суперглобальных массивов необходимо для увеличения безопасности скриптов. PHP ведь позволяет не объявлять и не инициализировать переменные и через строку запроса такие переменные можно установить.
Обычно приводят следующий классический пример, из формы index.php в обработчик handler.php передаётся два параметра user и password, для имени и пароля, по которым посетителю предоставляется доступ к какой-либо странице, ну допустим управлению его виртуальным счётом:
<?php
// Файл handler.php, принимающий от формы index.php два параметра
// $user и $password для имени пользователя и пароля, соответственно
if($user == "user1" && $password == "password1")
{
  
$access 1;
}
if(
$access)
{
  
// Доступ к виртуальному счёту
}
?>

А вот теперь если в строке запроса обратится по адресу handler.php?access=1 вы будете пущены вообще минуя форму. Обойти, это конечно очень просто, но в больших Web-приложениях могут быть неочевидные ситуации. На фоне того, что злоумышленник может автоматически обращатся и анализировать ответы, или коды выложены для всеобщего доступа, вероятность взлома возрастает значительно, так как отследить все такие ситуации сложно.
Для этого введены так называемые суперглобальные массивы - предопределённые массивы в которых размещаются внешние переменные. При отключенной директиве register_globals из скрипта не доступны внешние переменные, такие как параметры запроса, параметры возвращаемые формой по методу POST, cookie, сессии и т.п. просто по имени $variable. Для этого используются суперглобальные массивы
$_GET['variable'] - для строки запроса (метод GET);
$_POST['variable'] - для метода POST
$_FILES['variable'] - для файлов передаваемых из формы
$_SESSION['variable'] - для сессий
$_COOKIE['variable'] - для cookie
и др.

   
 
 автор: Кузнецов М.В.   (03.07.2004 в 15:56)   письмо автору
 
   для: cheops   (03.07.2004 в 16:09)
 

Немного уточню по поводу массива $_FILES. Он несколько отличается от других тем, что он - двумерный суперглобальный массив. Возможны следующие варианты его использования:
$_FILES["filename"]["name"] (содержит исходное имя файла на клиентской машине);
$_FILES["filename"]["size"] (содержит размер загруженного файла в байтах);
$_FILES["filename"]["type"] (содержит MIME-тип файла);
$_FILES["filename"]["tmp_file"] (содержит имя временного файла, в кото-рый сохраняется загруженный файл).

   
 
 автор: Drank   (03.07.2004 в 16:46)
 
   для: Odin Kg   (02.07.2004 в 19:57)
 

Слушай как ты добрался до этого?
Я например не знаю как установить php сервер на своём компе, а нужно это делать, где ты раздобыл описание?

   
 
 автор: Odin Kg   (03.07.2004 в 17:51)   письмо автору
 
   для: Drank   (03.07.2004 в 16:46)
 

Первым делом, хочу поблагодарить Дизайнера, cheopsа и Кузнецова М.В за подробные объяснения. Связь с новичками у вас отлично поставлена. Спасибо.

Теперь попытаюсь помочь Drankу.

Видимо, Вы спрашивали как запустить в работу систему web-сервер – PHP. Сразу скажу, что я работают под Windows (с Unix-ом так не получится).
Первым делом, чтобы не возиться с web-сервером я скачал себе среду для работы с PHP. Таковая имеется на www.phpexperteditor.com (где-то 2,5 MB). Далее скачал PHP5 с www.php.net/downloads . Теперь разархивируйте php в папку c:\PHP. После этого в среде уже можно работать. Однако IE воспринимать Ваши php-файлы не будет – нужен web-сервер.
Кстати, чтобы php.ini файл воспринимался нужно положить его в каталог Windows. Сделать этот файл можно методом переименования файла php.ini-dist, который будет лежать у Вас в папке c:\PHP.

Скачайте веб-сервер Apache 1.3 (ссылок на него полно).
Теперь сообщите мне свой e-mail (можете в форуме, можете написать мне письмо), и я вышлю Вам конфигурационный файл с пояснениями.

   
 
 автор: cheops   (03.07.2004 в 18:40)   письмо автору
 
   для: Drank   (03.07.2004 в 16:46)
 

Хм... пожалуй действительно стоит написать статью в раздел "Статьи о PHP" об инсталляции связки PHP и Apache.
/*задумчиво оглядываясь по сторонам*/ кого-бы заставить...

   
 
 автор: cheops   (04.07.2004 в 12:11)   письмо автору
 
   для: Drank   (03.07.2004 в 16:46)
 

Почему-то никак не отправляется письмо по вашему адресу... вероятно mail.ru в борьбе со спамом окончательно решил принимать письма только со своих почтовых ящиков :))) Я уже был вынужден отказаться от их услуг, так как ничего невозможно ни отправить и ни получить... Надеюсь вы сюда загляните...

>Как установить php сервер на соём компьютере?
>Очень много справочной информации по программированию,
>но нет простого описания по установке php сервера и ссылок на ftp ресурсы с дистрибутивом.

Вероятно вам PHP нужен для работы с Web, тогда кроме самого PHP потребуется Web-сервер, настроенный для работы на локальной машине. Обычно для этого используют Apache, как наиболее распространённый и удобный сервер. После того как на системе запускается Apache к нему прикручивают PHP, который работет как его модуль или CGI-скрипт.
Скачать Apache можно с зеркал приведённых на официальном сайте http://www.apache.org/dyn/closer.cgi. При поиске следует помнить, что Apache так же может называться httpd, по имени его демона в UNIX. На зеркалах обычно много различных файлов, например:
httpd-2.0.49-win32-src.zip - это архив с исходными кодами (src) для Windows (win32) Web-сервера Apache (httpd) версии 2.0.49.
httpd-2.0.49.tar.gz - тоже самое, но для Linux, в котором программы принято распрастранять в исходных кодах.
apache_2.0.50-win32-x86-no_ssl.exe - а вот это, откомпилированный под архитектуру (x86) для Windows (win32) без поддержки SSL(no_ssl) сервер Apache (apache) версии 2.0.50 - вот он и нужен.
Чтобы вам не мучатся, вот ресурс где можно его взять: http://apache.rin.ru/dist/httpd/binaries/win32/
После этого его необходимо поставить, указав в качестве ServerName и Network Domain имя localhost (это имя для использования сервера на локальной машине, которое связано с IP-адресом 127.0.0.1, который зарезервирован для локального использования).
После успешной инсталляции при наборе в окне браузера http://localhost/ или http://127.0.0.1/ - должна загрузится страница сервера.

После этого к нему можно прикручивать PHP, для этого необходимо его скачать, ну например со страницы http://ru2.php.net/get/php-4.3.7-installer.exe/from/a/mirror. После этого его устанавливаем в папку C:/PHP, для того, чтобы PHP и Apache начали взаимодействовать (здесь PHP будет выступать в качестве CGI-скрипта), в конфигурационном файле Apache (conf/httpd.conf) необходимо добавить строки

AddType application/x-httpd-php phtml php
 <Directory "c:/php">
   Options ExecCGI
 </Directory>
 ScriptAlias "/php_dir/" "c:/php/"
 Action application/x-httpd-php "/php_dir/php.exe"


Если что-то не получается пишите - будем разбираться.

   
 
 автор: elenaki   (20.07.2004 в 15:05)
 
   для: cheops   (04.07.2004 в 12:11)
 

караул! HELP! СОС! внезапно, т.е. абсолютно ни с того ни с сего стало выдаваться такое же
сообщение:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /******//top.php:8) in /*******/offers2.php on line 2

2 раза, вместо ***** адрес сайта.

в строке 2 файла offers2.php - вызов сессии, в строке 8 файла top.php - meta-tag keywords
register_globals = On, сессии в другой папке на том же сайте работают. что опять случилось?
какую еще свинью мне этот "условно-бесплатный" хостер подложил?...

   
 
 автор: elenaki   (20.07.2004 в 15:15)
 
   для: elenaki   (20.07.2004 в 15:05)
 

sorry. не два раза. там разные строки - session cookie и session cashe limiter

   
 
 автор: elenaki   (20.07.2004 в 16:09)
 
   для: elenaki   (20.07.2004 в 15:15)
 

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

предложили мне за php upload сходить на php.net... я им ответила, что скрипт работает и
дело не в скрипте, а в их настройках сервера. я еще на одном сервере проверила, там PHP
как cgi установлен. все работает. надо будет после отпуска все-таки поговорить с шефом
на тему смены хостинга. невозможно с такой "поддержой" работать.

   
 
 автор: cheops   (20.07.2004 в 15:58)   письмо автору
 
   для: elenaki   (20.07.2004 в 15:05)
 

Т.е. top.php включён в offers2.php оператором include?
До, или после вызова сессии?

   
 
 автор: elenaki   (20.07.2004 в 17:01)
 
   для: cheops   (20.07.2004 в 15:58)
 

до. а какая разница? раньше-то все работало. и сейчас работает. это они там на сервере мудрят.

   
 
 автор: cheops   (20.07.2004 в 18:03)   письмо автору
 
   для: elenaki   (20.07.2004 в 17:01)
 

Тогда действительно никакой :)))

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования