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

5 に答える 5

1

mysql データベースからNULLIF関数を使用できます。それが行うことは、2 つのパラメーターを取り、それらが同じ場合は null を返すことです。したがって、基本的には、コードを次のように変更できます。

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

基本的に、入力された値が '' (空の文字列) であるかどうかをチェックし、そうである場合は代わりにデータベースに NULL を保存します。NULLIF に渡す前に、変数から先頭または末尾のスペースを削除することもできるため、誰かが入力ボックスにスペースのみを入力した場合でも、NULL が保存されます。

また、Michael が言ったように、PDO または mysqli エクステンションに移行した方が安全で優れています。私の答えが役立つことを願っています。

于 2012-07-01T13:07:12.820 に答える
1

クエリ内でそれらを引用しないでください。代わりに、最初に変数を作成し、クエリの外側でエスケープされた文字列値に引用符を追加して、NULL文字列が空の場合にキーワードを挿入できるようにします。

// If any is not set or empty in the POST, assign the string "NULL" unquoted to a variable
// which will be passed to MySQL as the unquoted NULL keyword.
// Otherwise escape the value from $_POST and surround the escaped value in single quotes
$ateam = !empty($_POST['awayteam']) ? "'" . mysql_real_escape_string($_POST['awayteam']) . "'" : "NULL";
$hteam = !empty($_POST['hometeam']) ? "'" . mysql_real_escape_string($_POST['hometeam']) . "'" : "NULL";
$result = !empty($_POST['result']) ? "'" . mysql_real_escape_string($_POST['result']) . "'" : "NULL";

// Then pass the three variables (already quoted if necessary) directly to the query.
$sql="INSERT INTO scores (hometeam, awayteam, result) VALUES ($hteam, $ateam, $result);

長期的には、PDO や MySQLi などの準備済みステートメントをサポートする MySQL API の使用を開始することをお勧めします。それらはより優れたセキュリティを提供し、入力 NULL をよりエレガントに処理でき、古いmysql_*()関数はまもなく非推奨になります。

于 2012-07-01T12:51:20.817 に答える
1

コードで、次を置き換えます。

$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($_POST['awayteam'] == '')
 $awayteam = 'NULL';
else
 $awaytem = "'" . mysql_real_escape_string($_POST['awayteam']) "'";
$sql="INSERT INTO scores (hometeam, awayteam, result)
  VALUES
  ('" . mysql_real_escape_string($_POST['hometeam']) . "',
   " . $awayteam . ",
   '" . mysql_real_escape_string($_POST['result']) . "')";
于 2012-07-01T12:52:57.440 に答える
0

または、dbにアクセスできる場合は、列(オプション)を変更し、デフォルトでNULLとして設定します。つまり、その列に何も挿入されていない場合、デフォルトでNULLが表示されます。

于 2012-07-01T13:00:07.173 に答える
0

「 」やその他の無効な形式のデータを「null」に置き換えてみませんか?

また

$_POST['data'] が ' ' または '' と等しいかどうかを確認し、真の場合は 'null' に設定します。

また、mysql_real_escape_string の代わりに、PHP 関数 'addslashes' を使用します。

于 2012-07-01T13:04:55.003 に答える