遇到格式不正确的数值
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-> 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->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() 设置时区。
【讨论】:
以上是关于遇到格式不正确的数值的主要内容,如果未能解决你的问题,请参考以下文章