【问题标题】:PHP: Trying to insert dates in DatabasePHP:试图在数据库中插入日期
【发布时间】:2021-07-27 14:36:14
【问题描述】:

我想将开始日期和结束日期之间的所有日期插入到我数据库中的表中。

我已经找到two dates and the dates between 的代码。

现在的问题是运行代码时日期没有插入到我的数据库中。我的日期表中只显示0000-00-00

运行代码时也没有出现错误消息,所以我不知道我在哪里犯了错误。有人可以帮我解决这个问题吗?

这是我的代码:

$begin = new DateTime('2010-05-01');
$end = new DateTime('2010-05-10');

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

foreach ($period as $dt) 
{
  $newdate = $dt->format("Y-m-d ");

  $statement = $pdo->prepare("INSERT INTO table (date) VALUES ($newdate)");
  $statement->execute();
}

【问题讨论】:

  • 这不是使用准备好的语句的方式。请看:php.net/manual/en/pdo.prepared-statements.php
  • 对准备好的语句使用适当的值绑定,如 KIKO 所述。即使您想在没有占位符的情况下进行此操作,也应像 "INSERT INTO table (date) VALUES ('$newdate')" 一样引用日期值,如果您要正确使用绑定,则需要像 "INSERT INTO table (date) VALUES (:newdate)" 那样取消引用占位符
  • 这能回答你的问题吗? SQL date format and quoting confusion
  • @biesior 这是有用的背景阅读,但恕我直言,它并没有直接复制它,因为参数化是 PHP 上下文中更好的全面解决方案 :-)
  • @ADyson 当然,这是一个更好的选择,但在提到的代码中,严格的问题是缺少引号,在这种情况下,准备语句不是必需的,因为我们不能期望从 DateTime 对象注入 SQL ;)

标签: php sql date pdo


【解决方案1】:

您忘记用单引号将 SQL 中的日期值括起来。因此 SQL 引擎试图将您的输入视为数字,但它不能(因为显然日期不是有效数字)。

但无论如何,您都不应该在查询中包含原始数据。使用参数可以大大降低您犯此类简单语法错误的可能性(以及在处理外部数据输入时保护您的数据免受 SQL 注入)。

$statement = $pdo->prepare("INSERT INTO table (date) VALUES (:newdate)");
$statement->bindParam(':newdate', $newdate);
$statement->execute();

PHP manual on using prepared statements

附:如果您的代码由于 SQL 错误而引发错误,您可能看不到它,除非您在创建连接时有 switched on PDO exception handling

【讨论】:

  • 非常感谢。这确实有助于解决我的问题。我搜索了几个小时,并没有在互联网上找到任何解决方案。非常感谢你让我开心。
  • @Gandalthegrey 没问题。如果答案对您有所帮助,请记住将其标记为“已接受”,这样它就给了回答者的功劳,也向未来的读者表明该解决方案是有效的。请参阅stackoverflow.com/tourstackoverflow.com/help/someone-answers 以获得进一步的指导。谢谢。
  • 如果答案符合您的要求,请接受并投票。顺便说一句,在询问之前应该搜索一些基础知识,例如在 SQL 语句中使用引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2011-08-08
  • 2011-04-07
  • 2020-03-14
  • 1970-01-01
相关资源
最近更新 更多