PHP将空白插入MySQL数据库

时间:2012-07-01 12:46:23

标签: php mysql

我有一个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
结果:赢了

我已经花了好几个小时寻找解决方案。有人可以帮忙吗?谢谢。

5 个答案:

答案 0 :(得分: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_*()函数很快就会被弃用。

答案 1 :(得分: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']) . "')";

答案 2 :(得分: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扩展,它会更安全,更好。希望我的回答有所帮助。

答案 3 :(得分:0)

或者,如果您有权访问db更改列(可选)并默认将它们设置为NULL。 即如果该列中没有插入任何内容,则默认情况下将显示NULL。

答案 4 :(得分:0)

为什么不用'null'替换''和其他无效形式的数据?

OR

检查$ _POST ['data']是否等于''或''如果为true,则将它们设置为'null'。

另外, 而不是mysql_real_escape_string,使用PHP函数'addslashes'。