警告:遇到非数字值

Imr*_*que 94 php

最近更新到PHP 7.1并开始收到以下错误

警告:第29行遇到非数字值

这是第29行的样子

$sub_total += ($item['quantity'] * $product['price']);
Run Code Online (Sandbox Code Playgroud)

在localhost一切正常..

任何想法如何解决这个或它是什么?

Yas*_*azk 160

不完全是您遇到的问题,但搜索人员的错误相同.

当我在JavaScript上花费太多时间时,这发生在我身上.

回到PHP我用" +"而不是" ." 连接两个字符串并得到了这个错误.

  • 这可恶的事情在2019年让我震惊了,哈哈。PHP的字符串连接需要重新构造! (10认同)
  • 在执行 nodejs 并返回 PHP 2 周后,我再次遇到了这个错误,哈哈 (7认同)
  • 一旦尝试将字符串与 `+` 连接,就会假定它是一个 `int` 值......而给定的操作数不是任何数字数据类型。 (3认同)
  • 我的天啊。我已经用谷歌搜索了几乎整整一个小时才发现我使用了“+”而不是“.”。谢谢! (3认同)

Dan*_*der 86

似乎在PHP 7.1中,如果遇到非数字值,将发出警告.看到这个链接.

以下是您收到的警告通知的相关部分:

当使用期望数字或其赋值等价物的运算符强制使用无效字符串时,引入了新的E_WARNING和E_NOTICE错误.当字符串以数字值开头但包含尾随的非数字字符时,将发出E_NOTICE,并 在字符串不包含数字值时发出E_WARNING.

我猜测$ item ['quantity']$ product ['price']不包含数值,所以在尝试将它们相乘之前确保它们确实存在.在计算$ sub_total之前可能会使用某种条件,如下所示:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用`$ sub_total + =((int)$ item ['quantity']*(int)$ product ['price']);` (5认同)
  • 公平地说,我不会关闭它,它是更有用的警告之一,实际上可以引导您找到错误 - 在我们的例子中,一个已经存在多年但未被注意到的错误。正如丹尼尔所说,只有当您尝试将数学应用于非数字字符串时才会出现。我没有看到这将是所需行为的情况。即“默认”* 86400 将等于 0 并且没有这个警告,除非您碰巧单步执行代码,否则您永远不会知道。 (4认同)
  • 我遇到了这个问题,因为我在asp中有一些加号我正在转移到PHP.按Ctrl + f并查找+字符. (2认同)
  • 谢谢。我正在开发一个旧的Symfony 1.4项目,似乎有一些地方是故意发生的,这很痛苦。这确实应该是php.ini中的一个标志,它允许您关闭此严格级别。 (2认同)

Rol*_*uhs 48

您可以在没有任何新逻辑的情况下通过将事物转换为数字来解决问题,这可以防止警告并且等同于PHP 7.0及更低版本中的行为:

$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Run Code Online (Sandbox Code Playgroud)

(Daniel Schroeder的答案并不等同,因为如果遇到非数字值,$ sub_total将保持未设置状态.例如,如果打印出$ sub_total,则会得到一个空字符串,这在发票中可能是错误的.你确保$ sub_total是一个整数.)

  • 这是一个坏习惯。您需要过滤输入 (3认同)
  • 这似乎是最好的答案.而且你知道这些值来自数据库,你可能不需要逃避. (3认同)
  • @Ciro Vargas:这取决于应用程序.在许多情况下,您希望将未定义的整数解释为零.无论如何,这相当于PHP7.0的行为,并且不需要重写代码.(接受的答案确实需要重写.) (3认同)
  • Just(int)$ var在php 7.1.8上为我修复了谢谢 (2认同)
  • ***** * PRICE *应该(浮动)应该输入! (2认同)

Cod*_*ife 17

在我的情况下,因为我使用"+"和其他语言一样,但在PHP字符串连接oprator是"." .

  • 先生,您真棒!非常感谢 (2认同)

Jod*_*hop 12

您好, 在我使用 (WordPress) 和 PHP7.4 的情况下,我收到有关数值问题的警告。所以我将旧代码更改如下:

从:

$val = $oldval + $val;

到:

$val = ((int)$oldval + (int)$val);

现在警告消失了:)


Ajm*_*mir 6

我的分页向前和向后链接有这个问题......只需在变量 $Page+1 前面设置 (int ) 并且它工作......

<?php 
$Page = (isset($_GET['Page']) ? $_GET['Page'] : '');
if ((int)$Page+1<=$PostPagination) {
?>
<li> <a href="Index.php?Page=<?php echo $Page+1; ?>"> &raquo;</a></li>
<?php }
?>
Run Code Online (Sandbox Code Playgroud)


cod*_*ama 5

特别是在PHPMyAdmin上发生了这种情况.所以为了更具体地回答这个问题,我做了以下几点:

在文件中:

C:\ampps\phpMyAdmin\libraries\DisplayResults.class.php
Run Code Online (Sandbox Code Playgroud)

我改变了这个:

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];
Run Code Online (Sandbox Code Playgroud)

对此:

$endpos = 0;
if (!empty($_SESSION['tmpval']['pos']) && is_numeric($_SESSION['tmpval']['pos'])) {
    $endpos += $_SESSION['tmpval']['pos'];
}
if (!empty($_SESSION['tmpval']['max_rows']) && is_numeric($_SESSION['tmpval']['max_rows'])) {
    $endpos += $_SESSION['tmpval']['max_rows'];
}
Run Code Online (Sandbox Code Playgroud)

希望拯救某人有些麻烦......