【问题标题】:Setting Cookies AJAX/PHP设置 Cookie AJAX/PHP
【发布时间】:2013-03-31 15:12:39
【问题描述】:

我有一个 AJAX 登录系统 - 所有表单数据都使用 PHP 进行验证,如果用户名和密码匹配,它会设置某些 cookie。

我知道 cookie 需要在其他任何东西之前设置,但我使用的模型怎么可能做到这一点。我想保持整个登录不刷新。

我收到错误: “无法修改标头信息 - 标头已由.....发送”

有人有什么建议吗?

谢谢

编辑:使用 IF 语句验证表单,然后如果满足条件,则在其中设置 cookie

代码:全部

<?php
session_start(); 
include "connect.php";
if ($_POST) {   
    $loginuser = mysql_escape_string($_POST['loginuser']);
    $loginpass = mysql_escape_string($_POST['loginpass']);
    $rememberme = mysql_escape_string($_POST['rememberme']);

    if ($rememberme = 1) {
        $time = time()+60*60*24*365;
    } else {
        $time = time()+3600;
    }

    $salt = changedsalt";
    $hashed_password = sha1($loginpass).sha1($salt);

    $getUser_sql = "SELECT * FROM acts WHERE username = '$loginuser' AND hashed_password = '$hashed_password'";
    $getUser = mysql_query($getUser_sql);
    $getUser_RecordCount = mysql_num_rows($getUser);        

    if($getUser_RecordCount == 1) {
        $rowLogin = mysql_fetch_array($getUser);
        $user_id = $rowLogin['id'];
        $emailad = $rowLogin['email'];
        $activated = $rowLogin['activated'];            
        if ($activated == 1) {
            $hash = "changedthistoo";
            $randstring = rand(5, 10);
            $code = sha1($hash . $randstring);
            mysql_query("UPDATE `acts` SET `key` = '$code' WHERE `id` = '$user_id' AND `email` = '$emailad'");
            setcookie('AHkey', $code, $time, '/');
            setcookie('AHid', $user_id, $time,  '/');
            setcookie('AHem', $emailad, $time, '/');
            setcookie('AHty', 'acts', $time, '/');
            setcookie('AHtr', 1, time()+3600, '/');
            $data['success'] = true;
            $data['message'] = "Act Login - Activated";
            $data['message'] = $code;
            echo json_encode($data);
            exit;               
        } else {
            $data['success'] = false;
            $data['message'] = "Act Login - Not Activated";
            echo json_encode($data);
            exit;
        }       
    } elseif ($getUser_RecordCount == 0) {
        $getUser_sqlp = "SELECT * FROM promoter WHERE username = '$loginuser' AND hashed_password = '$hashed_password'";
        $getUserp = mysql_query($getUser_sqlp);
        $getUser_RecordCountp = mysql_num_rows($getUserp);
        $rowLogin = mysql_fetch_array($getUserp);
        $user_id = $rowLogin['id'];
        $emailad = $rowLogin['email'];
        $activated = $rowLogin['activated'];
        if($getUser_RecordCountp == 1) {
            if ($activated == 1) {
                //generate random string
                $hash = "49ebva09afbh";
                $randstring = rand(5, 10);
                $code = sha1($hash . $randstring);
                mysql_query("UPDATE `promter` SET `key` = '$code' WHERE `id` = '$user_id' AND `email` = '$emailad'");
                setcookie('AHkey', $code, $time, '/');
                setcookie('AHid', $user_id, $time, '/');
                setcookie('AHem', $emailad, $time, '/');
                setcookie('AHty', 'promoter', $time, '/');
                setcookie('AHtr', 1, time()+3600, '/');
                $data['success'] = true;
                $data['message'] = "Act Login - Activated";
                $data['message'] = $code;
                echo json_encode($data);
                exit;                           
            } else {
                $data['success'] = false;
                $data['message'] = "Promoter Login - Not Activated";
                echo json_encode($data);
                exit;
            }
        } else {
            $data['success'] = false;
            $data['message'] = "Wrong Username or Password";
        }       
    }   
    echo json_encode($data);
}
?>

【问题讨论】:

  • 向我们展示代码。没有它,我们无法为您提供帮助!
  • 两秒 - 现在将添加它
  • header()函数之前不能发送任何内容。
  • 我已经添加了由 AJAX 运行的代码 - 我知道我不能在标头之前执行此操作,但我只是不知道如何执行此操作,例如如何执行此操作以我喜欢的方式工作,或者就此而言,如果它甚至可能的话。编辑:请原谅废话代码,我正在更改它,但想先解决这些错误
  • 您使用的是an obsolete database API,应该使用modern replacement。

标签: php ajax cookies login


【解决方案1】:

请在重定向前使用ob_start();header();

在使用header() 之前,不应有任何输出到屏幕。 更多使用 ob_start 请通过http://php.net/manual/en/function.ob-start.php

【讨论】:

    【解决方案2】:

    您可以将 session_start() 保留在顶部的主索引页面中。然后使用 Ajax 将数据发送到这个 url 或页面。

    【讨论】:

    • 那么我还要在这个 PHP 中设置 cookie 吗? (使用 AJAX 调用)还是我必须做其他事情?
    • 如果你使用 ajax,你不能设置 cookie。您应该以 json 格式返回数据并使用 js 在客户端设置 cookie。当您在会话已经开始时尝试开始会话时,通常会出现已发送的标头。您可以使用if(!headers_sent())session_start(); 进行检查。如果您在使用 js 制作 cookie 方面需要帮助,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多