将$ _POST转义为变量

时间:2013-06-27 21:09:51

标签: php post mysqli escaping

有人告诉我,我需要逃避$ _POST,但一旦我这样做,我的变量就是空的。我错过了什么?

<?php
$order = $_POST['order'];
$heading = $_POST['heading'];
$content = $_POST['content'];
?>

<?php
echo $order . $heading . $content;

$order = mysqli_real_escape_string($order);
$heading = mysqli_real_escape_string($heading);
$content = mysqli_real_escape_string($content);
?>
<?php
echo $order . $heading . $content;

$sql="INSERT INTO faq (`order`, `heading`, `content`)
VALUES ('$order','$heading','$content')";

if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }
echo "1 record added";

3 个答案:

答案 0 :(得分:3)

我道歉 - 今天早上我一定睡着了。这是我们之前应该抓住的东西。

原始代码实际上有两个问题:

  1. 由于您使用的是mysqli_*函数,因此您需要使用mysqli_real_escape_string()而不是问题中最初的mysql_real_escape_string()。你已经在问题中纠正了这一点,但它可能导致我们忽略了第二个问题。

  2. mysqli_real_escape_string()采用与mysql_escape_string()不同的参数,第一个参数需要是连接标识符。如果您将代码更改为此代码,则应该有效:

    $order = mysqli_real_escape_string($con, $order);
    $heading = mysqli_real_escape_string($con, $heading);
    $content = mysqli_real_escape_string($con, $content);
    

  3. 正如许多评论所指出的那样,您可能还想考虑使用prepared statements

    虽然您拥有的代码现在可以防止SQL注入,但预处理语句的优点是转义是自动构建的,您不必记住每次执行查询时都要转义变量。

答案 1 :(得分:0)

在你将real_escape_string归咎于问题之前。检查是否有任何值。

foreach($_POST = $Name => $Value) {
     echo $Name.' '.$Value.'<br />';
}

答案 2 :(得分:0)

您的PHP配置中可能没有启用mysqli。检查您的phpinfo()以了解相关信息。信息here

必要时启用它。但是,在任何情况下,更改为PDO的建议都是好的。

另外,假设您不在生产服务器上,请确认您已将错误设置为显示。解决问题的必要条件。

如果未启用mysqli,则会导致致命错误。无论您的显示器设置如何,都可能显示一个。但是,当你想出这个错误时,仍然会配置错误。