【问题标题】:PHP MYSQL - empty variable fails on insertPHP MYSQL - 插入时空变量失败
【发布时间】:2011-11-19 12:28:10
【问题描述】:

我有一个插入语句,它插入从前一页的表单 POST 中收集的变量。如果未填写表单中的变量,则插入失败(可能是因为它正在插入一个空字符串......)我将数据类型设置为允许 NULL 值 - 如果该字段为空,我如何插入空值POST 形式?

$query = "
INSERT INTO songs (
    userid,
    wavURL,
    mp3URL,
    genre,
    songTitle,
    BPM
) VALUES (
    '$userid',
    '$wavFile',
    '$mp3File',
    '$genre',
    '$songTitle',
    '$BPM'
)
";

$result = mysql_query($query);

【问题讨论】:

  • 你能给我们看一些代码吗?和一些 PHP 代码($userid 在哪里创建或 $wavFile 分配)?
  • $songTitle = (empty($songTitle) || null === $songTitle) ? "NULL" : $songTitle;
  • @tttony:两个更正:a)|| null === $songTitle 部分是多余的,b)您需要在最后加上引号 $songTitle,它将进入 SQL 查询。跨度>
  • @jon 你说得对$songTitle = (empty($songTitle)) ? "NULL" : "'" . $songTitle . "'"; 我对empty 不是很熟悉@ 我认为这个函数只是评估空$vars = "";

标签: php mysql


【解决方案1】:

具体的方式取决于您是否将查询或绑定参数写入准备好的语句。

如果你自己写,它看起来像这样:

$value = empty($_POST['bar']) ? null : $_POST['bar'];
$sql = sprintf('INSERT INTO foo (bar) VALUES (%s)',
             $value === null ? 'NULL', "'".mysql_real_escape_string($value)."'");

$result = mysql_query($sql);

主要的一点是,如果值应该为 null,则需要传入字符串 NULL(不带引号),如果值应为“val”,则需要传入字符串 'val'。请注意,由于我们在 PHP 中编写字符串文字,因此在这两种情况下,源代码中都会多出一对引号(这在第一种情况下是一对,在第二种情况下是两对)。

警告:当直接从请求变量插入数据库时​​,很容易受到 SQL 注入攻击。 不要成为另一个受害者; read about how to protect yourself 并实施一种普遍接受的解决方案。

【讨论】:

    【解决方案2】:

    据我所知,当某些东西没有被填充时,post 变量没有设置为空值,而是根本没有设置,所以在 php 中你可以这样做:

    $genre = isset($_POST['genre']) ? $_POST['genre'] : NULL;
    

    【讨论】:

    • 我不相信这是真的。如果用户没有填写输入,该变量仍会被发布,但只是一个空字符串。 php 函数 empty() 可以在这里工作,但 isset() 会返回 true,因为设置了变量,即使没有 ant 字符串值。
    • 你说得对,我只是做了一个小测试,我说的是针对$_GET,用$_POST var_dump显示一个长度为0的空字符串。
    【解决方案3】:

    这就是我的做法。我不喜欢直接从 POST 向 SQL 查询发送任何内容(总是清理!)在下面的案例中,您只需一个接一个地运行 POST 变量并将它们分配给辅助数组,同时检查长度为 0 的字符串并将它们设置为空。

    foreach ($_POST as $key => $value) {
       strlen($value)=0 ? $vars[$key] = NULL : $vars[$key] = $value
     }
    

    然后您可以从新创建的 $vars[] 数组构建您的 SQL 查询。

    正如 Jon 上面所说,这也是转义字符串、剥离代码以及在数据插入数据库之前进行所有服务器端验证的地方。

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多