【问题标题】:PHP: Call to a member function format() on boolean... whatPHP:在布尔值上调用成员函数格式()......什么
【发布时间】:2017-08-03 22:14:09
【问题描述】:

我正在编辑我的控制器脚本以使其运行得更快,行数更少。我有一个完全可以正常工作的版本,但是修改后的版本一直出现这个错误,它指向这一行:

echo Datetime::createFromFormat('m-d-Y',$prodDate[3])->format('Y-m-d');

奇怪的是页面会显示日期,然后调用错误。所以回显会运行,但是它说错误在这一行......

错误行之前的行:

$prodName = explode("@", $product['name']);
$prodDate = explode(" ",$prodName[1]);

所以我拆分一个字符串来查找日期。字符串格式为:xxx @ yyy 日期。我正在分解它以找到'xxx',然后使用包含'yyy date'的分解数组的[1]索引来查找'date'

当我回显 $prodDate[3] 时,它成功检索到日期。然后,我想将此日期存储到我的 mysql 表中,以便我使用时

 echo Datetime::createFromFormat('m-d-Y',$prodDate[3])->format('Y-m-d');

我只是不知道问题出在哪里...原始脚本(有效的脚本)看起来与此类似,并且完全可以正常工作

【问题讨论】:

  • 检查$prodDate[3] 的输出,因为它似乎会导致错误。用字符串替换变量,它工作正常:echo Datetime::createFromFormat('m-d-Y', '12-23-2017')->format('Y-m-d');
  • 如果它显示日期然后报告错误,则错误必须与 echo 位于不同的行。
  • 如果$prodName[1] 包含yyy date,那么日期应该是$prodDate[1],而不是$prodDate[3]
  • 是的,它输出:“0017-08-27”但是它说错误就在那一行o.O
  • prodDate[1] 输出“yyy”中的“y” prodDate[3] 输出正确的实际日期

标签: php mysql opencart


【解决方案1】:

在您发布的评论中,您的日期变量实际上返回 8-27-17

因此,您需要将格式中的字符定义从 更改为

n-j-y

像这样;

echo Datetime::createFromFormat('n-j-y', '8-23-17')->format('Y-m-d');
// Returns 2017-08-23

如果你以不正确的格式运行,你会得到以下结果

echo Datetime::createFromFormat('m-d-Y', '8-23-17')->format('Y-m-d'); 
// Returns 0017-08-23

由于格式错误,返回将是 false - 表示您正在尝试格式化布尔值,因此出现错误。

之前也在这里讨论过 - 大多数情况下,最佳答案都复制了这一点。

Why does DateTime::createFromFormat() fails and returns a boolean in my second example?

【讨论】:

  • 我像你说的那样改变了格式,使用'n-j-y'错误仍然存​​在..但是,条目已成功添加到表中
  • 那么其中一个变量可能不正确。如果没有看到你的脚本作为一个整体,有一个潜在的日期范围,我只是假设。也许月份总是 2 位数?你能确认一个月是否是0X格式吗?如果需要,格式为n-m-y。如果可能的话,我们真的可以在该范围内处理更多日期。
【解决方案2】:

注意 PHP 的 createFromFormat 函数 returns FALSE on error。您可能需要检查 $prodDate[3] 是否真的是一个日期。使用get_classinstanceof

请进一步注意,您的格式是错误的。应该是:

echo Datetime::createFromFormat('m-d-y',$prodDate[3])->format('Y-m-d');

(第一个不是“m-d-Y”而是“m-d-y”)

【讨论】:

  • 当我回显 $prodDate[3] 时,它说:“8-27-17”在原始工作脚本中,我使用的变量还包含“8-27-17”这个怎么来不工作?
  • 格式错误。必须是 08-27-2017 - 否则您没有使用正确的格式变量;
  • 我认为这不是问题所在。原工作脚本成功将“8-27-17”格式化为mysql Date,并输入到表中
  • “Y”是一整年。 “8-27-17”不是“m-d-Y”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2018-12-17
相关资源
最近更新 更多