遇到格式不正确的数值


120

我有一个将两个日期(开始和结束)传递给PHP脚本的表单,该脚本会将这些日期添加到数据库中。我在验证此问题时遇到问题。我不断收到以下错误

遇到格式不正确的数值

这是当我使用以下

date("d",$_GET['start_date']);

但是,当我按照许多站点的建议使用strtotime()函数时,我得到的unix时间戳日期为1970年1月1日。有什么想法可以找到正确的日期吗?


5
您需要发布$_GET['start_date']包含的内容。
JohnP 2011年

1
我认为您$_GET['start_date']时间戳不是date函数期望的第二个参数
Nemoden

在这种情况下
DChaplin

当试图从我没有加入上表中选择。我得到这个
康纳水蛭

Answers:


225

因为您要将字符串作为第二个参数传递给date函数,所以它应该是整数。

字符串日期(字符串$ format [,int $ timestamp = time()])

尝试使用strtotime,它将任何英语文本日期时间描述解析为Unix时间戳(整数):

date("d", strtotime($_GET['start_date']));

1
我在类的构造函数中遇到了相同的错误,我正在调试,而该构造函数中的问题是我收到的是参数和整数public function __construct(int $someId....)
Marcos Di Paolo

随着PHP中的参数键入变得越来越“规范”,@ MarcosDiPaolo提到的内容肯定会更常见。毫无用处的是,堆栈跟踪将指向被错误键入的参数声明行。
parttimeturtle

我仍然不明白这里的行动方针@parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo传递给该构造函数的参数的类型必须与函数定义中提示的类型匹配。字符串表示的“ 4”与整数表示的4不同。因此,无论符合函数定义或关闭严格的类型,如果你真的需要凝聚“类似”的值,例如字符串“4”整数4
parttimeturtle

9

只需使用strtotime()函数即可解决此问题。

date("d", strtotime($_GET['start_date']));


5

我遇到了同样的情况(在我的情况下,在Drupal视图的自定义PHP字段中有一个日期值),对我有用的是使用intval而不是strtotime将值转换为整数-因为它基本上是一个时间戳记,但采用字符串形式而不是整数形式。显然并不是每个人都这样,但是可能值得尝试。


5

当您对使用字母和数字(字母数字)组合的变量执行计算时,会发生此错误,例如24kb,886ab ...

我在以下功能中有错误

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

该应用程序上传了图像,但没有工作,它显示以下警告:

在此处输入图片说明

解决方案:intval()函数提取具有字母数字数据的变量的整数值,并创建一个具有相同值但通过该intval()函数转换为整数的新变量。这是代码:

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}


1

这是一个古老的问题,但是还有另一种微妙的方式可以发生此消息。在docs中对此进行了很好的解释。

想象一下这个场景:

try {
  // code that triggers a pdo exception
} catch (Exception $e) {
  throw new MyCustomExceptionHandler($e);
}

MyCustomExceptionHandler大致定义为:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage(), $e->getCode());
  }
}

实际上,这将在自定义异常处理程序中触发新的异常,因为Exception该类在其构造函数中期望第二个参数有一个数字,但PDOException可能已将返回类型动态更改$e->getCode()为字符串。

一种解决方法是定义自定义异常处理程序,例如:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage());
    $this->code = $e->getCode();
  }
}

1

如果仅包含数字,则传递字符串不一定是问题。

发生这种情况的另一个原因是,如果前后有空格。例如“ 1557399276”


0

如果错误是在进行任何计算时,请仔细检查这些值是否不包含任何逗号(,)。值只能为整数/浮点数格式。


0

您需要使用date_default_timezone_set()设置时区。


0

就我而言,这是sem_get的关键

sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [,
          int $auto_release = 1 ]]] 
          ) : resource

$ key应该是一个int,否则会出现以下错误:

PHP注意:在中遇到的格式不正确的数值


0

如果$ _GET ['start_date']是字符串,则将其转换为整数或双精度以进行数字处理。

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.