23:46

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Здравствуйте.

Проблема с php.

Есть страничка. В начале выводится html, потом выполняется вот это на php



Проблема собтвенно вот в чём - у меня на локальном серваке всё работает нормально и проблем нет.
Но если перенести это всё на портативный сервер (xampp) то перестают устанавливаться куки.

В описании setcookie указано, что куки должны устанавливаться до первого вывода в браузер. Но в моём случае это как-то не особо возможно. А если и возможно, то придётся писать много всего, чтобы остальное работало. В общем, переписывать имеющееся очень накладно.

Вопрос - что нужно сделать, чтобы и на портативном сервере стало работать? На локальном же работает и не ругается ни на что.
Если что, локальный у меня чистый. Апач, пхп и мускул установлены по очереди. Инсталлеры брал с оффсайтов.

Комментарии
11.05.2012 в 00:02

fire-dragon
скорее всего вы сохранили файлы в кодировке utf8 с BOM. ru.wikipedia.org/wiki/UTF-8 Откройте в редакторе и удалите эти 3 символа
11.05.2012 в 00:12

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, про это уже читал. Удаление первых трёх символов ничего не даёт. Всё также не ставятся куки. + локальном серверу как-то сугубо пофиг на BOM. Он работает, а не выёживается.

Ладно, подойдём с другой стороны - можете посоветовать какой-нибудь нормальный портативный вариант (Апач+PHP+MySQL)?
11.05.2012 в 00:20

fire-dragon
Стоять боятся, более внимательно прочел. Это не возможно по определению. Единственный метод установить куки после вывода html это использовать java sсript www.linkexchanger.su/2008/42.html
11.05.2012 в 00:24

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, Да я вроде понимаю, что это не возможно, но работает ведь, блин.

Я вообще, если честно даже не представляю, как можно этот кусок переписать, чтобы куки впереди были.

У меня перед этим блоком выводится табличка-заголовок + блоки errorconnect и иже.
11.05.2012 в 00:35

fire-dragon
значит вы что то упустили. типичный ответ сервера:



«Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Encoding: gzip, deflate
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Connection: keep-alive
сoоkiе: yandexuid=6067511331722036; fuid01=4f5f70e509306cfc.IVk5Z_Wf0jfgh4Pn2HlzS4X-fflZpRDVVVP5e3HxXRpAMFtJkZehUoBGcpb4p_9_m5e0gsm_bUFn7iVfqZA8ypc9oZdh1VRmcoklpLyEu6li9Da1vVeTo-B7iOtjDmqe; yabs-frequency=/4/0000000000000000/derY00mD8G00/
Host: yandex.ru
Referer: ya.ru/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0



что то ваше
»

Так что рефакторите код. В шапку выносите серверную логику. После в html проверяйте состояние переменных и уже на основе этого организуйте вывод. А по хорошему отделите дизайн от кода с помощью smarty или любого шаблонизатора
11.05.2012 в 00:44

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Сервер мне выдаёт:

Warning: Cannot modify header information - headers already sent by (output started at N:\server\apache_portable\www\s\auth.php:7) in N:\server\apache_portable\www\s\auth.php on line 48

Warning: Cannot modify header information - headers already sent by (output started at N:\server\apache_portable\www\s\auth.php:7) in N:\server\apache_portable\www\s\auth.php on line 239


48-я строка: header("Content-Type: text/html;charset=utf-8");

239-я строка: setcookie("ptan2012", "$sac", null, "/");


Если убрать 48-ю:
Warning: Cannot modify header information - headers already sent by (output started at N:\server\apache_portable\www\s\auth.php:7) in N:\server\apache_portable\www\s\auth.php on line 238

То бишь, ругается на setcookie("ptan2012", "$sac", null, "/");
11.05.2012 в 00:52

Sanctus Satanas
по хорошему отделите дизайн от кода с помощью smarty или любого шаблонизатора
Да, собственно, можно и без специального шаблонизатора обойтись. До поры до времени. Ну или вообще обойтись.
Я видел хороший (и простой) пример MVC на пальцах в старой доке по Symfony 1.x: developer.co.ua/posts/view/glava_2_issleduem_ko...

48-я строка: header("Content-Type: text/html;charset=utf-8");
Значит есть где-то вывод текста до вызова header(). Другого варианта не дано. Напомню, что ВСЁ, что не находится внутри <?php отдаётся как текст. И при первом же выводе отсылаются все HTTP-заголовки, включая Set-Cookie и т.д.
11.05.2012 в 01:10

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, С хидером разобрались - я его стёр и на него не ругается теперь. Но всё равно ругается на строку с setcookie.

Я уже весь дизайн убрал. Оставил только саму проверку и установку куков.

