1

我有一个 HTML 表单,它将值提交到以下 PHP 文件,该文件将它们插入 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

不要在查询中引用它们。相反,首先构建变量,并将引号附加到查询之外的转义字符串值,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);

从长远来看,建议开始使用支持预处理语句的 MySQL API,如 PDO 或 MySQLi。它们提供更好的安全性,可以更优雅地处理输入 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 回答
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。

此外,正如迈克尔所说,如果您继续使用 PDO 或 mysqli 扩展,它会更安全、更好。希望我的回答有帮助。

于 2012-07-01T13:07:12.820 回答
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 回答