为什么body onload在嵌套的json_encode' d数组中需要htmlentities?

时间:2014-03-30 16:03:45

标签: javascript php html iframe json

我读取数据库记录,并为每个数据库记录创建一个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是以某种方式绕过那个?

1 个答案:

答案 0 :(得分:0)

  

当在主体onload中回显PHP数组时,是否存在一些细微差别   标签,需要额外的步骤调用htmlentities()   json数组

是。您正在回复HTML,您当然需要htmlentities。如果您不这样做,JSON中的任何引号都将结束您的HTML onload属性值,并且生成的js只是语法错误。

  

将json数组直接传递给PHP代码中的javascript   是以某种方式绕过那个?

<script>内,除了</script>之外,其他任何内容都需要转义。