2013-12-01 4 views
9

Я сделал логин, который устанавливает куки со значением вмененных адресов электронной почты, так и в файле global.php, он хранит массив данных пользователей с помощью:PHP - setcookie(); не работает

$email = $_COOKIE["PeopleHub"]; 
$getuserdata = mysqli_query($con, "SELECT * FROM Earth WHERE email='$email'"); 
$userdata = mysqli_fetch_array($getuserdata, MYSQLI_ASSOC); 

cookie не устанавливается, я знаю это, потому что я сделал тестовый файл:

echo $_COOKIE["PeopleHub"]; 

Он просто сделал пустую страницу.

Войти код (где установлен печенье):

<?php 
include "global.php";  
?> 
<h2>Login</h2> 
<?php 
    echo "We currently have <b>" . $usercount . "</b> members, <b>" . $onlinecount . "</b> of which are online. "; 
?> 
<br> 
<br> 
<?php 
    if(isset($_POST["email"])){ 
     $email = $_POST["email"]; 
     $password = sha1($_POST["password"]); 
     $check = mysqli_query($con, "SELECT * FROM Earth WHERE `email`='$email' AND `password`='$password'"); 
     $check = mysqli_num_rows($check); 
     if($check == 1){ 
     setcookie("PeopleHub", $email, 0, '/'); 
     echo "We logged you in!"; 
     } 
     else { 
      echo "We couldn't log you in!"; 
     } 
    } 
?> 
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post"> 
    Email <input name="email" placeholder="Email Address" required="" type="text"><br> 
    Password <input name="password" placeholder="Password" required="" type="password"><br> 
    <input type="reset" value="Start Over"> 
    <input type="submit" value="Login"> 
</form> 

ответ

31

Вы должны установить куки перед тем любые заголовки отосланных.

От the manual:

SetCookie() определяет куки для отправки вместе с остальными заголовками HTTP. Как и другие заголовки, файлы cookie должны быть отправлены до выхода из вашего скрипта (это ограничение протокола). Это требует, чтобы вы отправляли вызовы этой функции до любого вывода, включая и теги, а также любые пробелы.

Это значит, что вам нужно будет изучить output buffering, если вы хотите использовать этот код как есть.

<?php 

ob_start(); 
echo "Hello\n"; 

setcookie("cookiename", "cookiedata"); 

ob_end_flush(); 

?> 

В зависимости от содержания global.php, это мощь работа для вас. Все, что я сделал, это удалить любой вывод до того, как вызывается setcookie(). При global.php содержит каких-либо пробелов или HTML вывод в него это не будет работать:

<?php 
include "global.php";  

    if(isset($_POST["email"])){ 
     $email = $_POST["email"]; 
     $password = sha1($_POST["password"]); 
     $check = mysqli_query($con, "SELECT * FROM Earth WHERE `email`='$email' AND `password`='$password'"); 
     $check = mysqli_num_rows($check); 
     if($check == 1){ 
     setcookie("PeopleHub", $email, 0, '/'); 
     echo "We logged you in!"; 
     } 
     else { 
      echo "We couldn't log you in!"; 
     } 
    } 
?> 
<h2>Login</h2> 
<?php 
    echo "We currently have <b>" . $usercount . "</b> members, <b>" . $onlinecount . "</b> of which are online. "; 
?> 
<br> 
<br> 
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post"> 
    Email <input name="email" placeholder="Email Address" required="" type="text"><br> 
    Password <input name="password" placeholder="Password" required="" type="password"><br> 
    <input type="reset" value="Start Over"> 
    <input type="submit" value="Login"> 
</form> 
+1

Итак, мне нужно поставить ob_start(); в начале кода? – user2999920

+0

Нажмите на ссылку буферизации вывода, которую я вам дал. Существует пример, который на самом деле использует setcookie(). –

+0

Будет ли это работать, если я положил ob_start(); в верхней части глобального файла? – user2999920

5

Просто хотелось бы отметить, у меня была проблема с SetCookie не работает. Когда я исследовал файл дальше, он был закодирован как UTF-8 с спецификацией. Когда я перекодировал его как UTF-8 без спецификации, setcookie работал нормально, поэтому спецификация была написана до того, как был встречен мой первый тег php. Я думаю, что включение буферизации в файл php.ini, вероятно, также исправит это.

Возможно, кто-то может найти эту информацию полезной.

+0

Вот что вы получаете за использование Notepad ++! :) – Christian

+0

Спасибо, Роберт! Но Notepad ++ по умолчанию использует UTF-8 без спецификации ... Что вы получаете, Кристиан? Я думаю, что Visual Studio Express добавила спецификацию в моем случае. – Nicolas

+0

Да, Notepad ++ обычно по умолчанию использует UTF-8 без спецификации. Однако, если вы или кто-то, с кем работаете, использовали какой-то другой инструмент, легко получить файл, который выглядит нормально, но PHP отправит спецификацию и сломает файл cookie. Например, я работаю в гетерогенной среде, а некоторые IDE по умолчанию используют UTF-8 с спецификацией. – Robert

1

У меня была другая проблема с обновлением файлов cookie с использованием функции setcookie.

Итак, я установил строку cookie из массива, используя функцию сериализации php. С этого момента я не смог обновить этот файл cookie - функция setcookie просто не работала, поскольку устанавливала сериализованную строку или любую другую простую строку.

Затем я установил еще один файл cookie с новым ключом cookie, на этот раз данные были закодированы с помощью функции json_encode. На этот раз я смог установить cookie и обновить его :-)

1

У меня была такая же проблема, и выяснилось, что она была вызвана тем, что домен, который я передавал функции, имел пользовательский порт (который не разрешен).

Смежные вопросы