作者 主題: 為何用htmlentities()沒有任何效果?  (閱讀 5319 次)

0 會員 與 1 訪客 正在閱讀本文。

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
為何用htmlentities()沒有任何效果?
« 於: 2006-06-29 12:07 »
我在php.net網站看了htmlentities()的教學,源碼如下:
http://hk2.php.net/manual/tw/function.htmlentities.php
--------------------------------------------
<?php
$str = "A 'quote' is <b>bold</b>";

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>
--------------------------------------------
拿了它舉出的例子試了一下,沒有任何轉換和反應,還是原原本本地顯示出來了,htmlentities()好像失效?? 我用的是FC5, PHP v5.1.
另外,想請教各位,htmlentities()是用作過濾用戶的input,究竟是儲入DB前用它來過濾,還是由DB取出資料顯示前用它呢? 我看了O'Reilly的Essential PHP Security一書,教的是由DB取出資料顯示前用它,原文如下:
--------------------------------------------
The most common destination is the client, and htmlentities( ) is the best escaping function for escaping data to be sent to the client. Like most string functions, it takes a string and returns the modified version of the string. However, the best way to use htmlentities( ) is to specify the two optional argumentsthe quote style (the second argument) and the character set (the third argument). The quote style should always be ENT_QUOTES in order for the escaping to be most exhaustive, and the character set should match the character set indicated in the Content-Type header that your application includes in each response.

To distinguish between escaped and unescaped data, I advocate the use of a naming convention. For data to be sent to the client, the convention I use is to store all data escaped with htmlentities( ) in $html, an array that is initialized to an empty array and contains only data that has been both filtered and escaped:
<?php
    $html = array(  );

    $html['username'] = htmlentities($clean['username'],      ENT_QUOTES, 'UTF-8');

    echo "<p>Welcome back, {$html['username']}.</p>";

 ?>
--------------------------------------------

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
Re: 為何用htmlentities()沒有任何效果?
« 回覆 #1 於: 2006-06-29 14:40 »
引述: "yes298"
我在php.net網站看了htmlentities()的教學,源碼如下:
http://hk2.php.net/manual/tw/function.htmlentities.php
--------------------------------------------
<?php
$str = "A 'quote' is <b>bold</b>";

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>
--------------------------------------------

改成
<?php
$str = "A 'quote' is <b>bold</b>";
echo $str."<br>\r\n";
// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str)."<br>\r\n";

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES)."<br>\r\n";
?>
執行後 show
A 'quote' is bold
A 'quote' is <b>bold</b>
A 'quote' is <b>bold</b>
html 原始碼為
A 'quote' is <b>bold</b><br>
A 'quote' is &lt;b&gt;bold&lt;/b&gt;<br>
A 'quote' is &lt;b&gt;bold&lt;/b&gt;<br>

應該是這樣..hope this can help u

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
為何用htmlentities()沒有任何效果?
« 回覆 #2 於: 2006-06-29 15:09 »
請問這是為何會如此呢?
需要在後面加上:    
  ."<br>\r\n";
可以解釋一下嗎?
Thanks!

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
為何用htmlentities()沒有任何效果?
« 回覆 #3 於: 2006-07-02 08:01 »
沒有高手會解答嗎?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5411
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
為何用htmlentities()沒有任何效果?
« 回覆 #4 於: 2006-07-02 09:53 »
看產生的 html source code 你就應該知道答案了.
或者不要在 browser 中跑 php, 也應該看的出來那邊不一樣.

這個函式是為了避免你的資料中有 html 用的一些特殊字元, 讓你的 html 頁面會有問題. 所以會把那些字元轉成 &xxx; 之類的編碼, 這樣子 browser 就不會誤把那些字元當成 html 中的某些指令.
如果你用 browser 看後頭的結果, 看起來會跟沒編碼時一樣, 因為 browser 會把那些字元在顯示時轉回來.

所以... 看 html source code 應該會看到不同的地方.

如果你的那應字串沒有包含那些特列的字元, 自然轉換前後不會有差別.

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
為何用htmlentities()沒有任何效果?
« 回覆 #5 於: 2006-07-03 17:09 »
不錯,的確表面上沒有任何轉換,但看其Source Code卻已作了轉換, 謝謝樓上這位學長的熱情幫助!