2012-08-27 30 views
1

我需要能夠在我的網站的URL(該段用於數據庫查詢)的URI段中有空格和括號。所以,我rawurlencode()一個字符串,然後rawurldecode()在接收頁面相同的字符串,但它不完全相同。空格很好,但括號留在十六進制字符代碼中。這完全混淆了我的數據庫查詢。任何想法爲什麼rawurldecode沒有生成傳遞給rawurlencode()的EXACT字符串?php rawurldecode不會產生相同的字符串傳遞給rawurlencode

原始字符串=康普頓社區學院(CA)

編碼的字符串=

Compton%20Community%20College%20%28CA%29 

已解碼的字符串的vardump是

string(38) "Compton Community College (CA)" 

在視圖頁源

"Compton Community College (CA)" 

編輯

好吧,很明顯這可能是一個Codeigniter的東西(我正在使用)。代碼

<a href='<?php echo site_url('college/'.rawurlencode($player['college'])); ?>'> 

產生的http://localhost/ff/index.php/college/Compton%20Community%20College%20%28CA%29

正確的URL的最終URI段被收到如下面的函數

function view_college($college = FALSE) 
{ 
    if($college === FALSE) 
    {//no college provided 
     redirect(''); 
    } 
    $college = rawurldecode($college); 

在這一點上的參數串已經在形式顯示在上面。所以也許我搞砸了一些東西,或者只是不能指望CI正確傳遞字符串。 :-(思考?

+0

你可以發佈你的編碼/解碼樣本字符串?我無法通過'rawurldecode()'複製括號 - 不能解碼。 – newfurniturey

+1

你的問題不在'rawurldecode()';你的「查看源代碼」中的字符是HTML字符 - URL編碼不會觸及(也不能被複制)。你可以發佈你操縱字符串的代碼(編碼/解碼/回顯),還可以列出你使用的瀏覽器? 'htmlentities()'和'html_special_chars()'不要對括號進行編碼 - 所以這很有趣! – newfurniturey

+0

@newfurniturey也許不那麼有趣,因爲它看起來可能是框架的結果。對不起: -/ – dgeare

回答

0

否否否。不這樣做。真是讓人頭疼!

把所有的院校在數據庫中,並使用自動遞增的整數id柱鑽到它的內容:

如果你把裏面<head>一個HTML <base>元素來定義你的根:

<base href="http://localhost/yourapp/">

然後,你可以把它寫得很乾脆:

<a href='college/<?= $id;?>'><?= $name;?></a>

將主要渲染代碼,將像:

<a href='http://localhost/yourapp/college/5'>Some Community College</a>


更新1: @Frank農民的意見後,我建議保持自動遞增id字段,但在網址中使用這個縮進。相反,以編程方式生成單獨的字母數字SEOid並將其用於搜索引擎優化。相同的基礎鏈接結構。

+1

在URL中包含一個合適的slug,而不僅僅是一個數字id對於SEO目的來說更可取。將slug中的字符限制爲字母數字雖然 –

+0

感謝您指出@FrankFarmer :) –

1

如果你不想使用ID(可能爲SEO的原因),你可以添加另一個字段到數據庫 - 網址,然後寫一個網絡安全的大學名稱版本...在你的例子中可能是類似於Compton-Community-College-CA甚至小寫字母。

完整的URL:

http://localhost/ff/index.php/college/Compton-Community-College-CA 

CodeIgniter's URL Helper有一個很好的功能:url_title()

0

有點晚,但發生在我身上,我發現了這個解決方案。

問題出在_filter_uri函數URI CI的類。這是他們在功能做什麼:

// Convert programatic characters to entities 
$bad = array('$',  '(',  ')',  '%28',  '%29'); 
$good = array('&#36;', '&#40;', '&#41;', '&#40;', '&#41;'); 

return str_replace($bad, $good, $str); 

所以,你必須是反轉,然後申請rawurldecode

function view_college($college = FALSE) 
{ 
    if($college === FALSE) 
    {//no college provided 
     redirect(''); 
    } 
    $bad = array('&#36;', '&#40;', '&#41;', '&#40;', '&#41;'); 
    $good = array('$',  '(',  ')',  '%28',  '%29'); 

    $college = str_replace($bad, $good, $college); 
    $college = rawurldecode($college); 
相關問題