경고 : 숫자가 아닌 값이 발견되었습니다.


122

최근 PHP 7.1로 업데이트되었으며 다음 오류가 발생하기 시작했습니다.

경고 : 29 행에 숫자가 아닌 값이 있습니다.

29 번 줄은 다음과 같습니다.

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

localhost에서 모두 잘 작동합니다 ..

이것을 해결하는 방법이나 그것이 무엇인지 어떤 아이디어?


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;
세이버 tabatabaee yazdi

답변:


106

PHP 7.1에서 숫자가 아닌 값이 발견되면 경고가 발생하는 것 같습니다. 이 링크를 참조하십시오 .

다음은 귀하가 받고있는 경고 통지와 관련된 관련 부분입니다.

숫자 또는 그에 상응하는 할당을 예상하는 연산자를 사용하여 유효하지 않은 문자열을 강제 할 때 새로운 E_WARNING 및 E_NOTICE 오류가 도입되었습니다. 문자열이 숫자 값으로 시작하지만 뒤에 숫자가 아닌 문자가 포함 된 경우 E_NOTICE가 발생하고 문자열에 숫자 값이 포함되지 않은 경우 E_WARNING이 발생합니다.

나도 같은데요 $ 항목 [ '수량'] 또는 $ 제품 [ '가격'] 확신 그들을 번성하기 전에 할 것을 확인, 숫자 값을 포함하지 않습니다. $ 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를 통해이 경고를 끄는 방법이 있습니까?
BeniRose

3
감사. 저는 레거시 Symfony 1.4 프로젝트를 작업 중이며, 이것이 의도적으로 발생하는 몇 군데가있는 것 같습니다. 이것은 실제로이 수준의 엄격함을 끌 수있는 php.ini의 플래그 여야합니다.
BeniRose

9
또는 사용할 수 있습니다$sub_total += ((int)$item['quantity'] * (int)$product['price']);
나는 가장 어리석은 사람입니다

2
공정하게 말하면,이 기능을 끄지 않을 것입니다. 실제로 버그를 찾을 수있는 더 유용한 경고 중 하나입니다. Daniel이 말했듯이 숫자가 아닌 문자열에 수학을 적용하려고 할 때만 나타납니다. 이것이 바람직한 행동 인 경우를 보지 못했습니다. 즉, "default"* 86400은 0과 같으며이 경고가 없으면 코드를 단계별로 실행하지 않으면 알 수 없습니다.
Steve Childs

230

정확히 당신이 가진 문제는 아니지만 검색하는 사람들에게 동일한 오류가 있습니다.

JavaScript에 너무 많은 시간을 할애했을 때 이런 일이 발생했습니다.

PHP로 돌아와서 " +"대신 " "로 두 문자열을 연결 .하고 오류가 발생했습니다.


24
이 망할 일이 2019 년에 나를 넘어 뜨렸다, LOL. PHP의 문자열 연결을 재구성해야합니다!
Daniel Dut

2
그리고 여기서 nodejs를 수행하고 PHP로 돌아온 후 2 주 후에이 오류가 다시 발생했습니다. lol
imin

3
문자열이와 연결을 시도하자마자 값 +이라고 가정 int하고 주어진 피연산자는 숫자 데이터 유형이 아닙니다.
Martin Zeitler

1
하하, 저도 똑같은 일이 생겼습니다. JS에 너무 많은 시간을 보내고 PHP에 관해서는 JS 코드를 사용하려고합니다. 그러나 PHP 인터프리터는 그렇게 할 수 없습니다.
Hemant Sankhla 19

1
세상에. 나는 +대신에 내가 사용한 것을 알아 내기 위해 거의 한 시간 동안 인터넷 검색을 해왔다 .. 감사!
marvinpoo

52

새로운 로직 없이도 문제를 숫자로 캐스팅하여 문제를 해결할 수 있습니다. 이렇게하면 경고를 방지하고 PHP 7.0 이하의 동작과 동일합니다.

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

(Daniel Schroeder의 답변은 숫자가 아닌 값이 발견되면 $ sub_total이 설정되지 않은 상태로 유지되기 때문에 동일하지 않습니다. 예를 들어, $ sub_total을 인쇄하면 빈 문자열이 표시되며 이는 송장에서 잘못되었을 수 있습니다.-by 캐스팅하면 $ sub_total이 정수인지 확인합니다.)


4
그것은 나쁜 습관입니다. 입력을 필터링해야합니다
Ciro Vargas

3
이것이 가장 좋은 대답 인 것 같습니다. 그리고 이러한 값이 데이터베이스에서 온다는 것을 알고 있기 때문에 이스케이프 할 필요가 없습니다.
MH

3
@Ciro Vargas : 응용 프로그램에 따라 다릅니다. 대부분의 경우 정의되지 않은 정수가 0으로 해석되기를 원합니다. 어쨌든 이것은 PHP7.0 동작과 동일하며 코드를 다시 작성할 필요가 없습니다. (허용 대답은 재 작성을 필요로한다.)
롤랜드 Seuhs

@RolandSeuhs 두 문자열을 곱하면 '24'* '10'은 PHP에서 240을, '24'* null은 0을 생성하지만 '24'* 'cat'은 언급 된 오류를 발생시킵니다. 위의 이유는 'cat'이 숫자가 아닌 값이기 때문입니다. 'cat'을 int로 캐스팅 할 수 있지만 의미있는 부분 합계도 제공하지 않습니다. 내 솔루션은 수량과 가격이 숫자인지 여부를 결정하는 데 효과적입니다. 문자열 '24'와 '10'이면 통과하지만 숫자가 아닌 문자열이면 실패합니다. sub_total이 처리되는 방법은 실제로 내 목표가 아니 었습니다.
DanielSchroederDev

3
***** PRICE 는 (float)이어야합니다.
Bhavin Rana

25

제 경우에는 +다른 언어로 사용되었지만 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);

이제 경고가 사라졌습니다. :)


2

값이 ''와 같은 빈 문자열인지 일부 변수로 증가하지 않는지 확인하십시오.

예:

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

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

슈퍼, 이것은 대부분의 다른 답변에서 놓친 경우입니다.
Trendfischer

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/en/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>";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.