2011-03-18 102 views
1

我目前正在建設一個CMS和我在使用PHP會話的問題:

  • 任何地方在我的網站的用戶可以通過添加查詢字符串URL啓動CMS - >模? =管理
  • ?MOD =管理員會重定向到的login.php
  • 認證後,我想將用戶重定向到頁面,他從CMS功能來啓用

對於我保存當前頁面的URL中會議之前用戶去的login.php

url.class.php腳本

function curPageURL() { 
session_start(); 
$pageURL = 'http'; 
if ($_SERVER["SERVER_PORT"] != "80") { 
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["PHP_SELF"]; 
} else { 
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["PHP_SELF"]; 
} 
$_SESSION['url'] = $pageURL; 
} 

的login.php腳本: 如果驗證成功我啓動一個會話,並嘗試用戶重定向到他來自網頁:

if($num_rows == 1){ 
    session_start(); 
    $_SESSION['username']; 
    header('Location: ' . $_SESSION['url']); 
} 

我得到一個「會話已經開始」的錯誤。
但是,如果我重定向到特定頁面(例如主頁),那麼一切工作正常。例如: - > header('Location:index.php');

+4

真正的問題在哪裏? – knittl 2011-03-18 11:32:08

+0

和'$ _SESSION ['username'];''應該做的? – hcb 2011-03-18 11:33:07

+0

如果$ _SESSION ['用戶名']存在,那麼我知道用戶登錄 – Greg 2011-03-18 11:34:31

回答

1

你不能只使用$ _SERVER ['HTTP_REFERER']重定向到上一頁嗎?

當您嘗試在當前狀態下運行腳本時會發生什麼?

+0

我收到「A session has been started」錯誤。 – Greg 2011-03-18 12:18:05

+0

那麼你有機會在你的代碼的其他地方聲明session_start(),並且這已經在聲明之前執行了。註釋掉session_start()並查看會發生什麼。還有人提到$ _SESSION ['username']需要包含在if語句中以實際執行某些操作。 – 2011-03-18 12:22:08

+0

http_referer並不總是可用,並且可能不是用戶來自的頁面。它是用戶提供的數據,可以包含字面上的任何內容。 – 2011-03-18 14:29:47

0

在url.class.php中,您是否已經開始會話?您的問題可能是您尚未開始會話,因此沒有會​​話數據可以存儲。

在你的url.class.php中,嘗試檢查會話變量是否保存你想要的值。

+0

我修改了我的帖子 - 是的,我在url.class.php開始了會話 - 這就是爲什麼我在執行時遇到錯誤 - > header('Location:'。$ _SESSION ['url']); – Greg 2011-03-18 13:28:02

0

任何地方在我的網站用戶可以啓動CMS

我假設你的意思是,該網站通過CMS實現,用戶可以通過附加在任何階段獲得提升的權限/附加功能到查詢字符串。

商店當前頁面的URL中的會話

Erk的。

這不是存儲這些信息在正確的地方 - 它應該通過網址(或通過POST - 但是這不會跨越重定向工作):

session_start(); 
if (!is_auth_for_cms() && $_GET['mod']=='admin') { 
    // simplified a bit... 
    $comeback='http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    // rewriting the get trigger avoids short circuit looping problems 
    $comeback=urlencode(str_replace('mod=admin', 'mod=auth', $comeback)); 
    header("Location: " 'http://' . $_SERVER['HTTP_HOST'] . "/login.php?backto=$comeback"; 
} 

撇開錯別字你代碼,這是什麼問題?

if($num_rows == 1){ 
    session_start(); 
    $_SESSION['username']; 
    header('Location: ' . $_SESSION['url']); 
} 

您認爲第三行有什麼用?

+0

道歉 - 我的問題已被錯誤地刪除。剛編輯我原來的帖子。 – Greg 2011-03-18 12:16:13

1

如果這是你得到的錯誤,那麼你需要檢查,看看你是否已經開始在其他地方的會議。在這種情況下,您需要輸入:

if(!isset($_SESSION)){ 
    session_start(); 
} 

代替您放置普通session_start()的位置。

+0

這實際上可能是解決方案(不幸的是我現在不能做測試)。每個頁面都包含url.class.php,所以會話已經開始。 – Greg 2011-03-18 15:54:45

+1

好,我以前曾經有過同樣的問題。每個頁面只能創建一次會話。我希望它對你有用。 – Steve 2011-03-19 10:35:04