0

$_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";
4

3 に答える 3

3

すみません、今朝は寝ていたに違いありません。これは、もっと早く捕まえるべきだったものです。

元のコードには実際には 2 つの問題がありました。

  1. 関数を使用しているため、もともと質問にあったの代わりにmysqli_*使用する必要があります。質問ですでにこれを修正しましたが、おそらく2番目の問題を見落とすことにつながりました.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);
    

多くのコメントが指摘しているように、代わりに準備済みステートメントの使用を検討することもできます。

現在のコードは SQL インジェクションから保護されていますが、準備済みステートメントの利点は、エスケープが自動的に組み込まれているため、クエリを実行するたびに変数をエスケープすることを覚えておく必要がないことです。

于 2013-06-28T02:48:14.567 に答える
0

問題として real_escape_string を非難する前に。値があるかどうかを確認します。

foreach($_POST = $Name => $Value) {
     echo $Name.' '.$Value.'<br />';
}
于 2013-06-27T21:15:48.907 に答える