0

問題が解決しました-https : //stackoverflow.com/a/14719452/1174295を参照してください

-

(少なくとも)GoogleChromeとSafariで問題が発生しました。

最初のログイン試行では、ユーザーはリダイレクトされません。セッションは作成されますが、ほとんど検出されないかのようになり、ユーザーはインデックスページに戻ります。2回目の試行で、正しいリダイレクトが発行され、ユーザーは正しいページに移動します。

このスクリプトはFirefoxで正常に機能し、正しいデータが返されるかどうかを徹底的に確認しました。私は検索し、検索し、検索しましたが、残念ながら何の役にも立ちませんでした。

Access.php-ユーザーのログイン

<?php
session_start();
ob_start();


include_once('db.class.php');
include_once('register.class.php');
include_once('login.class.php');


$db = null;
$reg = null;
$log = null;


$db = new Database();
$log = new Login($db, null, null, null, null, null, null);


if (isset($_SESSION['login'])) {    
    $log->redirectUser($_SESSION['login']);
}


include_once('includes/header.html');

?>

Some HTML...

<?php
    if (isset($_POST['logsub'])) {
        $db = new Database();
        $log = new Login($db, $_POST['email'], $_POST['pass']);

        $validation = &$log->validate();

        if(empty($validation)) {
            $log->redirectUser($_SESSION['login']);
        } else {
            echo "<div id='error'><div class='box-error'><p style='font-weight: bold'>The following errors occured...</p><ul>";

                for ($i = 0; $i < count($validation); $i++) {
                    echo "<li>" . $log->getErrorMessage($validation[$i]) . "</li>";
                }
            echo "</ul></div></div>";
        }
    }
?>

Login.class.php-ログインクラス

// Validate the credentials given
public function validateLogin() {
    // Hash the plain text password
    $this->hashedPass = $this->hashPassword();

    try {
        $query = $this->dbcon->prepare("SELECT Login_ID, Login_Email, Login_Password FROM Login WHERE Login_Email = :email AND Login_Password = :pass");
        $query->bindParam(':email', $this->email, PDO::PARAM_STR);
        $query->bindParam(':pass', $this->hashedPass, PDO::PARAM_STR);
        $query->execute();

        $fetch = $query->fetch(PDO::FETCH_NUM);
        $this->loginid = $fetch[0];

        // If a match is found, create a session storing the login_id for the user
        if ($query->rowCount() == 1) {
            $_SESSION['login'] = $this->loginid;    
            session_write_close();
        } else {
            return LOG_ERR_NO_MATCH;
        }
    } catch (PDOException $e) {
        $this->dbcon->rollback();
        echo "Error: " . $e->getMessage();
    }
}

// Fetch the customer ID
private function getCustId() {
    try {
        $query = $this->dbcon->prepare("SELECT Customer.Cust_ID FROM Customer JOIN Login ON Customer.Login_ID = Login.Login_ID WHERE Customer.Login_ID = :loginid");
        $query->bindParam(':loginid', $this->loginid, PDO::PARAM_INT);
        $query->execute();

        $fetch = $query->fetch(PDO::FETCH_NUM);     
        return $fetch[0];
    } catch (PDOException $e) {
        $this->dbcon->rollback();
        echo "Error: " . $e->getMessage();
    }
}

// Check the registration progress - are they verified? paid?
// This function is used elsewhere hence the $sessionid argument
public function checkRegistration($sessionid) { 
    $this->loginid = $sessionid;
    $this->custid = $this->getCustId();

    try {
        $queryVer = $this->dbcon->prepare("SELECT Cust_ID FROM Customer_Verify_Email WHERE Cust_ID = :custid");
        $queryVer->bindParam(":custid", $this->custid, PDO::PARAM_INT);
        $queryVer->execute();

        $queryFee = $this->dbcon->prepare("SELECT Cust_ID FROM Initial_Fee_Payment WHERE Cust_ID = :custid");
        $queryFee->bindParam(":custid", $this->custid, PDO::PARAM_INT);
        $queryFee->execute();

        // If a record exists in the verify table, return the value 1. This means the user has not yet verified their email.
        if ($queryVer->rowCount() == 1) {
            return 1;
        } else {
            // If a record does not exist in the payment table, no payment has been made. Return 2.
            if ($queryFee->rowCount() == 0) {
                return 2;
            // Otherwise, email is verified and the payment has been made.
            } else {
                return 0;
            }
        }

    } catch (PDOException $e) {
        $this->dbcon->rollback();
        echo "Error: " . $e->getMessage();
    }
}

// Redirect the user accordingly
public function redirectUser($sessionid) {
    $this->loginid = $sessionid;    
    $logNum = $this->checkRegistration($this->loginid);

    if ($logNum == 0) {
        header("Location: fbedder/details.php", true, 200);
        exit();
    } else if ($logNum == 1) {
        header("Location: fbedder/verification.php", true, 200);
        exit();
    } else if ($logNum == 2) {
        header("Location: fbedder/payment.php", true, 200);
        exit();
    }
}

サイトへのリンクは次のとおりです。fbedder/->クレデンシャルを使用してテストアカウントを設定しました->メール:test @ /パスワード:test123321

繰り返しになりますが、問題はGoogle ChromeとSafari(私のiPhoneにあるSafari)にのみ存在し、純粋にログインの側面にあります。最初の試行では、セッションは無視され(作成されます)、2回目の試行では、ユーザーはリダイレクトされます。

何か案は?私は多くの可能性を試しました...

-編集-

私は問題が今どこにあるかを知っています。

リダイレクトが呼び出されると、ユーザーはdetails.phpページに移動します。ただし、このページには次のコードスニペットが含まれています。

if (!isset($_SESSION['login'])) {
    header("Location: fbedder/index.php");
}

明らかに何が起こっているのかというと、セッションが検出/保存/「何でも」行われておらず、その結果、ユーザーがインデックスページに戻っているということです。$_SESSIONが効果的に失われないようにする方法はありますか。ここに投稿する前にこれについて読んだことがあるので、挿入session_write_close()しましたが、それでは目的の効果が得られないようです。

4

1 に答える 1

0

$ _SESSION変数が事実上失われているという事実の範囲内にある問題を診断した後、私はsession_write_close()関数について読み、このコメントに出くわしました。

2つの異なるセッションIDが同時に実行されていたため、セッションが台無しになりました。

  • domain.comの1つのPHPSESSIDCookie
  • www.domain.comの1つのPHPSESSIDCookie

これはそれを修正しました:

//各ページの冒頭で...

session_set_cookie_params(1800、 "/"、 "domain.com"); session_start();

ソース: http: //pt2.php.net/manual/en/function.session-write-close.php#84925

パラメータを設定すると問題が解決しました。

于 2013-02-06T00:20:28.900 に答える