当使用trim,stripslashes和htmlspecialchars时,撇号会导致插入查询的问题

时间:2014-06-16 09:33:37

标签: php trim strip htmlspecialchars apostrophe

当我使用带撇号的文本时,查询不起作用。

示例:这是Ben的派对。

这是我使用的功能:

function text_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

这是html:

<textarea name="text" rows="20" cols="89"></textarea>

php脚本:

if ($_SERVER["REQUEST_METHOD"] == "POST") {

if (empty($_POST["text"])) {
    $errors[] = "There is no text";
} else {
    $text = text_input(mysqli_real_escape_string($con, $_POST['text']));
}

if(empty($errors) === true){
    mysqli_query($con, "INSERT INTO texts (text) VALUES ('$text')");
    exit();
}

2 个答案:

答案 0 :(得分:2)

你需要在完成所有其他事情之后执行mysqli_real_escape_string。否则,stripslashes将删除您刚刚使用转义添加的斜杠。

所以:

$text = mysqli_real_escape_string($con, text_input($_POST['text']));

答案 1 :(得分:0)

您使用stripslashes()htmlspecialchars()表示存在很多混淆。

  • trim()是您的代码中唯一属于text_input()
  • 的函数 几乎不应该使用
  • stripslashes()。相反,您应该使用为特定任务定制的函数来转义输出。在文本输入上使用stripslashes()只会在用户实际需要使用反斜杠时引起混淆。

  • htmlspecialchars()应该是在生成html输出之前使用的最后一个函数。如果HTML转义所有内容,当您需要将数据库用于其他目的时,您将会遇到麻烦。我在地址中看到了大量带有HTML字符引用(&#xx;)的物理邮件,甚至是手写的邮件!

  • mysqli_real_escape_string()应该是MySQL查询之前使用的最后一个函数。

换句话说:

$text = trim ($_POST['text']);
$text_h = htmlspecialchars ($text);
$text_m = mysqli_real_escape_string ($con, $text);
...
mysqli_query ($con, "INSERT INTO texts (text) VALUES ($text_m)");
...
echo "<p>'$text_h' added to database.\n";