3

啊,我从不喜欢 PHP,它太“不纯”了……

现在我必须使用它,但我遇到了一个问题:主要是既不html_entity_decode也不htmlspecialchars_decode似乎对我有用。我已经看过这个论坛了,什么也没有。它似乎在任何地方都有效,只是在这里不起作用......

我将电影的标题发送到数据库,全部编码,然后当我从数据库中获取它时,我用这个解码它:

$title = html_entity_decode($row['Title']);

接着:

"title":"'.$title.'"

它是我用 PHP 创建的 JSON 对象的一部分。虽然当我查看那个特定对象的属性时,它的标题并没有被解码,实际上没有任何变化。我尝试了问题标题中所述的两个功能,并尝试了像 UTF-8 这样的编码,还有一些像 ENT_QUOTES 或 ENT_COMPAT 这样的选项,但它仍然不起作用。

有人可以告诉我为什么 PHP 不听我的吗?

编辑:这是我在那里所做的全部内容:

echo 'var serverVideos = [';
while($row = mysql_fetch_array($result))
{
    $currentRow++;
    $data = array('posterSrc' => $row["Poster_name"],
        'videoSrc' => $row["Video_name"],
        'videoType' => $row["Type"]);

$title = html_entity_decode($row['Title']);
$poster = html_entity_decode($row['Poster_name']);
echo'{"id":"'.$row["ID"].'", "vimeoID":"'.$row["VimeoID"].'", "title":"'.$title.'" ,"client":"'.$row["Client"].'" , "production":"'.$row["Production"].'", "type":"'.$row["Type"].'", ';
            if($row["Type"] != "vimeo")
            {
                echo '"href":"'.http_build_query($data).'"';
            }
            else
            {
                echo '"href":"'.$row["Video_name"].'"';
            }
            echo ', "poster":"'.$poster.'"}';

            if($currentRow != $rowNumber)
            {
                echo ',';
            }
        }
        echo '];';

抱歉,有点乱,在notepad++中看起来更好;/我实际上是在脚本标签中输出它来制作一个对象,我查看了 json_encode 并没有真正理解它如何帮助我,因为我不知道如何使用这么多变量,抱歉。

此外,以下是使用该 JSON 对象中的变量使用 javascript 制作标签后源代码中的代码:

<a production=" " client=" " title="O.S.T.R &amp;quot;Track #12&amp;quot;" href="http://player.vimeo.com/video/43886787?title=1&amp;amp;byline=1&amp;amp;portrait=1" rel="shadowbox" class="box">

4

3 回答 3

10

(我无法让这个适合评论,所以它必须是一个答案。)

这里真正的问题是数据被放入数据库的方式。让我们看一下您提供的示例字符串:

$raw="O.S.T.R &amp;quot;Track #12&amp;quot;";
echo html_entity_decode($raw);
//   O.S.T.R &quot;Track #12&quot;
echo html_entity_decode(html_entity_decode($raw));
//   O.S.T.R "Track #12"

所以用户输入是OSTR "Track #12"

这里的关键概念是,这正是它应该存储在数据库中的方式。因为那是真实的数据。不要在数据库中存储修改后的版本。相反,请适当地转义数据,但您需要输出它。

这是我将用于以下几个示例的示例数据:

$title='O.S.T.R "Track #12"';
$description='A&B or A\B ??';

因此,当您在使用的 SQL 语句addslashes(或准备好的语句,但我将在此处展示添加斜杠方法)中写入数据时:

$sql="INSERT INTO xxx(title,description) VALUES('".addslashes($title)."','".addslashes($description)."')";
//   INSERT INTO xxx(title,description) VALUES('O.S.T.R \"Track #12\"','A&B or A\\B ??')

对于 json 编码,使用 json_encode:

$json=json_encode( array('title'=>$title,'description'=>$description) );
//   {"title":"O.S.T.R \"Track #12\"","description":"A&B or A\\B ??"}

对于 csv 编码,在日志文件中,使用 fputcsv:

$fp=fopen("my.csv","a");
fputcsv($fp, array($title,$description) );
fclose($fp);
//   "O.S.T.R ""Track #12""","A&B or A\B ??"

对于作为 HTML 的输出,使用 htmlspecialchars()(或 html_entity_encode()):

$html='<h3>'.htmlspecialchars($title).'</h3>';
$html.='<p>'.htmlspecialchars($description).'</p>';
//   <h3>O.S.T.R &quot;Track #12&quot;</h3><p>A&amp;B or A\B ??</p>

现在,也许我还没有说服你,你仍然真的想在你的数据库中存储 HTML 就绪的数据,并且每次你想将它用于其他任何事情时都要承受额外的步骤来取消 html 化它?在这种情况下,您的示例字符串应该如下所示:

O.S.T.R &quot;Track #12&quot;

而你的字符串看起来像:

O.S.T.R &amp;quot;Track #12&amp;quot;

你看得到差别吗?第一个已将 html 实体仅编码一次。调用html_entity_decode()将正确解码它。第二个已经对它们进行了两次编码。它不再被编码为 html 实体。这就是我们所说的双实体编码格式或简称 DEEF。PHP中没有任何deef_decode()功能,或者我听说过的任何计算机语言,甚至没有比 PHP 更纯粹的语言。原因是没有人需要这个功能。

摘要:您的代码中存在写入其数据库的错误。您正在接收已编码实体的字符串,但您在将它们写入数据库之前再次对其进行编码。

结论:回到我上面给出的关键概念,您应该在将这些 html 实体写入数据库之前对其进行解码,而不是再次对其进行编码。但是,当您进行此更改时,请确保从数据库中获取数据并将其放入 HTML 或 XML 的所有代码都知道它现在必须对实体进行编码。

于 2012-07-03T00:02:17.203 回答
3

我不完全确定这里的问题是什么,但我想知道你为什么不使用json_encode()来构建对象?

这将为您解决所有编码问题。

于 2012-07-01T11:36:08.447 回答
-1

好的,如果有人遇到同样的问题并且自己不会想出这个废话,解决方案很简单,PHP 函数 html_entity_decode 和 htmlspecialchars_decode 不会完全从特殊字符中剥离字符串,它只会从一个特殊字符中剥离,如果你有两个特殊的字符,你需要运行这个函数两次......例如这个字符串:
O.S.T.R &amp;quot;Track #12&amp;quot;

需要剥离两次,首先是 &,然后再剥离那些“-es”。

于 2012-07-02T11:32:05.730 回答