我读取数据库记录,并为每个数据库记录创建一个PHP数组(),然后将每个数组存储为顶级PHP数组()的元素。顶层数组因此是一个数组数组,嵌套数组每个都包含一个数据库记录的字段。这里没什么特别的。
我需要将数据库记录数组的嵌套数组传递给两个不同的javascript函数,所以在传递嵌套数组之前我在PHP中使用json_encode:
CASE#1:嵌套json_encoded-d的第一遍是Javascript 函数doSomeStuff(theNestedJsonEncodedArray) - 我使用隐藏的iframe技术将嵌套数组传递给javascript代码(参见下文)
CASE#2:嵌套数组的另一个传递是我的网页 body onload = handleLoad(theNestedJsonEncodedArray)
对于案例#1,我不需要使用 htmlentities(theNestedJsonEncodedArray),以便在我的 doSomeStuff中成功使用此json编码数组( )功能。
对于案例#2, body onload = handleLoad()函数将不会执行。除非我添加一个额外的步骤。额外的步骤是这样的:在json_encode之后嵌套数组,我必须调用 htmlentities() - 然后只有那时我的 body onload = handleLoad()才会表现出来正确。
我100%无法理解这一点。我不明白为什么,在我的“PHP / iframe / javascript”场景中,json_encode()足以传递嵌套数组 - 但我的“body onload = handleLoad()**情况,我需要使用htmlentities嵌套数组上的(),或者onload javascript函数甚至都不会执行。
请注意:我的数据库记录中没有html。
CASE#1代码 - 使用隐藏的iframe将javascript代码传递到我的网页:
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
$theTopLevelArray= array();
for($i = 0; $i < $numrows; $i++)
{
$theRow = mysql_fetch_row($result);
$recordNum = $theRow[0];
$lat = $theRow[1];
$lng = $theRow[2];
$city = $theRow[3];
$state = $theRow[4];
// EACH NESTED ARRAY IS A TOWN with City, State, Latitude, Longitude
$nestedArray = array( $lat, $lng, $i, $recordNum, $city, $state);
$theTopLevelArray[] = $nestedArray;
}
$jsonArray = json_encode($theTopLevelArray);
echo '<script type="text/javascript">' . "\n";
echo 'var parDoc = parent.document;' . "\n";
$sendToWebpageStr = "parent.doSomeStuff( $jsonArray );";
echo $sendToWebpageStr;
echo "\n".'</script>';
// And in my web page's javascript code......
function doSomeStuff( theNestedJsonArray )
{
// Traverse the array of Towns and show their latitude and longitude
for (var i = 0; i < theNestedJsonArray.length; i++)
{
var town = theNestedJsonArray[i];
var lat = town[1];
var long = town[2];
alert("The lat, long are: " + lat + ", " + long);
// ALL THIS WORKS FINE.
}
}
案例#2代码 - 需要一个额外的步骤,一个致电的问题()
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
$theTopLevelArray= array();
for($i = 0; $i < $numrows; $i++)
{
$theRow = mysql_fetch_row($result);
$recordNum = $theRow[0];
$lat = $theRow[1];
$lng = $theRow[2];
$city = $theRow[3];
$state = $theRow[4];
// EACH NESTED ARRAY IS A TOWN with City, State, Latitude, Longitude
$nestedArray = array( $lat, $lng, $i, $recordNum, $city, $state);
$theTopLevelArray[] = $nestedArray;
}
$jsonArray = json_encode($theTopLevelArray);
$readyNowArray = htmlentities( $jsonArray );
// AND HERE'S THE 'body' ON MY PAGE:
<body onload="handleLoad( <?php echo $readyNowArray ?> )">
// HERE IS handleLoad()
function handleLoad( theNestedArray )
{
var town = theNestedArray[0];
alert("bl.js, handleLoad(), town is: " + town);
alert("bl.js, handleLoad(), town[0] is: " + town[0]);
alert("bl.js, handleLoad(), town[1] is: " + town[1]);
}
如果我不为CASE#2调用html实体 - handleLoad()函数甚至不执行。
在 body onload 标记中回显一个PHP数组时,是否存在一些细微差别需要在json数组上调用htmlentities()的额外步骤,同时将json数组直接传入通过iframe从PHP代码中获取的javascript是以某种方式绕过那个?
答案 0 :(得分:0)
当在主体onload中回显PHP数组时,是否存在一些细微差别 标签,需要额外的步骤调用htmlentities() json数组
是。您正在回复HTML,您当然需要htmlentities
。如果您不这样做,JSON中的任何引号都将结束您的HTML onload
属性值,并且生成的js只是语法错误。
将json数组直接传递给PHP代码中的javascript 是以某种方式绕过那个?
在<script>
内,除了</script>
之外,其他任何内容都需要转义。