2014-05-16 51 views
0

我傳遞下列變量從查詢通過鏈接:重用會話變量

<a href="middle.php?name=<?php echo $name; ?>&id=<?php echo $id1; ?>&rowid=<?php echo $rowid; ?>&record=<?php echo $record; ?>"> 

的變量被傳遞到這個網頁:

session_start(); 

//$id = ($_GET['id']); 
if (isset($_GET["record"])) { 
    $_SESSION["record"] = $_GET["record"]; 
} 
if (isset($_GET["id"])) { 
    $_SESSION["id"] = $_GET["id"]; 
} 
if (isset($_GET["rowid"])) { 
    $_SESSION["rowid"] = $_GET["rowid"]; 
} 
if (isset($_GET["name"])) { 
    $_SESSION["name"] = $_GET["name"]; 
} 
if (isset($_GET["store"])) { 
    $_SESSION["store"] = $_GET["store"]; 
} 

,然後將用戶重定向到這個頁面,我試圖使用會話變量分配頁面中的變量像這樣:

session_start(); 

$id = $_SESSION[id]; 

$rowid = $_SESSION[rowid]; 

$name = $_SESSION[name]; 

$record = $_SESSION[record]; 

變量不能訪問,因爲我需要它們在這個頁面上。我是否缺少報價?再次使用會話變量的最佳方式是什麼?

FYI他們主要被用在其它查詢中使用這樣的:

"SELECT * FROM mgap_orders WHERE mgap_ska_id = '" . $_SESSION['id'] . "' AND mgap_status = 0 GROUP BY mgap_ska_report_category LIMIT 5"; 
+0

是的,你應該引用數組鍵。 PHP會禮貌地假設你忘記了它們並假裝它們在那裏,但是會發出警告,並且如果你有任何'define()'d同名的常量,就會遇到麻煩。檢查所有您遇到問題的頁面中的'session_id()'。如果ID發生變化,那麼您將遇到會話配置問題,並且每個頁面都將獲得全新/空白會話。 –

+1

當您將變量添加到會話中時,您應該清理/過濾變量,因爲它們是用戶提供的。稍後使用它們會導致sql注入問題。你也應該初始化它們,以便你不必檢查它們是否設置。 – jeroen

+0

另外,我曾遇到過問題,有時PHP在register_globals中設置爲將會話變量註冊爲全局變量。 所以當你做$ _SESSION [「name」] = $ _GET [「name」];名稱'Aaron'或其他名稱將被分配給$ name,然後您不能用$ name = $ _SESSION ['name']覆蓋它; – iMakeWebsites

回答

2

我錯過了報價?

是的。你說你正在訪問他們像這樣:

$id = $_SESSION[id]; 

這應該是這樣的:

$id = $_SESSION['id']; 

但更重要的是,你爲什麼需要在所有在這裏使用會話?您描述情況的方式是:

  1. 用戶使用鏈接中的查詢字符串值發出請求。
  2. 在響應中,您將用戶轉發到其他頁面(推測使用位置標題?)。
  3. 在最後一頁上,這些值需要存在。

如果它們是查詢字符串值,請將它們保留爲重定向中的查詢字符串值。那麼,你可能有這樣的事情:建立原始鏈接的時候

header('Location: somePage.php?name=' . $name'); 

等的值的剩餘部分,就像你做:

header('Location: somePage.php'); 

可以包括值執行重定向的頁面。

另外,雖然您不顯示數據訪問權限,但您確實顯示了您的查詢,這似乎很容易受到SQL注入攻擊。最終,您使用的值來自用戶輸入(查詢字符串),因此您不應將它們直接連接到SQL查詢中。

+0

感謝您的幫助! – DataGuy