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


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


这是哪一行29看起来像

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


在localhost上都可以正常工作。.

有什么办法解决这个问题或它是什么吗?

评论

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

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

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

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

我使用像a = a + b这样的旧格式;或str = str。“ asd ”;或$ this-> storeItems = $ this-> storeItems。 $ str;

#1 楼

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


评论


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

– M H
17年6月15日在15:24

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

–贝尼·罗斯
17年8月28日在16:49

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

–贝尼·罗斯
17年9月6日在16:16

或者,您可以使用$ sub_total + =((int)$ item ['quantity'] *(int)$ product ['price']);

–我是最愚蠢的人
18年2月13日在11:34

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

– Steve Childs
18-3-5在16:25



#2 楼



我遇到的错误并不完全是您遇到的问题,而是相同的错误。

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

回到PHP,我将两个串联带有“ +”而不是“ .”的字符串,并得到该错误。

评论


这可恶的东西让我在2019年惊呆了,哈哈。 PHP的字符串连接需要重组!

–丹尼尔·达特(Daniel Dut)
19年1月24日在5:54

在这里,在执行nodejs并返回PHP 2周后,我再次遇到此错误

–亚胺
19年2月25日在18:04

尝试将一个字符串与+串联后,就假定它是一个int值...而给定的操作数不是任何数字数据类型。

–马丁·齐特勒
19 Mar 3 '19在16:31



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

– Hemant Sankhla
19年6月26日在16:49

哦,我的上帝。我已经搜寻了将近一个小时,才发现我使用了+而不是..谢谢!

– marvinpoo
19年7月2日在9:04

#3 楼

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

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


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

评论


这是一个坏习惯。您需要过滤输入

– Ciro Vargas
17年5月25日在3:47

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

– M H
17年6月15日在15:32

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

–罗兰·苏伊斯(Roland Seuhs)
17年6月27日在12:24

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

–DanielSchroederDev
17年9月2日,3:10

***** PRICE应该是(float)应该放的!

–巴文·拉纳(Bhavin Rana)
18/12/12在4:31



#4 楼

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

#5 楼

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


#6 楼

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

来自:
$val = $oldval + $val;

收件人:

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

现在警告消失了:)

#7 楼

这是发生在我身上的,特别是在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'];
}


希望能为某人节省一些麻烦...

#8 楼

我在PHP 7.3中的phpmyadmin中遇到了这个问题。感谢@coderama,我将library / 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'];


已修复。

#9 楼

检查是否未使用某个变量递增其值是空字符串,如''。

示例:

$total = '';
$integers = range(1, 5);

foreach($integers as $integer) {
    $total += $integer;
}


评论


超级,这是大多数其他答案中都没有提到的情况。

–Trendfischer
19年2月28日在16:37

#10 楼

试试这个。

$sub_total = 0;


现在,您可以在循环中使用此了。

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


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

#11 楼

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

示例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
?>


#12 楼

$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


现在该代码可以更早地运行了,但是这次没有警告。希望此示例对某人有用。

#13 楼

解决WordPress上的此错误


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


这里的简单解决方案!


找到wp-includes\SimplePie\Parse\Date.php的文件

找到行号。 694
,显示代码$second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
,并将其更改为3.)到此行$second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));



#14 楼

$sub_total_price = 0; 

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

echo $sub_total_price;


100%可用:)

#15 楼

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

#16 楼

确保您的列结构为INT。

#17 楼

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

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

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

 echo $PlannedAmount; //output = 0


#18 楼

在PHP中,如果使用+进行串联,则最终将出现此错误。在php +中是算术运算符。
https://www.php.net/manual/zh-CN/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>";