2013-08-22 60 views
1

這是否是正確的方式來循環API發送的$ POST數據,並從中創建一個等價的$ SESSION名稱/值對?

foreach($_POST as $key=>$value) 
{ $_SESSION['$key']=$value; } 

UPDATE:首先,感謝固體反應 - 我想我需要解釋一下,我努力克服,爲什麼這種功能正被考慮的問題。 $ _POST響應來自付款處理器網關 - 問題是由於付款表單/處理不在我們的域名上,所以付款的結果(批准/拒絕等)正在通過$ POST被RELAYED到我們的服務器 - 當我們的PHP代碼嘗試處理響應數據時,它會查找各種PHP結構(如php include'file.php'),而不是我們的域名和錯誤 - 我需要將$ POST數據移入會話,然後將該人員移回我們的域名,以便文件/目錄/資源樹是正確的。這是有道理的,我遇到什麼?

+3

你需要從周圍'$ key'刪除單引號。 –

+0

@MarcB感謝馬克,但那不會是我們所需要的,我們已經存儲了會話變量,我們需要保留這些變量。 Jasons回答 – DMSJax

回答

5

不要使用單引號:

foreach ($_POST as $key => $value) { 
    $_SESSION[$key] = $value; 
} 

我會鼓勵你閱讀有關Strings in PHP

備註:由於以下幾個原因,這可能是不安全的 - 主要是由關鍵碰撞造成的注入。考慮我是否發佈登錄的用戶ID。

這可以通過封裝方法來緩解:

$_SESSION['posted_data'] = $_POST; 
+3

爲了安全考慮,請參閱我的評論,您應該始終清理/仔細檢查外部數據源中的數據。 – Technoh

1

不要你,而要保持他們分開嗎?

$_SESSION['response'] = $_POST; 
0

忽視的安全問題,這可能會導致取決於你如何使用它,你可以做的是使用:

$_SESSION = array_merge($_POST, $_SESSION); 

這將只在有沒有發現一個關鍵POST變量帶來$ _SESSION。如果您希望POST vars優先考慮,請切換它們。

只是關於安全性的一個快速提示,如果像很多人使用會話來存儲用戶ID,如果我發送POST請求到腳本userid=1會發生什麼?

我要說的是,小心你在做什麼。如果可能,按照建議操作並在$ _SESSION中使用唯一密鑰,如$_SESSION['post_vars'] = $_POST(或者['form_data'],如果您使用它來保留表單數據,這通常是人們這樣做的原因),則會更好。在$_SESSION足夠的範圍覆蓋項目已經 -

1

如果你真的要做到這一點,你的狀態,你可以使用類似

$_SESSION=array_merge($_SESSION,$_POST); 

這會工作,但成爲「壞事」變量:

的index.php:

<form action="2.php" method="post"> 
<input type="text" name="hidden" value="hidden"> 
<button type="submit">Click</button> 
</form> 

2。PHP:

<?php 
session_start(); 
session_unset(); 
$_SESSION['hidden']="existing"; 
$_SESSION=array_merge($_SESSION,$_POST); 

echo '<pre>'.print_r($_SESSION,true).'</pre>'; 

更好的辦法是使用

$_SESSION['POST']=$_POST; 

顯然,在此之前執行任何你需要的數據檢查,雖然

0

您也可以使用array union operator

$_SESSION = $_POST + $_SESSION; 

這需要$_POST的值並將這些值添加到$_SESSION其鑰匙不在$_POST中。

0

由於POST是由支付網關做,該會議將與它相關的(最有可能在第一次請求丟失,因爲它可以假設它永遠不會打擾閱讀會話cookie)。

你的客戶永遠不會看到他們的會話此數據。

如果你想有這樣的數據可用,你需要以某種方式繼續存在吧,如果支付網關爲您提供了可利用的客戶信息。可能的解決方案是一個數據庫,鍵/值存儲...

或者,是很常見的支付網關將允許您指定一個鏈接到客戶端瀏覽器重定向到購買後。從POST獲取參數後,您可以將它們附加到重定向網址,將它們作爲GET參數傳遞迴您的網站。

+0

我確實認爲這是因爲他們使用的是authorize.net模擬器 - 但它似乎在那裏「模擬」不完全正確,因爲一些有效的authorize.net API字段被忽略。包括鏈接選項。不過謝謝 – DMSJax