如何在使用撇号的输入中转义撇号

How to escape apostrophe inside an input made with apostrophes

我有一个个人资料页面,我想在其中显示来自数据库的大多数用户的信息,以及一个将当前数据作为具有修改权限的用户的默认值的表单。

if ($IDprofile == $_SESSION['userID'])
{
    echo "<form method='post'>
            Surname: <input type='text' required name='surname' maxlength=50 
                value=".htmlentities($user['Surname'])."><br>
            Name: <input type='text' required name='name' maxlength=50 
                value=".htmlentities($user['Name'])."><br>

        Birthdate (format YYYY-MM-DD): <input type='text' required name='BirthDate' value='";
        if ($user['BirthDate'] != null)
            echo $user['BirthDate'];
        else
            echo "-";
        echo "'><br>

        Description: <input type='text' maxlength=255 name='description'                                 value='";
        if ($user['Description'] != null)
            echo htmlentities($user['Description']);
        else
            echo "-";
        echo "'><br>
        <input type='submit' value='OK'></form>";
}

如您所见,我尝试使用 htmlentities,这应该将撇号转换为 &#39;,但它不起作用。 addslashesaddcslashes 等其他方法也不起作用。

显示的是我的表单输入应该有的值,一直到应该有撇号的地方,就结束了。 addslashes 做同样的事情,在结束前有一个 /

最让我疑惑的是,我的数据库里有一个带撇号的姓氏,这个显示的很好。

请尝试像这样输出变量:

htmlspecialchars($user['Surname'], ENT_QUOTES);

另外请确保在您的系统中 disable magic quotes,这样您在发布新数据时就不会自动获得任何额外的斜杠。

htmlentities 默认只编码 " 双引号,因为它们是 HTML 属性更常见的终止符。如果你想让它也编码 ' 单引号,你需要设置 ENT_QUOTES 标志:

htmlentities($foo, ENT_QUOTES | ENT_HTML401)

ENT_HTML401 是另一个默认标志;现在您可能想使用 ENT_HTML5。)

您实际上还应该用引号分隔您的属性!目前您的结果看起来像 value=James,这并没有错,但是一旦您的值包含空格或者引号或其他特殊字符,就会给您带来麻烦。