我有这个代码应该从MySQL数据库中回显一些值。我使用完全相同的代码两次,并且代码的特定部分不能按预期工作。
我有一个DIV,可以在鼠标悬停时更改内容(使用$(this).html('')
)。
基本上我们有类似的东西:
echo "<a href=\" event.php?id=".$donnees['event_ID']." \">";
echo "<div class=\"" ;
//here, check which category we have, and select the appropriate CLASS (DP_0, _1, _2, _3).
if ($donnees['event_category'] == 'universitaire') {
echo "DP_0";
} else if ($donnees['event_category'] == 'sociol') {
echo "DP_1";
} else if ($donnees['event_category'] == 'artiste') {
echo "DP_2";
} else if ($donnees['event_category'] == 'aventurier') {
echo "DP_3";
} else {
echo "DP_0";
}
echo "\" id=\"".$donnees['event_ID']."\" onmouseover=\"$(this).html('";
echo "Institution: ".$donnees['event_institution']. "</br>";
echo "Association: ".$donnees['event_association']. "</br></br>";
echo "')\” onmouseout=\"$(this).html('";
echo $donnees['event_name'] . "</br></br>";
echo "Adresse: ".$donnees['event_adresse'] . "</br></br>";
if ($donnees['event_payant'] == '0') {
echo "PAYANT"; //Works
echo "<p>BLABLA</p></br'>"; // Works
echo "<p style=\"background-color:red;\”>BLABLA</p></br>"; // doesn't work
}
echo "')\" sty1e=\" ";
//here, check which category we have, and select the appropriate background
if ($donnees['event_category'] == 'universitaire') {
echo "background-image:url('images/universitaireCategory.png');";
} else if ($donnees['event_category'] == 'sociol') {
echo "background-image:url('images/socialCategory.png');";
} else if ($donnees['event_category'] == 'artiste') {
echo "background-image:url('images/artisteCategory.png');";
} else if ($donnees['event_category'] == 'aventurier') {
echo "background-image:url('images/aventurierCategory.png');";
} else {
echo "background-image:url('images/universitaireCategory.png');";
}
echo " \"> ";
我评论了奇怪的部分。如果我这样做:
echo "<p>BLABLA</p></br>"; // That code works fine
但:
echo "<p style=\"background-color:red;\">BLABLA</p></br>"; // doesn't work
只要我添加\"\"
或' '
的内容,之后的所有内容都会被破坏。为什么呢?
我的代码后面的代码完全相同:
<div> <p style=\"background-color:red;\">BLABLA</p></br> </div>
答案 0 :(得分:4)
一些事情。
不要说“它不起作用”。请描述一下。我敢肯定,如果你的祖母叫你告诉你她的“电脑无法正常工作”,你就不得不提出一堆问题来解决它。
您通常不应该像使用PHP代码一样生成Javascript。相反,编写一组JS,然后从PHP发送不同的 data (JSON,也许?)。它使调试更容易,代码更清晰,而且你可以从不同的来源提供JS - 你可以对Javascript进行单元测试!
如果您放入JS的数据包含任何用户提供的输入,则您的代码很容易受到XSS攻击。如果event_name
类似于!"--;;^$&\\\*$'#
,该怎么办?你生成的JS在语法上是否正确?
请勿使用style
属性来避免它。请改用样式表和类。它使您的网站的调试,维护和重新设置更容易。
您可以避免使用字符串周围的单引号来转义引号,因为在PHP中,任何一种引用都是有效的。请注意,变量不会在单引号字符串中进行插值。
</br>
不是有效标记。试试<br />
,这是有效的HTML和XHTML。
您的echo
声明没有任何问题。它将在输出文档中生成以下HTML:<p style="background-color:red;">BLABLA</p></br>
。问题出在其他地方,但我没有足够的信息说明在哪里。很可能您生成的JS会抛出错误:查看Google Chrome中的开发人员控制台,并检查生成的Javascript是否存在因错误地将输入注入代码而导致的错误。然后,当问题出现时,按照我之前的建议编写一个JS函数,该函数从PHP获取 input ,而不是由PHP 编写的JS函数。 / p>
答案 1 :(得分:3)
不知何故,你的代码中出现了“卷曲的引用”:
echo "<p style=\"background-color:red;\”>BLABLA</p></br>";
// ^^^
这会产生破碎的HTML。
<p style="background-color:red;\”>BLABLA</p></br>
将其替换为普通双引号:
echo "<p style=\"background-color:red;\">BLABLA</p></br>";
答案 2 :(得分:1)
我认为问题在于,有问题的html被封装在onmouseover=""
中,PHP正在将\"
作为"
回显,并且生成的html类似于:
onmouseover="$(this).html('<p style="background-color:red">BLABLA</p></br>')"
因此,onmouseover
实际上只等于"$(this).html('<p style="
。
要使其正常工作,您必须在代码的PHP 和 Javascript部分中转义双引号。不幸的是我不知道该怎么做。
我设置了jsfiddle here,我希望能够证明我的观点。