我有以下代码:
onclick=" <?php echo 'postwith(\''.$_SERVER['PHP_SELF'].'\',{export:\'export\',date:\''.$_POST['date'].'\'})'; ?>"
而postwith是一个功能。
in ie我有一个错误:
Expected identifier, string or number
在Firefox中没关系,链接是:
postwith('/page/page.php',{export:'export',date:'Yesterday'})
那我的错误在哪里?
谢谢你!答案 0 :(得分:4)
export
是一个关键字,因此IE Javascript引擎似乎与您在该上下文中使用它混淆。你可以把它放在引号中,以表明它是一把钥匙。
答案 1 :(得分:2)
+1 warrenm,需要引用export
。
但是这种事情并不好。所有嵌套引用都几乎无法读取,并且因为您没有JavaScript-string-literal-escaped或HTML转义date
或PHP_SELF
,您可能会遇到HTML注入错误跨站点脚本安全漏洞。
永远不要在没有htmlspecialchars()
的情况下将文本字符串输出到HTML文本内容或属性值,并且在构建JS对象时使用json_encode()
创建输出,因为它将处理字符串转义问题和引用对象文字名称。
从PHP 5.3开始,JSON_HEX
选项允许您确保所有HTML特殊字符都被编码为JavaScript字符串文字转义符,因此您不必在JSON编码之上进行HTML编码,这意味着你可以在事件处理程序属性和<script>
块中使用相同的输出函数(它们是CDATA,没有HTML转义)。
<?php
function j($o) {
echo json_encode($o, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT);
};
$pars= array("export"=>"export", "date"=>$_POST['date']);
?>
onclick="postwith(<?php j($_SERVER['PHP_SELF']); ?>, <?php j($pars); ?>);"
还要考虑分解onclick
处理程序并从<script>
分配它而不是使用内联事件处理程序属性。这往往更具可读性。
答案 2 :(得分:1)
正如warrenm所指出的,export
是一个关键字,需要引用。
即改变PHP,结果输出为:
postwith('/page/page.php',{'export':'export','date':'Yesterday'});
你的PHP看起来像这样:
onclick="<?php echo "postwith('{$_SERVER['PHP_SELF']}',
{'export':'export','date':'{$_POST['date']}'})"; ?>"
(谢谢,Peter改进了语法)。
此外,您可能希望在onclick后删除空格:
onclick=" <?php
将成为:
onclick="<?php
答案 3 :(得分:1)
为了将来参考,如果对PHP字符串使用双引号并在字符串中使用数组元素的大括号表示法,您可能会发现更容易证明读取:
onclick="<?php echo "postwith('{$_SERVER['PHP_SELF']}',
{'export':'export','date':'{$_POST['date']}'})"; ?>"
<强> simplified example of using curly bracket notation inside double quotes 强>
(请注意,您不需要以字面方式呈现大括号)
此外,您应该使用 json_encode() 来确保您的JSON格式正确:
(注意onclick后的单引号以容纳双引号JSON)
onclick='<?php
echo "postwith(\"{$_SERVER['PHP_SELF']}\"," .
json_encode(array("export" => "export", "date" => $_POST['date']),
JSON_FORCE_OBJECT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT) .
")";
?>'
<强> example 强>
请参阅 bobince ,发布有关JSON编码选项的信息。
答案 4 :(得分:1)
这是马虎编码,IMO。保持模板格式与处理分开。
<?php
// do processing of information
$var = (((PSEUDOCODED DATA OUTPUT)));
processtemplate($var);
-------------
//new file that is included by processtemplate()
?>
... blah ... blah ... blah ... blah
onclick="[[_KEYNAME_]]"
... blah ... blah ... blah ... blah ... blah