Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Изпращане на хедъри в PHP!

Featured Replies

Въпроса ми е следния:

Как да изпратя cookie и след това да пренасоча потребителя към друга страница?

Изпращнето на cookie става с setcookie(), а пренасочването с header(). Това са две последователни команди и между тях няма друг код, както и преди и след тях, който да изпраща текст към браузъра. Въпреки всичко ми излиза грешка, че не може да модифицира хедърите, защото те вече били изпратени от реда с setcookie().

Как да излеза от положението?

Въпроса ми е следния:

Как да изпратя cookie и след това да пренасоча потребителя към друга страница?

Изпращнето на cookie става с setcookie(), а пренасочването с header(). Това са две последователни команди и между тях няма друг код, както и преди и след тях, който да изпраща текст към браузъра. Въпреки всичко ми излиза грешка, че не може да модифицира хедърите, защото те вече били изпратени от реда с setcookie().

Как да излеза от положението?

<?php

header("Pragma: no-cache");

header('Location: http://www.example.com/');

setcookie('AA','1',0,'/');

setcookie('BB','2',time() + 24 * 3600,'/');

?>

  • Автор

За съжаление и така не става!

Ето го кода на страницата с грешката:

<?php


$user = trim($_POST["user"]);

$pass = trim($_POST["pass"]);


if (empty($user) or empty($pass))

{

  exit;

}

else

{

  $db = mysql_connect('localhost','X','Y');

  if (!$db) exit;

  $sel = mysql_select_db('Z',$db);

  if (!$sel) exit;

  $sql = sprintf("SELECT username,password,realname FROM Users WHERE username='%s' AND password='%s'",

  mysql_real_escape_string($user),mysql_real_escape_string($pass));

  $res = mysql_query($sql,$db);

  if (!$res) exit;

  if ((mysql_num_rows($res) == 0) or (mysql_num_rows($res) > 1)) exit;

  mysql_free_result($res);


  header("Pragma: no-cache");

  header("Location: chat.php");


  if (!setcookie('Chat220',$user) or !setcookie('Chat316',$pass)) exit;

}


?>
Грешката е следната:
Warning: Cannot modify header information - headers already sent by (output started at /home/web.php:1) in /home/web.php on line 23

ако беше изчел за бизквитки и хедъри, щеше да разбереш, че винаги се изпращат в началото, а не да си правиш проверки на базата и потребители по кретенски начин и след това бизквитки и т.н. и в кой ред прочиташ дали има валидна бизквитка вече при клиента?

p.s: ако не греша в php то също съществува условието or die (err. message) ?!

за да не правиш тъпи проверки за броя на редовете, които ти връща заявката ползвай LIMIT 1 към SELECT, да не говорим, че с тоя exit който си наблъскал, после няма как да си debug-неш къде ти прекъсва скрипта и защо, а ще се пулиш.. по - добре постави едно кадърно написано съобщение, че няма такъв потребител или нещо друго от рода..

Редактирано от sanddaemon (преглед на промените)

  • Автор

В документацията на PHP се казва, че изпращането трябва да става преди изпращането на съдържание към браузъра, а не задължително в началото. Може да се използва буфериране на изхода, което обаче при мен не помогна.

Въпроса ми беше как да реша този проблем, а не как да си подобра кода. Ако някой има идея нека я сподели!

В документацията на PHP се казва, че изпращането трябва да става преди изпращането на съдържание към браузъра, а не задължително в началото. Може да се използва буфериране на изхода, което обаче при мен не помогна.

Въпроса ми беше как да реша този проблем, а не как да си подобра кода. Ако някой има идея нека я сподели!

ако скрипта, който си постнал е include-нат в друг скрипт, вече си изпратил съдържание към browser-a

  • Автор

Проблема все още си е налице!

PHP файла е зададен да е действието на една форма с две полета и два бутона, метода е POST. Ето така:

<form method="post" action="web.php">

ето и самия WEB.PHP файл

<?php

$user = trim($_POST["user"]);

$pass = trim($_POST["pass"]);

if (empty($user) or empty($pass)) exit('1');

else

{

$db = mysql_connect('localhost','X','Y');

if (!$db) exit('2');

$sel = mysql_select_db('Z',$db);

if (!$sel) exit('3');

$sql = sprintf("SELECT username,password,realname FROM Users WHERE username='%s' AND password='%s' LIMIT 1",

mysql_real_escape_string($user),mysql_real_escape_string($pass));

$res = mysql_query($sql,$db);

if (!$res) exit('4');

if (mysql_num_rows($res) === 0) exit('5');

mysql_free_result($res);

header("Set-Cookie: Chat220=$user");

header("Set-Cookie: Chat316=$pass");

header("Location: chat.php");

}

?>

Има само PHP код и никъде няма интервали или празни редове. Единствената гряшка която дава е на трите реда с header функцията, че вече били изпратени от първия ред на същия скрипт. Никъде не виждам цифра в случай, че има друга грешка, значи всичко друго е наред!!!

Редактирано от supervas (преглед на промените)

Забрани на всички mysql функции да ти генерират изход (използвай @).

Моят съвет е да минеш на сесии вместо бисквитки. Освен значително по-сигурни, сесиите са и много по-удобни.

  • Автор

Няма никакво подобрение и след като добавих @ пред всички MySQL функции.

Явно проблема е някъде другаде, но къде нямам представа!

Ще пробвам и със сесии, но дори и така пренасочването с header пак ще е проблемно.

Няма никакво подобрение и след като добавих @ пред всички MySQL функции.

Явно проблема е някъде другаде, но къде нямам представа!

Ще пробвам и със сесии, но дори и така пренасочването с header пак ще е проблемно.

Можеш ли да отвориш PHP файла в шестнадесетичен редактор ?

Ако преди символа < от <?php има някакъв друг код - това е проблема.

  • Автор

Отворих файла в 16-тичен изглед и наистина имаше 3 символа преди <. Символите са: EF BB BF. Файла е с UTF-8 кодиране и това е нормално.

Означава ли това обаче, че PHP в този случай не може да чете файлове използващи други кодови таблици освен ANSI?

  • Автор

След като запазих всички файлове в ANSI кодова таблица, всичко тръгна както очаквах.

Сега идва момента да се подбри PHP кода от към сигурност и бързодействие.

Отворих файла в 16-тичен изглед и наистина имаше 3 символа преди <. Символите са: EF BB BF. Файла е с UTF-8 кодиране и това е нормално.

Означава ли това обаче, че PHP в този случай не може да чете файлове използващи други кодови таблици освен ANSI?

Не. Означава, че като записваш РНР файлове в utf-8 трябва да ги записваш без BOM (въпросните три байта).

Регистрирайте се или влезете в профила си за да коментирате

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.