有人告诉我,我需要逃避$ _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";
答案 0 :(得分:3)
我道歉 - 今天早上我一定睡着了。这是我们之前应该抓住的东西。
原始代码实际上有两个问题:
由于您使用的是mysqli_*
函数,因此您需要使用mysqli_real_escape_string()
而不是问题中最初的mysql_real_escape_string()
。你已经在问题中纠正了这一点,但它可能导致我们忽略了第二个问题。
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);
正如许多评论所指出的那样,您可能还想考虑使用prepared statements。
虽然您拥有的代码现在可以防止SQL注入,但预处理语句的优点是转义是自动构建的,您不必记住每次执行查询时都要转义变量。
答案 1 :(得分:0)
在你将real_escape_string归咎于问题之前。检查是否有任何值。
foreach($_POST = $Name => $Value) {
echo $Name.' '.$Value.'<br />';
}
答案 2 :(得分:0)
您的PHP配置中可能没有启用mysqli
。检查您的phpinfo()
以了解相关信息。信息here。
必要时启用它。但是,在任何情况下,更改为PDO
的建议都是好的。
另外,假设您不在生产服务器上,请确认您已将错误设置为显示。解决问题的必要条件。
如果未启用mysqli
,则会导致致命错误。无论您的显示器设置如何,都可能显示一个。但是,当你想出这个错误时,仍然会配置错误。