<?php
if ($_GET['f'] == 1) setuser();
else
{
if ($_GET['f'] == 2)
{
clearcook();
}
else
{
echo 'document.location.href = "../."';
}
}

function setuser()
{
$email = $_POST['emailin'];
$password = $_POST['passin'];
$s = $_POST['savepass'];
$query1 = "select * from users where (email='$email' and password='$password')";
$link = mysql_connect('localhost', 'nord', 'neer');
if ($link == false)
{
echo "Ошибка соединения c MySQL!";
}
else
{
mysql_select_db("maintanibata", $link);
$res1 = mysql_query($query1);
if ($res1 != false)
{
$row = mysql_fetch_array($res1, MYSQL_ASSOC);
if ($row == "")
{
echo "Неверный логин или пароль!";
}
else
{
$login = $row[login];
$query2 = "select * from privtan2012 where (user='$login')";
$res2 = mysql_query($query2);
if ($res2 != false)
{
$row2 = mysql_fetch_array($res2, MYSQL_ASSOC);
if ($row2[org] == '56')
{
if ($s == "on")
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "56",
"cm" => $row2[chanme],
"com" => $row2[comme],
"vm" => $row2[viewme]);
$sac = implode(",", $arrcookie);
setcookie("ptan2012", "$sac", time()+86400, "/");
}
else
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "56",
"cm" => $row2[chanme],
"com" => $row2[comme],
"vm" => $row2[viewme]);
$sac = implode(",", $arrcookie);
setcookie("ptan2012", "$sac", null, "/");
}
}
if ($row2[org] == '7')
{
if ($s == "on")
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "7",
"cm" => "0",
"com" => "0",
"vm" => "0");
$sac = implode(",", $arrcookie);
setcookie("ptan2012", "$sac", time()+86400, "/");
}
else
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "7",
"cm" => "0",
"com" => "0",
"vm" => "0");
$sac = implode(",", $arrcookie);
setcookie("ptan2012", "$sac", null, "/");
}
}
if ($row2[org] == '31')
{
if ($s == "on")
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "31",
"cm" => $row2[chanme],
"com" => $row2[comme],
"vm" => $row2[viewme],
"cksc" => $row2[chankossc],
"coksc" => $row2[comkossc],
"vksc" => $row2[viewkossc],
"ckst" => $row2[chankostan],
"cokst" => $row2[comkostan],
"vkst" => $row2[viewkostan],
"cksv" => $row2[chankosvoc],
"coksv" => $row2[comkosvoc],
"vksv" => $row2[viewkosvoc],
"cksd" => $row2[chankosdef],
"coksd" => $row2[comkosdef],
"vksd" => $row2[viewkosdef],
"cksp" => $row2[chankospr],
"coksp" => $row2[comkospr],
"vksp" => $row2[viewkospr],
"ckna" => $row2[chankonart],
"cokna" => $row2[comkonart],
"vkna" => $row2[viewkonart],
"cknf" => $row2[chankonfot],
"coknf" => $row2[comkonfot],
"vknf" => $row2[viewkonfot],
"cknv" => $row2[chankonamv],
"coknv" => $row2[comkonamv],
"vknv" => $row2[viewkonamv],
"ckns" => $row2[chankonsce],
"cokns" => $row2[comkonsce],
"vkns" => $row2[viewkonsce],
"cknb" => $row2[chankonbjd],
"coknb" => $row2[comkonbjd],
"vknb" => $row2[viewkonbjd]);
$sac = implode(",", $arrcookie);
setcookie("ptan2012", "$sac", time()+86400, "/");
}
else
{
$arrcookie = array("l" => $row[login],
"e" => $row[email],
"n" => $row[name],
"t" => $row[telnum],
"p" => $row[pol],
"v" => $row[year],
"o" => "31",
"cm" => $row2[chanme],
"com" => $row2[comme],
"vm" => $row2[viewme],
"cksc" => $row2[chankossc],
"coksc" => $row2[comkossc],
"vksc" => $row2[viewkossc],
"ckst" => $row2[chankostan],
"cokst" => $row2[comkostan],
"vkst" => $row2[viewkostan],
"cksv" => $row2[chankosvoc],
"coksv" => $row2[comkosvoc],
"vksv" => $row2[viewkosvoc],
"cksd" => $row2[chankosdef],
"coksd" => $row2[comkosdef],
"vksd" => $row2[viewkosdef],
"cksp" => $row2[chankospr],
"coksp" => $row2[comkospr],
"vksp" => $row2[viewkospr],
"ckna" => $row2[chankonart],
"cokna" => $row2[comkonart],
"vkna" => $row2[viewkonart],
"cknf" => $row2[chankonfot],
"coknf" => $row2[comkonfot],
"vknf" => $row2[viewkonfot],
"cknv" => $row2[chankonamv],
"coknv" => $row2[comkonamv],
"vknv" => $row2[viewkonamv],
"ckns" => $row2[chankonsce],
"cokns" => $row2[comkonsce],
"vkns" => $row2[viewkonsce],
"cknb" => $row2[chankonbjd],
"coknb" => $row2[comkonbjd],
"vknb" => $row2[viewkonbjd]);
$sac = implode(",", $arrcookie);
setcookie("ptan2012", $sac, null, "/");
}
}
echo "Добро пожаловать $login!";
}
else
{
echo "Ошибка соединения!";
}
}
}
else
{
echo "Ошибка соединения!";
}
mysql_close($link);
}
}

