0

我正在使用 PHP 和 MySQL 来遍历产品并生成 HTML 代码,该代码由一个 img 标记和一个调用 Javascript 函数的 onClick 事件组成。我想通过 onClick 事件将 PHP 变量传递给 Javascript 函数。我正在使用 jQuery,并认为使用 PHP 的 json_encode() 函数和 jQuery 的 jquery-json 插件是个好主意。

我的 PHP 代码如下所示:

$onclick = json_encode(array(
  'productid' => $productsRow['ProductID'],
  'description' => $productsRow['Description']
));
echo "<a href=\"javascript:;\" onClick=\"changepic('" . htmlentities($onclick) . "')\">";
echo "<img src=\"products/$thumbnailfilename\" width=\"100\" height=\"100\">";
echo "</a>";

如您所见,我的 Javascript 函数称为 changepic()。我遗漏了一些与这个问题无关的代码(即数据库访问代码和决定缩略图的位置)。

我的 Javascript 代码是:

function changepic(productarray) {
  var productid = $.evalJSON(productarray).productid;
  var productdesc = $.evalJSON(productarray).description;
  alert(productid);
}

我还没有真正对传递给 Javascript 数组的 PHP 变量做任何事情,我只是想让它首先工作!我的最终目标是使用 jQuery 将产品描述插入到<div>

示例产品详细信息可能如下所示:

ProductID: 30c7508008ac7597619ad9b90a97b40f
Description: <p>Wide and Narrow Bands<br>
Set with Top-Quality Diamonds</p><p>

如您所见,描述包含 HTML 代码,以及<br>标签后的换行符。

生成的 HTML 如下所示:

<a href="javascript:;" onClick="changepic('{&quot;productid&quot;:&quot;30c7508008ac7597619ad9b90a97b40f&quot;,&quot;description&quot;:&quot;&lt;p&gt;Wide and Narrow Bands&lt;br&gt;\r\nSet with Top-Quality Diamonds&lt;\/p&gt;&quot;}')"><img src="products/tn-30c7508008ac7597619ad9b90a97b40f.jpg" width="100" height="100"></a>

当我运行它时,我得到一个 Javascript 错误:

Event thread: click
Uncaught exception: SyntaxError: JSON.parse: Unescaped control char in string: "<p>Wid
Error thrown at line 18, column 2 in changepic(productarray) in http://isis/carats/view-collection.php?collectionid=32d0c7b8774f7f82a2d7c7d053286cfc:
var productid = $.evalJSON(productarray).productid;
called from line 1, column 0 in <anonymous function>(event) in http://isis/carats/view-collection.php?collectionid=32d0c7b8774f7f82a2d7c7d053286cfc:
changepic('{"productid":"30c7508008ac7597619ad9b90a97b40f","description":"<p>Wide and Narrow Bands<br>\r\nSet with Top-Quality Diamonds<\/p>"}')

据我所知,我在编码 JSON 字符串时做错了。我做了一些谷歌搜索,发现有些人说不需要编码(我试过了,产品描述被视为 HTML 并显示在页面中),其他人说使用 addlashes() 和一些人说 htmlentities()。

在尝试将其与 evalJSON() 一起使用之前,是否需要在 Javascript 函数中对其进行解码?

4

3 回答 3

0

我认为我过于复杂了,我根本不需要使用 JSON。

我通过将我的 PHP 代码更改为:

$productid = $productsRow['ProductID']
$description = rawurlencode($productsRow['Description']);
echo "<a href=\"javascript:;\" onClick=\"changepic('$productid','$description')\">";

然后我的 Javascript 看起来像这样:

function changepic(productid, description) {
    description = decodeURIComponent(description);
    alert(description);
}

这工作正常,所以现在我可以继续并实际在 Javascript 函数中做一些有用的事情。

于 2012-11-11T22:30:52.367 回答
0

我通常只是这样做,

var foo = <?php echo json_encode($foo); ?>;

而且我真的不明白这会如何导致任何形式的“注入”攻击,只要它json_encode正在发挥作用。

于 2012-11-09T05:04:08.170 回答
0

我不明白你为什么会陷入这么多混乱..这是解决方案,它有效

$onclick = json_encode(array(
'productid' => $productsRow['ProductID'],
'description' => $productsRow['Description']
));
echo "<a id='test' href='' var='$onclick'>";
echo "<img src=\"products/$thumbnailfilename\" width=\"100\" height=\"100\">";
echo "</a>";

这是你的jQuery:

$(function(){

   $("#test").click(function(){
   var img = jQuery.parseJSON(($(this).attr("var")));
   alert(img.description);
});

});

现在,由于您拥有 json 对象,您可以创建 div 标签并将变量放入其中或将内容放在已经存在的 div 标签上。我相信你知道在这里做什么。

丁斯

于 2012-11-09T05:09:31.030 回答