1

次の PHP ファイルに値を送信する HTML フォームがあり、MySQL データベースに値が挿入されます。

<?php
  $con = mysql_connect("*","*","*");
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("*", $con);

  $sql="INSERT INTO scores (hometeam, awayteam, result)
  VALUES
  ('" . mysql_real_escape_string($_POST['hometeam']) . "',
   '" . mysql_real_escape_string($_POST['awayteam']) . "',
   '" . mysql_real_escape_string($_POST['result']) . "')";

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

  mysql_close($con);
?>

HTML フォームの入力フィールドが空白のままになることがあります。この場合、データベースに何も挿入したくありません。値をNULLのままにしたい。フォームに次のように入力すると、次のようになります。

ホームチーム: ブルーチーム
アウェイチーム: [空白]
結果: 勝利

以下が私のデータベースに挿入されます:

ホーム チーム: 青チーム
アウェイ チーム: ' '
結果: 勝利

挿入したい/挿入したくないものは次のとおりです。

ホーム チーム: 青チーム
アウェイ チーム: NULL
結果: 勝利

私は解決策を何時間も探しました。誰でも助けることができますか?ありがとうございました。

4

6 に答える 6

2

$sql を実行していて、$sql の最後の値が"INSERT INTO scores (result) VALUES ('$_POST[result]')";同じ変数名を入力して以前の値を上書きしているため、最終値のみが挿入されます。

フィールドが時々空白になる可能性がある場合は、 !emptyも (!empty($_POST[hometeam]))削除してください。

于 2012-06-30T14:04:36.927 に答える
2

毎回 SQL ステートメントを上書きしています。「結果」フィールドが空白ではないため、SQL ステートメントを次のように設定しています。

"INSERT INTO scores (result) VALUES ('$_POST[result]')"

これが実行される唯一のステートメントです。他の値はこのステートメントの一部ではないため無視されます。

最初に変数を設定する必要があります。

$hometeam = isset($_POST['hometeam']) ? $_POST['hometeam'] : NULL;
$awayteam = isset($_POST['awayteam']) ? $_POST['awayteam'] : NULL;
$result = isset($_POST['result']) ? $_POST['result'] : NULL;

その後、データベースとの対話を行うことができます。

$sql = "INSERT INTO scores hometeam, awayteam, result VALUES $hometeam, $awayteam, $result";
if (!mysql_query($sql,$con))
{
    die('Error: ' . mysql_error());
}
echo "1 record added";

mysql_close($con);

私はこれにセキュリティを含めていないと言わなければなりません.PDOまたは準備されたステートメントを調べて、データベースがSQLインジェクションに対して開かれていないことを確認する必要があります.

お役に立てれば!

于 2012-06-30T14:05:15.273 に答える
1

HTMLフォームの入力フィールドの名前の宣言に問題があると思います。$_POST[hometeam] は、フォーム内の同じ入力名でなければなりません。

例: あなたのフォームで

<input type="text" name="hometeam" value="" />

あなたのPHPで

 if (!empty($_POST[hometeam])) {
  $sql="INSERT INTO scores (hometeam) VALUES ('$_POST[hometeam]')";
 } 

また、データベースに追加する前に、post 値に addslashes または mysql_real_escape_string を使用してください。

以下のリンクを見てください。

http://php.net/manual/en/function.addslashes.php

http://php.net/manual/en/function.mysql-real-escape-string.php

于 2012-06-30T14:03:02.900 に答える
1

まず、このコードには大きなセキュリティ上の欠陥があり、入力がサニタイズされていません。ユーザーは好きなものを挿入でき、チェックなしでDBで実行されます。これは悪いです。 少なくともmysql_real_escape_string() のようなものを使用する必要がありますが、それはジョブにとって最適なものではありません (Google PHP + PDO など)。

次に、実際には 1 つの変数を使用して 1 つのクエリを実行しています。$_POST['result'] が設定されている場合、$sql は常に最後の値になります。あなたがしたいことは、クエリを次のようにすることです:

$query = 'INSERT INTO scores ('.$fields.') VALUES ('.$values.')';

そして、if(!empty( .. )) コードを使用して $fields 変数と $values 変数を作成します。

ただし、繰り返しますが、入力をサニタイズします

于 2012-06-30T14:03:38.580 に答える
1

3 つの insert into ステートメントは 3 つのレコードを挿入し、未指定のフィールドは null またはデフォルトのままにします。次のような 1 つの insert into ステートメントを使用する必要があります。

  <?php
  $con = mysql_connect("*","*","*");
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("*", $con);
  @$sql="INSERT INTO scores (hometeam,awayteam,result) VALUES ('{$_POST[hometeam]}','{$_POST[awayteam]}','{$_POST[result]}')";



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

  mysql_close($con);
?>

ここでは、指定されていない値は空の文字列になります。それが問題になる場合は、最初に ifs を使用して 3 つの個別の変数に割り当ててから (たとえば、空の値を null に設定して)、それらを使用します。

于 2012-06-30T14:05:51.840 に答える
0
if (!empty($_POST['hometeam'])) {
  $sql="INSERT INTO scores (hometeam) VALUES ('" . $_POST['hometeam'] . "')";
}

「hometeam」の部分が一重引用符で囲まれていることに注意してください。を使用してそれをきれいにする必要もありますmysql_real_escape_string($_POST['hometeam'])

これにより、呼び出しごとに最大 3 行が作成されることに注意してください。スコア (ホームチーム、アウェーチーム、結果) のような行が必要な場合は、別の方法でクエリを作成する必要があります (つまり、3 つの個別のクエリではなく単一のクエリ)。

于 2012-06-30T14:02:48.767 に答える