Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Здравствуйте.
Проблема с php.
Есть страничка. В начале выводится html, потом выполняется вот это на php
Проблема собтвенно вот в чём - у меня на локальном серваке всё работает нормально и проблем нет.
Но если перенести это всё на портативный сервер (xampp) то перестают устанавливаться куки.
В описании setcookie указано, что куки должны устанавливаться до первого вывода в браузер. Но в моём случае это как-то не особо возможно. А если и возможно, то придётся писать много всего, чтобы остальное работало. В общем, переписывать имеющееся очень накладно.
Вопрос - что нужно сделать, чтобы и на портативном сервере стало работать? На локальном же работает и не ругается ни на что.
Если что, локальный у меня чистый. Апач, пхп и мускул установлены по очереди. Инсталлеры брал с оффсайтов.
Проблема с php.
Есть страничка. В начале выводится html, потом выполняется вот это на php
Проблема собтвенно вот в чём - у меня на локальном серваке всё работает нормально и проблем нет.
Но если перенести это всё на портативный сервер (xampp) то перестают устанавливаться куки.
В описании setcookie указано, что куки должны устанавливаться до первого вывода в браузер. Но в моём случае это как-то не особо возможно. А если и возможно, то придётся писать много всего, чтобы остальное работало. В общем, переписывать имеющееся очень накладно.
Вопрос - что нужно сделать, чтобы и на портативном сервере стало работать? На локальном же работает и не ругается ни на что.
Если что, локальный у меня чистый. Апач, пхп и мускул установлены по очереди. Инсталлеры брал с оффсайтов.
-
-
11.05.2012 в 00:02-
-
11.05.2012 в 00:12Ладно, подойдём с другой стороны - можете посоветовать какой-нибудь нормальный портативный вариант (Апач+PHP+MySQL)?
-
-
11.05.2012 в 00:20-
-
11.05.2012 в 00:24Я вообще, если честно даже не представляю, как можно этот кусок переписать, чтобы куки впереди были.
У меня перед этим блоком выводится табличка-заголовок + блоки errorconnect и иже.
-
-
11.05.2012 в 00:35«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:44Warning: 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Да, собственно, можно и без специального шаблонизатора обойтись. До поры до времени. Ну или вообще обойтись.
Я видел хороший (и простой) пример 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Я уже весь дизайн убрал. Оставил только саму проверку и установку куков.
<?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Но проблема и совет остаются ровно теми же. До вызова setcookie есть вывод на страницу. А при выводе отсылаются заголовки. Послать заголовок уже посреди тела ответа невозможно. И именно про это и говорит PHP. Говорит — значит есть вывод. Чудес не бывает.
P.S. И ещё раз, для закрепления, так сказать. Ф-я setcookie() это то же самое, что вызов ф-ии header() с аргументом примерно такого вида: 'Set-Cookie: name=value'. Обе ф-ии устанавливают HTTP-заголовки, которые будут посланы при отсылке страницы браузеру. А заголовки (ещё раз, да) посылаются до тела ответа (т.е. всего хтмл-кода, если это отдаётся хтмл-страница).
-
-
11.05.2012 в 01:34О, буду знать.
pastebin.com/pndksnP0
Говорит — значит есть вывод.
Вопрос в том - где???
-
-
11.05.2012 в 01:39-
-
11.05.2012 в 01:39В первой строчке. До <?php есть символы. Это, вроде, пробелы, но, возможно, они в прошлой жизни были символами BOM, о чём уже писал fire-dragon.
-
-
11.05.2012 в 01:44Хотя я так и не могу понять, почему локальный сервак на это дело не ругался.
Видимо теперь всё буду сразу на портативном тестить. Во избежание, так сказать.
-
-
11.05.2012 в 01:47-
-
11.05.2012 в 01:47Вариант 1: там другой файл, в котором нет этих символов (советую сравнить размер в байтах)
Вариант 2: там каким-либо образом настроена перекодировка входного файла, которая отрезает BOM (возможно, это вообще фича PHP 5.4, я пока особо не копался)
-
-
11.05.2012 в 01:51Кстати, на самом деле в Маках, начиная с MacOS X используется юниксовый LF. ) Что, впрочем, легко объяснимо BSD-шными корнями. )
-
-
11.05.2012 в 02:09Копировал с исходного. В байтах одинаковы. Но там с дизайном и BOM всё в порядке работает.
там каким-либо образом настроена перекодировка входного файла, которая отрезает BOM (возможно, это вообще фича PHP 5.4, я пока особо не копался)
Это более прадоподобно. Только PHP у меня 5.3.10
-
-
11.05.2012 в 02:14Ну ок, я ещё один вариант вспомнил и даже проверил. В php.ini (или в .htaccess и т.п.) может быть включён output_buffering. В этом случае вывод буферизуется и можно даже как бы задавать заголовки посреди вывода. Правда, запашок от такого кода будет явственный. &)
-
-
11.05.2012 в 02:23-
-
11.05.2012 в 02:29