2012-12-11 51 views
1

我遇到了一個問題,可能(希望)很容易解決,但我只是卡住了。使用urlencode的PHP導致頁面未找到錯誤

當我使用urlencode(或rawurlencode)函數時,它不會找到我發送它的腳本。

所以這工作得很好:

$data["text"] .= "<a href='index.php?load=results&reg=".$row["region"]."'>".$row["region"]."</a><br/>"; 

,它會帶我到正確的頁面:

的index.php負荷=結果& REG = CRO

但該人士我正在做的工作是讓她的「&」符號替換爲(R)註冊符號,並且她正在找到找不到的頁面。不幸的是,我無法在這個辦公室轉載本文的任何其它計算機

所以當我改變代碼來讀取

$data["text"] .= "<a href='".urlencode("index.php?load=results&reg=".$row["region"])."'>".$row["region"]."</a><br/>"; 

它試圖把我帶到這個頁面

指數.PHP%3Fload%3Dresults%26reg%3DCRO

但它給我下面的頁面沒有找到錯誤:

請求的URL index.php?load = results & reg =在此服務器上找不到CRO。

這真的很奇怪,因爲請求的URL與解析頂部沒有打擾的URL完全相同。我明白我需要運行在某個階段urldecode(或rawurldecode),但如果它甚至沒有找到一個腳本加載我不能運行該功能反正...

編輯:更多細節 - 我使用TextWranger在Mac上編碼。該文件使用utf8與Unix(LF)行結尾進行編碼。本地服務器正在使用MAMP,實時服務器是基於Windows的機器,但我不確定任何配置設置可以幫助,因爲我剛剛開始這裏。輸出HTML使用UTF-8編碼。

回答

2

這裏是你如何使用它:

$data["text"] .= "<a href='index.php?load=results&reg=".urlencode($row["region"])."'>".$row["region"]."</a><br/>"; 

你在做什麼是URL編碼您的參數,而不是整個查詢的值。

所以基本上:

$data = "index.php?key=".urlencode("hello world value"); 
// will result in: 
"index.php?key=hello%20world%20value" 
+0

乾杯。我會給它一個去看看它是怎麼回事,但它似乎是它的象徵,似乎是問題。我只爲價值$ row [「region」]檢索值CRO,ERO,NRO,SRO和WA - 它至少適用於我,但它是否適用於她,我不知道。它可能是一個不同的問題,所有在一起 –

0

問號用作分隔符,而不是查詢字符串的一部分。

你不能使用enecode字符「?」字符「?」不是查詢字符串的一部分。

當然,你可以自由地編碼查詢字符串

嘗試的任何部分:

<?php 
echo "<a href='get.php?".urlencode("load=results&reg=".urlencode($row["region"])."'>".$row["region"]."</a><br/>"; 
var_dump($_GET); 
?> 
1

按照HTML 4.01 specification

Although URIs do not contain non-ASCII values (see [URI], section 2.1) authors sometimes specify them in attribute values expecting URIs (i.e., defined with %URI; in the DTD). For instance, the following href value is illegal:

所以基本上你應該不能使用非-ISCII字符在您的URI中,因爲不同的用戶代理將以不同的方式處理它們。

例如,用戶代理可以決定使用文檔的字符集編碼,或者它可以假定一個HTML實體編碼。這可能是你的用戶提到他們經歷過的。因此,最好的做法是確保始終通過對URL的整個URI部分進行urlen編碼,在a標記的href屬性中提供ASCII字符。

如果你正在動態地組裝這個URL,PHP中的一個函數可以幫助你處理整個問題,它是http_build_query,它爲你組合了查詢字符串,並對它進行了正確的url編碼。

$row["region"] = "CRO"; 
$query = array(
        "load" => "results", 
        "reg" => $row["region"], 
      ); 
$query = http_build_query($query); 

echo $URL = "index.php?" . $query; // index.php?load=results&reg=CRO 

現在你可以使用

echo "<a href=\"$URL\">{$row['region']}</a>"; 

,你會得到...

<a href="index.php?load=results&reg=CRO">CRO</a> 
+0

乾杯隊友,我看着http_build_query函數,這看起來很有用,我會看看實施。原來是這個問題的是Internet Explorer(驚喜!!)正在將我的字符串的&reg部分並將其更改爲(R)已註冊的符號,儘管它應該只與®一樣做......我真的不有時間弄清楚爲什麼會這樣做,所以我將參數從reg改爲region。這樣一個愚蠢的事情,導致今天這樣的頭痛! –

+0

這聽起來很愚蠢:)我很高興你解決了你的問題。 – Sherif

相關問題