web-dev-qa-db-fra.com

PHP - setcookie (); ne fonctionne pas

J'ai fait une connexion, qui définit un cookie avec une valeur de l'adresse e-mail imputée, donc dans le fichier global.php, il stocke un tableau des données des utilisateurs en utilisant:

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

Le cookie n'est pas installé, je le sais car j'ai fait un fichier test:

echo $_COOKIE["PeopleHub"];

Il vient de faire une page blanche.

Le code de connexion (où le cookie est installé):

<?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>
13
user2999920

Vous devez définir des cookies avant l'envoi des en-têtes.

De le manuel :

setcookie () définit un cookie à envoyer avec le reste des en-têtes HTTP. Comme les autres en-têtes, les cookies doivent être envoyés avant toute sortie de votre script (il s'agit d'une restriction de protocole). Cela nécessite que vous passiez des appels à cette fonction avant toute sortie, y compris les balises et ainsi que tout espace.

Cela signifie que vous devrez examiner tampon de sortie si vous souhaitez utiliser ce code tel quel.

<?php

ob_start();
echo "Hello\n";

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>

Selon le contenu de global.php, Cela peut fonctionner pour vous. Tout ce que j'ai fait a été de supprimer toute sortie avant d'appeler setcookie(). Si global.php Contient des espaces blancs ou une sortie HTML, cela ne fonctionnera pas:

<?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>
39
John Conde

Je voulais juste souligner que j'avais un problème avec setcookie qui ne fonctionnait pas. Lorsque j'ai approfondi le fichier, il a été codé en UTF-8 avec BOM. Quand je l'ai ré-encodé en UTF-8 sans setcookie BOM, cela a bien fonctionné, donc la BOM était en cours d'écriture avant que ma première balise php ne soit rencontrée. Je suppose que l'activation de la mise en mémoire tampon dans mon fichier php.ini résoudrait probablement cela aussi.

Quelqu'un pourrait éventuellement trouver ces informations utiles.

8
Robert

J'ai eu un autre problème avec la mise à jour des cookies en utilisant la fonction setcookie.

J'ai donc défini une chaîne de cookies faite à partir d'un tableau à l'aide de la fonction de sérialisation php. À partir de maintenant, je ne pouvais pas mettre à jour cette fonction cookie - setcookie ne fonctionnait tout simplement pas, si la configuration de la chaîne sérialisée ou de toute autre chaîne simple était en cours.

Ensuite, j'ai mis un autre cookie avec une nouvelle clé de cookie, cette fois les données ont été encodées avec la fonction json_encode. Cette fois, j'ai pu installer le cookie et le mettre à jour :-)

1
ArturOlszak

J'ai eu le même problème et il s'est avéré que cela était dû au fait que le domaine que je transmettais à la fonction avait un port personnalisé (ce qui n'est pas autorisé).

1
Vahid Amiri