MySQL行回声没问题,除非作为文本输入的值返回

时间:2015-11-08 17:34:31

标签: php mysql input escaping apostrophe

因此,在将行返回到文本框中时,我在MySQL中有一个小问题,因此可以对它们进行编辑。

问题是,在列的字符串中包含撇号(')的行echo可以作为页面上的文本使用,但是当作为文本框的值进行回显时,字符串会被剪切掉撇号以斜线结束。

我使用stripslashes($nam)删除了斜杠,$nam是我将名称列加载到mysqli_fetch_assoc的变量。但是其余的字符串还没有被退回。

同样,当回显到列出所有行的页面时,没有问题,完整的字符串按原样输出,带撇号,没有添加斜杠。

这是将字符串回显到页面上的时间: This is when the string is echoed onto the page

这是当字符串作为文本框的值回显时: This is when the string is echoed as the value of the text box

在Chrome的开发者工具中,我可以看到问题是撇号过早关闭了value标记,其余字符串被视为HTML属性。 Chrome developer tools

那么如何阻止这种情况发生呢,目前我的代码(一个大大减少的版本,以避免填充无意义的无关代码的页面)我用来回应:

while($row = mysqli_fetch_assoc($result)):
    $nam = $row["Name"];
    $nam = mysqli_real_escape_string($mysqli, $nam);
    $nam = mysqli_real_escape_string($mysqli, $nam);
    echo "<label for='Name'>Name</label></td>
    <td><input type='text' name='Name' id='Name' placeholder='Item Name' value='".$nam."' required></td>";
endwhile;

1 个答案:

答案 0 :(得分:0)

所以我开始输入这个问题,然后想“在发布之前我最好试试这个,否则如果简单修复的话,它看起来真的很糟糕。”

原来我是对的。然而,我会发布这个问题,所以开始的人可能会从中学习,因为它是如此基本的东西,部分是因为我已经输入问题。

答案:

以前我使用引号"来封装我想要回显的内容,并使用撇号'来设置值,所以在这种情况下,我的代码是:

echo "<input type='text' name='Name' id='Name' placeholder='Item Name' value='".$nam."' required>";

要注意的关键点是代码:value='".$nam."'

因为该行返回了一个撇号,我假设PHP将这个撇号识别为value属性的结尾并缩短了我的字符串,因此奇怪的Chrome Developer Tools源代码包含了我的其余字符串,sans apostrophe。

要解决这个问题,我只需将撇号更改为引号,然后使用反斜杠\对其进行转义。对于任何不知道的人来说,逃避是通过在你需要逃脱的角色之前加上反斜杠来完成的,这就消除了这个角色的任何特殊能力。如果我没有转义引号,那么引号会结束我的echo并给我留下语法错误。通过转义它,我告诉PHP,引号是我想要echo的HTML的一部分,而不是echo的结尾。

所以我的新代码现在是:

echo "<input type='text' name='Name' id='Name' placeholder='Item Name' value=\"".$nam."\" required>";

所以我学到的经验是:不要试图通过使用它们来封装你的echo来避免转义引号。