function clearcook()
{
setcookie("ptan2012", "", time()-3600, "/");
echo 'document.location.href = "../."';
}
?>

11.05.2012 в 01:27

Sanctus Satanas
На pastebin бы лучше.
Но проблема и совет остаются ровно теми же. До вызова setcookie есть вывод на страницу. А при выводе отсылаются заголовки. Послать заголовок уже посреди тела ответа невозможно. И именно про это и говорит PHP. Говорит — значит есть вывод. Чудес не бывает.

P.S. И ещё раз, для закрепления, так сказать. Ф-я setcookie() это то же самое, что вызов ф-ии header() с аргументом примерно такого вида: 'Set-Cookie: name=value'. Обе ф-ии устанавливают HTTP-заголовки, которые будут посланы при отсылке страницы браузеру. А заголовки (ещё раз, да) посылаются до тела ответа (т.е. всего хтмл-кода, если это отдаётся хтмл-страница).
11.05.2012 в 01:34

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
На pastebin бы лучше.

О, буду знать.
pastebin.com/pndksnP0


Говорит — значит есть вывод.

Вопрос в том - где???
11.05.2012 в 01:39

fire-dragon
работайте от противного. Ошибка в строке Н, значит вывод был раньше. Код реально "индусский" копаться в нем сложно. Отладчиком пройдитесь по нему.
11.05.2012 в 01:39

Sanctus Satanas
Вопрос в том - где???
В первой строчке. До <?php есть символы. Это, вроде, пробелы, но, возможно, они в прошлой жизни были символами BOM, о чём уже писал fire-dragon.
11.05.2012 в 01:44

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ясно. Видимо я полный дундук. В общем, теперь редактить через pad, а не блокнотик. Вроде начало работать.

Хотя я так и не могу понять, почему локальный сервак на это дело не ругался.
Видимо теперь всё буду сразу на портативном тестить. Во избежание, так сказать.
11.05.2012 в 01:47

fire-dragon
возможно дело в переносах строки их 3 вида: дос, мак и юникс.
11.05.2012 в 01:47

Sanctus Satanas
Хотя я так и не могу понять, почему локальный сервак на это дело не ругался.
Вариант 1: там другой файл, в котором нет этих символов (советую сравнить размер в байтах)
Вариант 2: там каким-либо образом настроена перекодировка входного файла, которая отрезает BOM (возможно, это вообще фича PHP 5.4, я пока особо не копался)
11.05.2012 в 01:51

Sanctus Satanas
их 3 вида: дос, мак и юникс.
Кстати, на самом деле в Маках, начиная с MacOS X используется юниксовый LF. ) Что, впрочем, легко объяснимо BSD-шными корнями. )

11.05.2012 в 02:09

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, ам другой файл, в котором нет этих символов (советую сравнить размер в байтах)

Копировал с исходного. В байтах одинаковы. Но там с дизайном и BOM всё в порядке работает.




там каким-либо образом настроена перекодировка входного файла, которая отрезает BOM (возможно, это вообще фича PHP 5.4, я пока особо не копался)

Это более прадоподобно. Только PHP у меня 5.3.10
11.05.2012 в 02:14

Sanctus Satanas
Это более прадоподобно. Только PHP у меня 5.3.10
Ну ок, я ещё один вариант вспомнил и даже проверил. В php.ini (или в .htaccess и т.п.) может быть включён output_buffering. В этом случае вывод буферизуется и можно даже как бы задавать заголовки посреди вывода. Правда, запашок от такого кода будет явственный. &)
11.05.2012 в 02:23

fire-dragon
--==SS==--, Спасибки, набрел по твоей наводке на эту статью habrahabr.ru/post/45016/
11.05.2012 в 02:29

Sanctus Satanas
fire-dragon, ага, есть такая штука. Хотя в данном контексте это уже высший пилотаж. )