警告:遇到非数字值


122

最近更新到PHP 7.1,并开始出现以下错误

警告:第29行遇到非数值

这是第29行的样子

$sub_total += ($item['quantity'] * $product['price']);

在本地主机上一切正常。

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


4
var_dump($item['quantity'], $product['price'])
u_mulder

2
看起来像PHP 7中的新警告(如您所知)。php.net/manual/en/migration71.other-changes.php 当您收到错误消息时,这些变量是否具有值?我认为您可以通过将它们初始化为0来避免它
。– tjfo

1
@MichaelHanon您所指的答案在哪里?语法错误是什么?
FKEinternet

1
$ sub_total + =((int)$ item ['quantity'] *(int)$ product ['price']);
我是最愚蠢的人

我使用像a = a + b这样的旧格式;或str = str。“ <a href='".str2."'> asd </a>”; 或$ this-> storeItems = $ this-> storeItems。$ str;
saber tabatabaee yazdi”,

Answers:


105

似乎在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...
}

2
我遇到了这个问题,因为我转移到PHP的asp中仍然有一些加号。Ctrl + f并查找+字符。
MH

有没有办法通过php.ini关闭此警告?
BeniRose17年

3
谢谢。我正在做一个旧版Symfony 1.4项目,似乎有一些地方是故意发生的,这很痛苦。这确实应该是php.ini中的一个标志,它允许您关闭此严格级别。
BeniRose

9
另外,您也可以使用$sub_total += ((int)$item['quantity'] * (int)$product['price']);
我是最愚蠢的人

2
公平地说,我不会将其关闭,它是实际上可以导致您发现错误的更有用的警告之一-在我们的情况下,该警告已经存在多年且未被发现。正如Daniel所说,只有在您尝试将数学应用于非数字字符串时,它才会出现。我看不到这种情况是理想的行为。即“默认” * 86400等于0,并且没有此警告,除非碰巧浏览代码,否则您永远不会知道。
史蒂夫·柴尔德斯

230

与您遇到的问题不完全相同,但是对于搜索对象来说却存在相同的错误。

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

回到PHP,我用“ +”而不是“ .” 连接了两个字符串,并得到了该错误。


24
这该死的东西让我在2019年惊呆了,哈哈。PHP的字符串连接需要重新构造!
丹尼尔·达特

2
在这里,在执行nodejs并返回PHP 2周后,我再次遇到了此错误,大声笑
imin19,2005年

3
一旦尝试将字符串与a串联+,就假定它是一个int值...而给定的操作数则不是任何数字数据类型。
马丁·泽特勒

1
哈哈,我也发生了同样的事情,我花了太多时间在JS上,而当涉及到PHP时,我尝试使用JS代码。但是PHP解释器不允许我这样做。
Hemant Sankhla

1
哦,我的上帝。我已经搜查了近一个小时,才发现我用的+不是.。谢谢!
marvinpoo

52

您可以通过将事物强制转换为数字来解决问题,而无需任何新逻辑,这可以防止出现警告,并且等同于PHP 7.0及以下版本中的行为:

$sub_total += ((int)$item['quantity'] * (int)$product['price']);

(Daniel Schroeder的回答并不相同,因为如果遇到非数字值,$ sub_total将保持不变。例如,如果打印出$ sub_total,您将得到一个空字符串,这在发票中可能是错误的。强制转换,请确保$ sub_total是整数。)


4
这是一个坏习惯。您需要过滤您的输入
Ciro Vargas

3
这似乎是最好的答案。对于所有您知道这些值都来自数据库的情况,您可能不需要转义。
MH

3
@Ciro Vargas:取决于应用程序。在许多情况下,您希望将未定义的整数解释为零。无论如何,这等效于PHP7.0的行为,并且不需要重写代码。(接受的答案确实需要重写。)
Roland Seuhs

@RolandSeuhs我不确定我是否遵循,当将两个字符串相乘时,'24'*'10'将在PHP中产生240,'24'* null将产生0,但是'24'*'cat'将引发提到的错误上面的内容是因为“ cat”是一个非数字值。您可以将“ cat”转换为int,但这也不会给您有意义的小计。至于我的解决方案,它可以确定数量和价格是否为数字。如果它们是字符串'24'和'10',则通过,但是如果它们是非数字字符串,则失败。小计的处理方式并不是我真正的目的,很抱歉,如果那样做的话。
DanielSchroederDev

3
***** PRICE应该是(float)应该放的!
Bhavin Rana

24

就我而言,这是因为与+其他语言一样使用了我,但是在PHP字符串中,串联运算符是.


5

这是发生在我身上的,特别是在PHPMyAdmin上。因此,为了更具体地回答这个问题,我做了以下工作:

