遇到格式不正确的数值

Posted

技术标签:

【中文标题】遇到格式不正确的数值【英文标题】:A non well formed numeric value encountered 【发布时间】:2011-09-02 10:43:21 【问题描述】:

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

这是我使用以下的时候

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

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

【问题讨论】:

您需要发布$_GET['start_date'] 包含的内容。 我假设您的 $_GET['start_date'] 不是 timestamp 预期的 date 函数作为第二个参数 JohnP 是正确的。这个问题不清楚,需要调试详细信息,因为minimal reproducible example 不完整。结果,这个页面被关于正确解决方案的疯狂猜测变得臃肿。这种混乱对研究人员来说是不愉快的。有趣的是,古老而糟糕的问题能获得如此多的 UV —— 只是时间问题和不知情的投票。 【参考方案1】:

因为您将字符串作为第二个参数传递给日期函数,它应该是一个整数。

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

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

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

【讨论】:

我在一个类的构造函数中遇到了同样的错误,我正在调试,这个构造函数中的问题是我接收到一个参数和整数public function __construct(int $someId....) 随着 PHP 中的参数输入变得越来越“规范”,@MarcosDiPaolo 提到的内容肯定会更频繁地出现。一个致命的赠品是堆栈跟踪将指向错误键入的参数声明行。 我还是不明白@parttimeturtle 的做法是什么 @MarcosDiPaolo 传递给该构造函数的参数类型必须与函数定义中暗示的类型相匹配。字符串表示的“4”不同于整数表示的4。所以要么符合函数定义,要么关闭严格类型,如果你真的需要合并“相似”值,例如字符串 "4" 到整数 4。 PDO_Statement::bindParam() 当第四个参数不是 (int) 时也会抛出这个【参考方案2】:

当您使用字母和数字(字母数字)组合的变量执行计算时会出现此错误,例如 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);

函数fix_integer_overflow

// Fix for overflowing signed 32 bit integers,
// works for sizes up to 2^32-1 bytes (4 GiB - 1):
protected function fix_integer_overflow($size) 
    if ($size < 0) 
        $size += 2.0 * (PHP_INT_MAX + 1);
    
    return $size;

【讨论】:

您似乎在回答另一个问题,而不是在此页面顶部发布的问题。请只回答被问到的问题。这就是我们要求提问者提供minimal reproducible example 的原因——这样答案就不会分裂成一千个不同的方向。 函数依赖外部代码...$ this-&gt; fix_integer_overflow是做什么的? 嗨 Lorenzo Magon,我添加了函数fix_integer_overflow,所以你可以看到它的用途【参考方案3】:

$_GET['start_date'] 我敢打赌不是数字,而是strtotime 不支持的日期格式。您需要将日期重新格式化为strtotime 的可用格式或使用explode/mktime 的组合。

如果您愿意发布您当前收到的格式,我可以给您添加一个示例。

【讨论】:

强制转换无法解决问题,因为 PHP 会在传递给方法时自动强制转换。 我喜欢您指出问题中没有足够的细节来提供准确的答案。这是因为minimal reproducible example 不完整;所以这个问题应该被关闭而不是回答。让用户发布一个完整的问题并不难,但如果志愿者提前开始回答//猜测,他们将不会有这样做的动力。【参考方案4】:

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

【讨论】:

我们不知道这种技术是否能解决 OP 的问题,因为 OP 没有说明输入数据的值。【参考方案5】:

这对我帮助很大 -

$new_date = date_format(date_create($old_date), 'Y-m-d');

在这里,date_create() 为您提供给定日期的日期对象,date_format() 将其设置为给定格式。

例如,

<?php
    $date = date_create("13-02-2013");  // DateTime Object ( [date] => 2013-02-13 00:00:00.000000 [timezone_type] => 3 [timezone] => America/New_York )
    echo date_format($date,"Y-m-d");    // 2013-02-13
?>

【讨论】:

如果您解释一下您的 sn-p 以及为什么它对您有帮助,这将对研究人员有很大帮助。 您如何确定这种技术对所提出的问题有效? OP 尚未声明输入数据。【参考方案6】:

这是一个老问题,但这条消息还有另一种微妙的方式。解释得很好here, in the 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-&gt;getCode() 的返回类型动态更改为字符串。

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

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

【讨论】:

解释异常处理可能有助于理解问题,但不能解决问题。这不是答案,因为它不会尝试解决所提出的问题。【参考方案7】:

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

【讨论】:

没有迹象表明 OP 的值包含逗号。你在猜测问题。在这种情况下,您应该要求 OP 澄清minimal reproducible example 而不是发布答案。【参考方案8】:

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

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits

【讨论】:

您在猜测$start_date 的值。如果它是08/08/2020,那么将其转换为整数或浮点数根本无济于事。而不是回答这个问题,正确的做法是在问题下留下评论,要求 OP 表达确切的输入数据。 $end_suggest_time = (int) $rowone['start_suggest_time'] + (24 * 3600);当我在 $rowone 的前面添加 (int) 时,我没有收到此错误“注意:遇到的格式不正确的数值”【参考方案9】:

以宇宙程序员的名义

在我的情况下,我收到此错误“注意:遇到格式不正确的数值”

我的代码出现上述错误:

$end_suggest_time = $rowone['start_suggest_time'] + (24 * 3600);

当我在 $rowone['start_suggest_time'] 的前面添加 (int) 时,我没有收到此错误“注意:遇到格式不正确的数值”

$end_suggest_time = (int) $rowone['start_suggest_time'] + (24 * 3600);

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于遇到格式不正确的数值的主要内容,如果未能解决你的问题,请参考以下文章

PHP注意:遇到格式不正确的数值[重复]

Razorflow Php 错误:遇到格式不正确的数值

UART蓝牙通信问题 向UART发送数据的正确格式是啥(整数值)

带逗号和两位小数的数值格式

在 Presto SQL 中将整数值转换为日期

JAVA金额格式字符串转数值