2009-09-07 44 views
0

我正在尋找一個在URL中傳遞的參數列表。URL中的多個變量爲1

$url['key1']=1; 
$url['key2']=2; 
$url['key3']=3; 
$url['key4']=4; 
$url['key5']=5; 
$url['key6']=6; 
$url['key7']=7; 

請注意我想通過這個URL在1 GET變量。我知道這會更好地完成?key1 = 1 & key2 = 2 & key3 = 3 ...等,但由於太複雜的原因試圖解釋他們不能以這種格式。

任何建議如何將此數組轉換爲可以作爲1傳遞的內容在URL字符串中獲取var?

在此先感謝。

+0

您沒有說明這個數據的語義。讓遠程匿名用戶直接操縱$ url可能存在嚴重的安全問題。 – geocar 2009-09-07 15:54:43

回答

3

嘗試http_build_query

$url['key1']=1; 
$url['key2']=2; 
$url['key3']=3; 
$url['key4']=4; 
$url['key5']=5; 
$url['key6']=6; 
$url['key7']=7; 

echo http_build_query($url); 
//echos key1=1&key2=2&key3=3&key... 

它的作用是將一個數組使用鍵查詢字符串和自動處理URL編碼的。

編輯

剛剛看了你的,它應該是隻有一個變量的其他要求。所以不要這個答案。 如果你的問題是正確的編碼,但你可能想再試一次。

希望有所幫助。

+0

你給了我一個想法: 回聲$ NEWURL = http_build_query($網址 「」, 「|」); 它可以給我: 鍵1 = 1 | key2 = 2 | key3 = 3 | key4 = 4 | key5 = 5 | key6 = 6 | key7 = 7 – Lizard 2009-09-07 15:06:02

+0

這不是我說的5分鐘前的內容嗎::| – Greg 2009-09-07 15:07:33

+0

@greg對不起!沒有看到! – Lizard 2009-09-07 15:25:39

1

構造URL時,投入單$_GET變量(例如data=sfsdfasdf98sdfasdf)所得的序列化的值,然後將unserialize可變$_GET["data"]你可以serialize它們作爲鍵 - 值對。您需要使用urlencode以確保生成的序列化值是URL安全的。請務必留意最大網址長度 - 2083 characters in IE

但是,除非你真的不能在URL中使用鍵值對(根據你的問題),key1=foo&key2=bar...肯定是要走的路。

+0

您也可以使用bzcompress()來節省空間。另請注意,使用serialize()可能存在安全考慮,這取決於您使用unserialize()數據的方式。 – geocar 2009-09-07 15:56:40

4

您可以使用json_encode()serialize()

$myUrl = 'http://www.example.com/?myKey=' . urlencode(json_encode($url)); 

$myUrl = 'http://www.example.com/?myKey=' . urlencode(serialize($url)); 

使用json_encode通常會給你一個較短的字符串,但很老的PHP版本可能沒有提供給解碼它json_decode功能再次。

最後的方法是創建自己的自定義編碼...它可以是一個簡單的管道分隔值:key1 | 1 | key2 | 2 | key3 | 3
這會給你最好的選擇一個簡短的URL,但是是最多的工作。

+0

我想到了,但字符串變得很長: serialized = :7:{s:4:「key1」; i:1; s:4:「key2」; i:2; s:4: 「KEY3」; I:3; S:4: 「KEY4」; I:4; S:4: 「KEY5」; I:5; S:4: 「鍵6」; I:6; S:4:「KEY7 「; i:7;} 使用url_enode: a%3A7%3A%7Bs%3A4%3A%22key1%22%3Bi%3A1%3Bs%3A4%3A%22key2%22%3Bi%3A2%3Bs%3A4% 3A%22key3%22%3Bi%3A3%3BS%3A4%3A%22key4%22%3Bi%3A4%3BS%3A4%3A%22key5%22%3Bi%3A5%3BS%3A4%3A%22key6%22%3Bi% 3A6%3Bs%3A4%3A%22key7%22%3Bi%3A7%3B%7D 長度是否會成爲問題? – Lizard 2009-09-07 14:47:38

+1

〜200個字符不是真正的問題......只是非常難看。嘗試JSON而不是 – Greg 2009-09-07 14:49:18

+0

你有大約2048個字符,但理論上應該沒有限制:http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-an-url – robjmills 2009-09-07 14:49:35

0

如果你不介意的下降鍵名,你可以使用

http://example.com?url[]=1&url[]=2&url[]=3

編輯保持鍵名:

http://example.com?values[]=1&values[]=2&values[]=3&keys[]=1&keys[]=2&keys[]=3

然後在你的PHP腳本:

$url = array_combine($_GET['keys'], $_GET['values']); 
+0

對不起,我需要的鍵名:( – Lizard 2009-09-07 14:48:30

+0

好了,更新的答案 – soulmerge 2009-09-07 14:52:22

0

您是否可以通過將數據保存爲HTML cookie來解決您的問題?這樣你就不必修改URL了。

如果您事先知道這些值,則可以在向用戶發送包含目標鏈接的頁面時從服務器端進行設置。

如果直到用戶填寫表單時纔會知道值,則仍然可以使用JavascriptL完成。當用戶單擊表單提交時,可以通過多次調用JavaScript來設置多個Cookie,如: document.cookie = 「鍵1 =試驗; expires = Mon,2009年9月7日23:47:11 UTC; path = /'

如果您試圖將數據從一個域傳遞到另一個域,安全模型可能會給您帶來一些麻煩。

+0

仍然存在:即使您解決實際放置數據的方式,如何編碼數據。 – geocar 2009-09-07 15:57:59

2

使用serialize()的建議很好。如果空間有問題,請使用bzcompress()serialize()的組合。

但是,考慮到還沒有提出安全性,那就是最終用戶(可以查看和編輯此url)可以操縱其中的數據。你可能認爲這很困難,但是大多數野生PHP攻擊蠕蟲都會在某種程度上做到這一點。如果讓用戶直接操縱鍵或值(或用一個整數,對象或其他任何東西代替它),那麼你應該保護你的腳本(和你的用戶)免受這種攻擊。

一個簡單的解決方案是簡單地使用共享密鑰。它可以是任何東西;只要它是唯一的,真正的祕密(也許你應該在安裝時隨機產生它)。比方說,你在你的配置文件是這樣的:

define('SECRET', 'unoqetbioqtnioqrntbioqt'); 

然後,您可以進行數字簽名以創建序列化的數據:使用$s=serialize($m)$k=sha1($s.SECRET),使URL值$k.$s

然後,您unserialize()之前做這個:

$v=substr($input,0,40); 
$s=substr($input,40); 
if ($v != sha1($s.SECRET)) { die("invalid input"); } 
$m=unserialize($s); 

這樣,你就知道$m和你序列化的原始值是一樣的。

如果你喜歡,你可以使用下面的直接替代:

define('SECRET','buh9tnb1094tib014'); // make sure you pick something else 
function secureserialize($o) { 
    $s=serialize($o); 
    return sha1($s.SECRET).$s; 
} 
function secureunserialize($i) { 
    $v=substr($i,0,40);$s=substr($i,40); 
    if ($v!=sha1($s.SECRET)){die("invalid input");} 
    return unserialize($s); 
}