Я сделал логин, который устанавливает cookie со значением вмененного адреса электронной почты, поэтому в файле global.php он хранит массив данных пользователей, используя:
$email = $_COOKIE["PeopleHub"]; $getuserdata = mysqli_query($con, "SELECT * FROM Earth WHERE email='$email'"); $userdata = mysqli_fetch_array($getuserdata, MYSQLI_ASSOC);
Печенье не устанавливается, я знаю это, потому что я сделал тестовый файл:
echo $_COOKIE["PeopleHub"];
Он просто сделал пустую страницу.
Код входа (где установлен файл cookie):
<?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>
Вы должны установить файлы cookie перед отправкой любых заголовков.
Из руководства :
setcookie () определяет cookie для отправки вместе с остальными HTTP-заголовками. Как и другие заголовки, файлы cookie должны быть отправлены до выхода из вашего скрипта (это ограничение протокола). Это требует, чтобы вы отправляли вызовы этой функции до любого вывода, включая и теги, а также любые пробелы.
Это означает, что вам нужно будет искать буферизацию вывода, если вы хотите использовать этот код как есть.
<?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>
Просто хотел указать, у меня была проблема с setcookie, которая не работает. Когда я исследовал файл дальше, он был закодирован как UTF-8 с спецификацией. Когда я перекодировал его как UTF-8 без спецификации, setcookie работал нормально, поэтому спецификация была написана до того, как был встречен мой первый тег php. Я думаю, что включение буферизации в файл php.ini, вероятно, также исправит это.
Кто-то может в конечном итоге найти эту информацию полезной.
У меня была другая проблема с обновлением cookie с использованием функции setcookie.
Поэтому я установил строку cookie из массива, используя функцию сериализации php. С этого момента я не смог обновить этот файл cookie – функция setcookie просто не работала, поскольку устанавливала сериализованную строку или любую другую простую строку.
Затем я установил еще один файл cookie с новым ключом cookie, на этот раз данные были закодированы с помощью функции json_encode. На этот раз я смог установить cookie и обновить его 🙂
У меня была такая же проблема, и выяснилось, что она вызвана тем, что домен, который я передавал функции, имел собственный порт (который не разрешен).