2010-08-07 2 views
10

Je valide un formulaire de connexion avec l'appel jQuery AJAX à PHP. En php, je crée une session et si elles cochent la case "Mémoriser moi", je veux créer un cookie. Voici le code php:Définition d'un cookie dans une requête AJAX?

<?php 

include '../includes/connection.php'; 
date_default_timezone_set('GMT'); 

$name = $_POST['username']; 
$pass = $_POST['password']; 


$query = mysql_query("SELECT id, username, password FROM users WHERE username = '$name' LIMIT 1"); 

if(mysql_num_rows($query) == 0) { 
echo 'error'; 
exit; 
} 

while($row = mysql_fetch_array($query)) { 

if($row['username'] == $name && $row['password'] == $pass) { 

    session_start(); 
    $_SESSION['username'] = $row['username']; 
    $_SESSION['usrID'] = $row['id']; 
    echo 'success'; 


    if($_POST['remember']) { 
    setcookie('username', $row['username'], $exp); 
    setcookie('password', $row['password'], $exp); 
    setcookie('usrID', $row['id'], $exp); 
    } 

} else { 
    echo 'error'; 
    exit; 
} 



} 


?> 

La session est définie avec succès, mais le cookie n'est pas défini du tout. J'ai essayé de régler toutes les valeurs (domaine, chemin, etc.) mais cela n'a rien changé. Y a-t-il quelque chose d'évident qui me manque?

+0

D'où vient la variable '$ exp'? – Sarfraz

+0

désolé, c'était juste une faute de frappe, $ exp est défini plus tôt que la date d'expiration (2 mois) – williamg

+4

oooooh, je ne pense pas que vous voulez définir le mot de passe dans le cookie, même si son md5'ed. L'ID de session est beaucoup mieux – CpILL

Répondre

14

Voici quelques suggestions:

  • Assurez-vous que vous spécifiez le format d'expiration correcte de la date
  • Lors de la configuration d'un cookie sur une page qui redirige, le cookie doit être réglé après l'appel à header('Location: ....'); par exemple:

    header('Location: http://www.example.com/'); setcookie('asite', $site, time()+60*60, '/', 'site.com');

  • Si vous avez urls humain comme www.domain.com/path1/path2/, e fr vous devez définir le chemin d'accès cookie à/pour travailler pour tous les chemins, pas seulement celui en cours.

    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');

le dernier avis / dans les arguments.

De manuel PHP:

Le chemin sur le serveur dans lequel le cookie sera disponible sur. S'il est défini sur '/', le cookie sera disponible dans l'ensemble du domaine. S'il est défini sur '/ foo /', le cookie sera disponible uniquement dans le répertoire/foo/ et tous les sous-répertoires tels que /foo/bar/de domaine. La valeur par défaut valeur est le répertoire courant que le cookie est situé dans.

  • setcookie() définit un cookie à envoyer en même temps que 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, ce qui signifie qu'il ne devrait pas y avoir d'instructions html/code echo avant cela.
+0

Génial! Je faisais une déclaration d'écho avant, j'ai changé ça, et tout a fonctionné, sauf que lorsque j'essaie de faire le chemin vers la racine ('/') ça ne met pas les cookies ... est-ce que je fais quelque chose de mal? – williamg

+0

@iMaster: vous êtes les bienvenus :) – Sarfraz

+0

Découvrez la dernière partie de mon commentaire, je viens de l'éditer. – williamg

-12

Vous ne pourrez pas définir le cookie côté serveur lors de l'utilisation d'un appel AJAX. Au lieu de cela, attendez jusqu'à ce que vous obteniez une réponse réussie et définissez le côté de client de cookie. Pour le rendre plus facile, vous pouvez use a jQuery plugin.

+14

Je suis désolé, mais pourquoi est-il impossible de configurer cookie en utilisant Ajax appel? L'appel Ajax est une requête http régulière avec ses propres en-têtes de requête et de réponse. Nous sommes en mesure de mettre toute information dans l'en-tête respose, y compris les cookies. N'ai-je pas raison? – Kirzilla

+1

http://stackoverflow.com/questions/3340797/can-an-ajax-response-set-a-cookie – Ryan

+0

Pourquoi dans le monde est-ce que 5 personnes ont voté pour cela? Il est carrément faux de dire que vous ne pouvez pas renvoyer un en-tête set-cookie à partir d'un appel AJAX ou que les navigateurs ne les honorent pas, et le fait de parler de "réglage du cookie côté serveur" semble indiquer une confusion HTTP fonctionne. –

Questions connexes