在文件中:

C:\ampps\phpMyAdmin\libraries\DisplayResults.class.php

我改变了这个:

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

对此:

$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'];
}

希望能给别人省些麻烦...


4

我的分页前进和后退链接存在这个问题....只需在变量$ 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 }
?>

3

我在PHP 7.3的phpmyadmin中遇到了这个问题。谢谢@coderama,我将libraries / DisplayResults.class.php第855行从

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

进入

// Move to the next page or to the last one
$endpos = (int)$_SESSION['tmpval']['pos']
    + (int)$_SESSION['tmpval']['max_rows'];

固定。


3

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

从:

$val = $oldval + $val;

至:

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

现在警告消失了:)



1

试试这个。

$sub_total = 0;

现在您可以在循环中使用它

$sub_total += ($item['quantity'] * $product['price']);

它应该可以解决您的问题。


1

遇到此问题时,我只是看着此页面。对我来说,我有一个从数组计算出的浮点数,但是即使将变量指定为浮点后,仍然会给出错误,这是导致问题的简单的修复和示例代码。

PHP示例

<?php
$subtotal = 0; //Warning fixed
$shippingtotal = 0; //Warning fixed

$price = array($row3['price']);
$shipping = array($row3['shipping']);
$values1 = array_sum($price);
$values2 = array_sum($shipping);
(float)$subtotal += $values1; // float is irrelevant $subtotal creates warning
(float)$shippingtotal += $values2; // float is irrelevant $shippingtotal creates warning
?>

1
$sn = 0;//increment the serial number, then add the sn to job
for($x = 0; $x<20; $x++)
{
$sn++;
$added_date = "10/10/10";
$job_title = "new job";
$salary = $sn*1000;
$cd = "27/10/2017";//the closing date
$ins = "some institution";//the institution for the vacancy 
$notes = "some notes here";//any notes about the jobs

$sn_div = "<div class='sn_div'>".$sn."</div>";
$ad_div = "<div class='ad_div'>".$added_date."</div>";
$job_div = "<div class='job_div'>".$job_title."</div>";
$salary_div = "<div class='salary_div'>".$salary."</div>";
$cd_div = "<div class='cd_div'>".$cd."</div>";//cd means closing date
$ins_div = "<div class='ins_div'>".$ins."</div>";//ins means institution
$notes_div = "<div class='notes_div'>".$notes."</div>";


/*erroneous line*/$job_no = "job"+$sn;//to create the job rows
$$job_no = "<div class='job_wrapper'>".$sn_div.$ad_div.$job_div.$salary_div.$cd_div.$ins_div.$notes_div."</div>";

echo $$job_no;//and then echo each job

}

这就是我循环并创建新的html div元素的代码。代码工作正常,元素形成,但在error_log中得到了相同的警告。

在阅读了其他有用的答案之后,我发现我在错误的行中总结了一个字符串和一个数字。所以我将那一行的代码更改为

/*erroneous line*/$job_no = "job"&&$sn;//this is the new variable that will create the job rows

现在,代码可以像以前那样工作,但是这次没有警告。希望这个例子对某人有用。


1

解决WordPress上的此错误

警告:第694行的C:\ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php中遇到的非数字值

简单的解决方案在这里!

  1. 找到一个文件 wp-includes\SimplePie\Parse\Date.php
  2. 找到一条线 694
  3. 您显示代码 $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. 并将此3.)更改为此行 $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));

1
$sub_total_price = 0; 

foreach($booking_list as $key=>$value) {
        $sub_total_price += ($price * $quantity); 
}

echo $sub_total_price;

它正在工作100%:)


1

通常,当您用+符号组合字符串时,就会发生这种情况。在PHP中,您可以使用点号(。)进行串联。因此有时我不小心在PHP中的两个字符串之间加上了+号,这向我显示了此错误,因为您只能使用+号。



0

如果您的代码中遇到非数字值,请尝试以下一个。下面的代码转换为float。

$PlannedAmount = ''; // empty string ''

if(!is_numeric($PlannedAmount)) {
           $PlannedAmount = floatval($PlannedAmount);
 }

 echo $PlannedAmount; //output = 0

0

在PHP中,如果您使用+进行串联,则会出现此错误。在php +中算术运算符。 https://www.php.net/manual/zh/language.operators.arithmetic.php

+运算符的错误使用:

            "<label for='content'>Content:</label>"+
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>"+$initcontent+"</textarea>'"+                 
            "</div>";

使用串联

$output = "<div class='from-group'>".
            "<label for='content'>Content:</label>".
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>".$initcontent."</textarea>'".                 
            "</div>";
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.