【问题标题】:"datetime-local" null input causes MySQL query to fail“datetime-local” null 输入导致 MySQL 查询失败
【发布时间】:2017-06-20 12:25:33
【问题描述】:

在我的网站上,托管在 LAMP 堆栈上,我有一个简单的 html POST 表单,其中包含一堆输入和两个 datetime-local 输入

<form>
...
    <input id="PublicationDate" type="datetime-local" name="PublicationDate"/>
    <input id="ExpirationDate" type="datetime-local" name="ExpirationDate"/>
...
</form>

这些输入与 MySQL 表中的两个 Datetime 字段匹配:

...
PublicationDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
ExpirationDate DATETIME,

使用这个 php 代码:

// Prepare query
$Query = $this->DB->prepare("
INSERT INTO Article(Title, Subtitle, Author, PublicationDate, ExpirationDate, Body)
VALUES(?, ?, ?, IFNULL(?, NOW()), ?, ?)");
$Query->bindParam(1, $Data["Title"]);
$Query->bindParam(2, $Data["Subtitle"]);
$Query->bindParam(3, $Username);
$Query->bindParam(4, $Data["PublicationDate"]); // <-
$Query->bindParam(5, $Data["ExpirationDate"]); // <-
$Query->bindParam(6, $Data["Body"]);

一开始,使用相同的 MySQL/Php 设置,但没有 html 表单中的实际字段,一切正常:PublicationDate 设置为 NOW()ExpirationDateNULL

添加字段后,如果我将这些字段留空(以便将 NOW()NULL 作为值)查询将失败。

我认为这个问题是由 datetime-local 输入引起的,因为我可以将 Subtitle 字段留空以便将相应的 MySQL 行设置为 @ 987654328@。知道如何解决这个问题吗?

编辑:

$Data 数组是作为参数传递给函数的 $_POST 数组

【问题讨论】:

    标签: php mysql forms datetime


    【解决方案1】:

    当您插入它时,您正在检查其中一个值是否为 NULL,而另一个则根本不检查。

    但是,当发送表单时,值不会为 NULL,它们将是空字符串,因此如果它们为空,您可能希望将它们设置为 NULL:

    $Query->bindParam(4, $Data["PublicationDate"] ?: null);
    $Query->bindParam(5, $Data["ExpirationDate"] ?: null);
    

    请注意,这是非常基本的,您应该为您的字段添加真正的验证,以检查它们是否符合您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2016-06-21
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多