mysql_real_escape()w / trim()w / stripslashes() - 这是明智的吗?

时间:2011-03-16 01:29:30

标签: php mysql

这可能是一个非常愚蠢且自我回答的问题:我正在删除我的提交内容(但需要提交到我的表格并将数据回显到屏幕上):

$num_of_badges = stripslashes(trim(mysql_real_escape_string($_POST['num_of_badges'])));

当然数据是传递的,但是stripslashes()``** here defeat the purpose of mysql_real_escape()`?

所以:Bill's成为桌上的Bills并在屏幕上回显。

3 个答案:

答案 0 :(得分:5)

或者你可以使用prepared statements而不是破坏你的数据:

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>

答案 1 :(得分:0)

  

需要提交到我的表格,并将数据回显到屏幕

这句话是你所有问题的关键。

虽然trim()条件 stripslashes()是“提交”相关,但mysql_real_escape_string 完全不同,它与提交无关,输入,输出和所有东西。它仅与SQL查询有关。

所以,这些功能永远不应该混合在一起。

  • stripslashes应该是有条件的。如果启用了魔术引号,则。可以使用get_magic_quotes_gpc()进行检查。仅适用于HTTP输入变量。
  • 修饰在大部分时间都没用,但是让它成为输入。

上面这两个可以在代码的顶部盲目使用。但第三个,

  • mysql_real_escape_string,正如已经说过的那样,完全不同。它应该用在将要插入查询的字符串中。不会在屏幕上回显字符串。不是数字或标识符,而是字符串(引用的数据块)进入查询。因此,mysql_real_escape_string可以在查询构建之前使用,而不是其他地方。并且应该在将数据插入查询之前对数据进行最后一次操作。

此外,我希望您在将数据插入数据库后不会立即打印。 您宁愿进行重定向,然后从数据库中读取新写入的数据。

答案 2 :(得分:-1)

这里的简单答案是striplahes实际上绕过了mysql_real_escape_string。

$num_of_badges = trim(stripslashes($_Post['num_of_badges']));
$query_part = mysql_real_escape_string($_Post['num_of_badges']); // Or whatever...

可能你不得不去做,记住你并不总是要超级简洁。一条线就是一条线。 :P