2012-01-28 11 views
1

ショート

私は、すべてが正しいことを確認します。サインイン成功後にリダイレクトする適切な方法

header('Location:'.wsurl.'me.php');

前に、デバッグのためにAsigningは

しかし、ブラウザウィンドウ上の

この画面

http://img849.imageshack.us/img849/9861/c6949d6ea7ba47909d2cc37.png

を取得したURL

$redirect=wsurl.'me.php';

とNetBeansを示し、右のURLアドレスを生成しました

URLにリダイレクトされません。それはどこにでもあります。

質問

リダイレクトを防止するものは何ですか?ここで

詳細

signinメソッドの完全なコードです

public function signin() { 
     if ($this->validation->check()) { 
      foreach ($_POST as $k => $v) 
       $$k = $v; 

      $stmt = $this->db->prepare(" 
    SELECT u.id, u.fname, u.lname, u.mname, u.type, u.email, u.salt, 
      u.pass, u.salt,  u.approved, u.ban,  u2.status 
    FROM `users` AS u 
     LEFT OUTER JOIN `log` AS u2 
      ON u2.user_id = u.id 
    WHERE u.email = ? LIMIT 1") or die($this->db->error); 

      $stmt->bind_param("s", $email) or die($stmt->error); 
      $stmt->execute() or die($stmt->error); 
      $stmt->store_result(); 
      $ip = ip2long($ip); 
      if ($stmt->num_rows > 0) { 
       $stmt->bind_result($id, $fname, $lname, $mname, $type, $email, $salt, $db_pass, $salt, $approved, $ban, $status) or die($stmt->error); 
       $stmt->fetch() or die($stmt->error); 
       $stmt->close(); 
       if ($status != 1) { 
        if ($approved == 1) { 
         if ($ban == 0) { 
          $hash = hash('sha256', $salt . hash('sha256', trim($pass))); 
          if ($hash == $db_pass) { 
           $token = sha1(microtime(true) . mt_rand(10000, 90000)); 
           if (isset($remember) && $remember == "on") { 

            $timeout = time() + 60 * 60 * 24 * COOKIE_TIME_OUT; 

            $stmt = $this->db->prepare("INSERT INTO `log` (`user_id`,`ip`, `token`, `timeout`, `status`,`signin_dt`) VALUES (?,?,?,?,1,NOW())") or die($db->error); 
            $stmt->bind_param("iiiii", $id, $ip, $token, $timeout) or die($stmt->error); 
            setcookie('auth', "$token", $timeout); 
           } else { 
            $stmt = $this->db->prepare("INSERT INTO `log` (`user_id`,`ip`, `status`,`signin_dt`) VALUES (?,?,1,NOW())") or die($db->error); 
            $stmt->bind_param("ii", $id, $ip) or die($stmt->error); 
            session_start(); 
            session_regenerate_id(true); //this is a security measure 
            $_SESSION['user_id'] = $id; 
            $_SESSION['token'] = $token; 
            $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 
            $_SESSION['remote_ip'] = $_SERVER['REMOTE_ADDR']; 
           } 
           $stmt->execute() or die($stmt->error); 
           $stmt->close();          
           $redirect=wsurl.'me.php'; 
           header('Location: '.$redirect); die; 
          } else { 
           die($this->ajax->respond(3)); 
          } 
         } else { 
          die($this->ajax->respond(4)); 
         } 
        } else { 
         die($this->ajax->respond(5)); 
        } 
       } else { 
        die($this->ajax->respond(6)); 
       } 
      } else { 

       die($this->ajax->respond(7)); 
      } 
     } 
    } 
+0

定数 'wsurl'とは何ですか? –

+0

他の出力の前に 'header'を実行していることを確認してください...' $ this-> ajax-> respond(2); 'は何らかの出力をしています(そのような音です) – Pheonix

+0

@Pheonixはいこの行は出力しています。削除されました。同じこと。失敗。 –

答えて

0

ajax_respond()がブラウザに出力を送信する場合、あなたはheader()呼び出しで、出力は既に送られてきただろうということにすることはできません。 AJAXレスポンスの後には通常リダイレクトはありません。クライアントブラウザはページをリロードすることを意図していないためです。代わりにAJAXレスポンスがページ内で処理され、リダイレクトは行われません。

+0

はい出力を行っているajax_respond()行。削除されました。同じこと。成功しません –

2

ホリーガカモール!それはです。 if-statements!

if文がたくさんあるとCyclomatic Complexityが増えますが、これは非常に悪いことです。 40年にわたり、数多くの長距離調査では、循環的複雑性の高いプロジェクトは、維持管理や拡張には高価すぎるため、事実上常に失敗することが明らかになっています。あなたがゼロからスタートし、代わりに流れを制御するためにreturn文と例外を使用する方法についてhttp://en.wikipedia.org/wiki/Cyclomatic_complexity


を参照してください? は、ユニットのテストが実質的に容易で、エラーが発生しにくく、はるかに美しく、すぐに理解しやすくなります。ここで

は、私は自分のコードで使用するものです。そして、

class UserController 
{ 
    public function login() 
    { 
     $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); 
     $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); 

     $status = $this->userManager->validatePassword($password); 
     if ($status == UserManager::LOGGED_IN) 
     { 
      $this->createUserSession(); 
     } 
    } 
} 

