PHP字符串中的撇号


apostrophe in PHP string

这太奇怪了!我有一个表格,它从数据库中获取信息,然后填写一个包含详细信息的表格。我试图迎合一个人有奥尼尔这样名字的情况。页面顶部(实际表单本身之外(有一行将用户名与屏幕相呼应:

<h2>Member Details for <?php echo $thefn; ?></h2>

这确实正确地显示在页面上,即Mike O'Neill的会员详细信息然而,在实际形式中,代码运行的位置:

<td><?php echo "<input type='text' name='fname' value='$thefn' size='30' maxlength='30'>"; ?></td>

该名称显示为去掉撇号后的所有内容!变量是相同的,那么我做错了什么?这让我把头发都扯掉了(而且还有很多!(

假设我的名字是:

' /><script type="text/javascript">alert("You've just been hacked!");</script><input type="hidden" name="lol" value='hax

现在怎么办?

htmlspecialchars($thefn)

应该有帮助。

在HTML中使用双引号" ",如下所示:

echo "<input type='text' name='fname' value='"$thefn'" size='30' maxlength='30'>";

请注意,您必须使用'对它们进行转义,因为您已经使用双引号来分隔字符串(在PHP中(。另一种解决方案是在PHP端使用单引号(echo ' ';(,在字符串内使用双引号,这样就不需要转义。

还要注意,此代码易受XSS攻击,您可以使用htmlspecialchars()来防止这种攻击,以下是更正的代码(XSS和引号(:

echo '<input type="text" name="fname" value="'.htmlspecialchars($thefn).'" size="30" maxlength="30">';

忽略这里明显的安全性转移视线(我认为$thefn变量的格式对于HTML中的单引号之间是正确的(,我会将PHP变量封装在{}括号中,就像这样。这有两个主要优点。一是更容易发现可更换的部件,另外,让PHP清楚地知道什么部件是动态的。二——你可以使用更高级的变量,比如数组。{$my_array['my_key']}

<td>
<?php
    echo "<input type='text' name='fname' value='{$thefn}' size='30' maxlength='30'>";
?>
</td>

另请参阅:PHP字符串解析(在手册中(