警告:在第29行遇到非数字值
这是哪一行29看起来像
$sub_total += ($item['quantity'] * $product['price']);
在localhost上都可以正常工作。.
有什么办法解决这个问题或它是什么吗?
#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; ?>"> »</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>";
评论
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;