Iこれがあります。

class SecurityController 
{ 
    const NOT_LOGGED_IN = 501; 

    public function ensureHasAccess() 
    { 
     if ($this->isLoggedIn() === false) 
     { 
      throw new RuntimeException('User is not logged in', self::NOT_LOGGED_IN); 
     } 
    } 
} 

だから、すべてあなたが上で必ずログインしているユーザー実行されているものを作るためにしなければなりませんページはこのようになります:

$guard = new SecurityController; 
$guard->ensureHasAccess(); 

THEN、最後にweb/index。私も人にもののこの種を教えるためにデモアプリケーションを作成しました

try 
{ 
    // DO web stuff here. 
} 
catch (RuntimeException $e) 
{ 
    if ($e->getCode() == SecurityController::NOT_LOGGED_IN) 
    { 
     // Oops! The user isn't logged in... Redirect!! 
     header('Location: http://' . $_SERVER['HTTP_HOST'] . '/user_directory/?errmsg=not+logged+in'); 
     exit; // Thanks, drrcknlsn! 
    } 
} 

:PHPは、私はこれを持っています。 PHP大学のコードレポの一部:あなたはwsurl . 'me.php'にリダイレクトしていると、ブラウザのみme.phpを要求しようとしている場合http://repo.phpexperts.pro/source/user_directory/files

+1

+1巨大なガカモール! lol –

+0

ステートメントは私の問題とは関係ありません。それはコーディングスタイルであり、これらのステートメントではうまく動作しません。今度は、私の質問に答えてください。 –

+0

ヘッダーのリダイレクトの後で 'exit;'を実行してください。それ以外の場合、現在のページの残りの部分がビルドされ、ヘッダ(セキュリティホール) 。 – FtDRbwLXw6

0

はもちろん、あなたの問題はwsurlがnullであるということです。私は正確にwsurlが何であるかはわかりませんが、それが変数でなければならない場合は、wsurlの代わりに$wsurlでなければなりません。定数の場合は、定義されているファイルがこのファイルに含まれていることを確認してください。それが何であっても、適切なケーシングなどで正しくスペルを確認してください。

実際にPHPエラーログを使用するべきです。何がうまくいかなかったのか、どこで、これが好きなのかを正確に伝えます。

+0

As私は私の記事 'Netbeansが正しいURLアドレスを示していることを示しています.WSURLは前に定義した通りで、私が必要とするものです(ウェブサイトのフルURL)。エラーログ:)) –

+0

Netbeansの言うことは関係ありません。ブラウザが受け取るのは「me.php」だけです。つまり、 'wsurl'はヘッダーに追加される時点で空です。ブラウザは、ヘッダー位置から部分文字列を任意に削除するだけではありません。 ;-) – FtDRbwLXw6

関連する問題