【问题标题】:PHP inserting blanks into MySQL databasePHP在MySQL数据库中插入空格
【发布时间】:2012-07-01 21:07:12
【问题描述】:

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

我花了好几个小时寻找解决方案。任何人都可以帮忙吗?谢谢。

【问题讨论】:

  • 我猜你的意思是检查输入以进行验证?
  • 不要添加两个引号,而是添加不带引号的 NULL,

标签: php mysql


【解决方案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 扩展,它会更安全、更好。希望我的回答有帮助。

【讨论】:

  • +1 表示 NULLIF,尽管是标准 SQL,但遗憾的是有些晦涩。
【解决方案2】:

在您的代码中,替换:

$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']) . "')";

【讨论】:

    【解决方案3】:

    不要在查询中引用它们。相反,首先构建变量,然后将引号附加到查询之外的转义字符串值,如果字符串为空,您可以插入 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_*() 函数很快就会被弃用。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 当前代码总是在列中插入一个值(有时是空字符串),所以你的想法行不通。
      【解决方案5】:

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

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

      另外, 使用 PHP 函数 'addslashes' 代替 mysql_real_escape_string。

      【讨论】:

      • addslashes 不得用于转义 mysql 查询中使用的字符串! mysql_real_escape_string 的存在是有原因的!
      • 不,不鼓励使用mysql_real_escape_string
      • Nahiyan,来自 PHP 文档:出于安全原因,应使用 DBMS 特定的转义函数(例如 MySQL 的 mysqli_real_escape_string() 或 PostgreSQL 的 pg_escape_literal()、pg_escape_string())转义数据库参数。 DBMS 对标识符(例如表名、字段名)的转义规范与参数不同。一些 DBMS 如 PostgreSQL 提供标识符转义函数 pg_escape_indentifier(),但并非所有 DBMS 都提供标识符转义 API。如果是这种情况,请参阅您的数据库系统手册以了解正确的转义方法。
      猜你喜欢
      • 2015-01-02
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多