Ostrzeżenie: napotkano wartość nienumeryczną


123

Niedawno zaktualizowany do PHP 7.1 i zacznij otrzymywać następujący błąd

Ostrzeżenie: napotkano wartość nienumeryczną w wierszu 29

Oto jak wygląda linia 29

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

Na hoście lokalnym wszystko działa dobrze.

Jakieś pomysły, jak sobie z tym poradzić lub co to jest?


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

2
Wygląda na nowe ostrzeżenie w PHP 7 (jak wiesz). php.net/manual/en/migration71.other-changes.php Czy po wyświetleniu błędu te zmienne mają wartości? Myślę, że można tego uniknąć, inicjując je na 0.
tjfo

1
@MichaelHanon gdzie jest odpowiedź, do której się odnosisz? jaki jest błąd składni?
FKEinternet

1
$ sub_total + = ((int) $ item ['quantity'] * (int) $ produkt ['cena']);
Jestem najgłupszą osobą

używam starszego formatu, takiego jak ten a = a + b; lub str = str. "<a href='".str2."'> asd </a>"; lub $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Odpowiedzi:


106

Wygląda na to, że w PHP 7.1, jeśli napotkana zostanie wartość nienumeryczna, zostanie wyemitowane Ostrzeżenie. Zobacz ten link .

Oto odpowiednia część dotycząca otrzymanego ostrzeżenia:

Wprowadzono nowe błędy E_WARNING i E_NOTICE, gdy nieprawidłowe ciągi są wymuszane przy użyciu operatorów oczekujących liczb lub ich odpowiedników przypisania. E_NOTICE jest emitowane, gdy łańcuch zaczyna się od wartości numerycznej, ale zawiera końcowe znaki nienumeryczne, a E_WARNING jest emitowane, gdy ciąg nie zawiera wartości liczbowej.

Domyślam się, że $ item ['quantity'] lub $ product ['price'] nie zawiera wartości liczbowej, więc upewnij się, że tak jest, zanim spróbujesz je pomnożyć. Może użyć jakiegoś warunku przed obliczeniem $ sub_total, na przykład:

<?php

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

2
Miałem ten problem, ponieważ nadal miałem kilka znaków plus w aspekcie, który przenosiłem do PHP. Ctrl + f i poszukaj znaków +.
MH

Czy istnieje sposób, aby wyłączyć to ostrzeżenie przez php.ini?
BeniRose

3
Dzięki. Pracuję nad starszym projektem Symfony 1.4 i wydaje się, że jest kilka miejsc, w których dzieje się to celowo, co było uciążliwe. To naprawdę powinna być flaga w php.ini, która pozwala wyłączyć ten poziom ścisłości.
BeniRose,

9
Alternatywnie możesz użyć$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Jestem najgłupszą osobą

2
Szczerze mówiąc, nie wyłączałbym tego, jest to jedno z bardziej przydatnych ostrzeżeń, które mogą w rzeczywistości doprowadzić do znalezienia błędu - w naszym przypadku takiego, który istniał od lat i nie został zauważony. Jak powiedział Daniel, pojawia się tylko wtedy, gdy spróbujesz zastosować matematykę do łańcucha nienumerycznego. Nie widzę przypadku, w którym byłoby to pożądane zachowanie. tzn. „default” * 86400 będzie równy 0 i bez tego ostrzeżenia nigdy byś się nie dowiedział, chyba że przejdziesz przez kod.
Steve Childs,

230

Nie do końca to, co miałeś, ale ten sam błąd w przypadku wyszukiwania osób.

Zdarzyło mi się to, gdy spędziłem zbyt dużo czasu na JavaScript.

Wracając do PHP, połączyłem dwa ciągi z „ +” zamiast „ .” i otrzymałem ten błąd.


24
Ta cholerna rzecz zaskoczyła mnie w 2019 roku, LOL. Należy zmienić strukturę konkatenacji ciągów znaków w PHP!
Daniel Dut

2
I tutaj 2 tygodnie po zrobieniu nodejs i powrocie do PHP ponownie napotkałem ten błąd lol
imin

3
gdy tylko próbuje się połączyć łańcuch z a +, zakłada się, że jest to intwartość ... podczas gdy podane operandy nie mają żadnego numerycznego typu danych.
Martin Zeitler

1
haha, to samo stało się ze mną, spędzam zbyt dużo czasu na JS, a jeśli chodzi o PHP, to staram się używać kodu JS. Ale interpreter PHP mi na to nie pozwala.
Hemant Sankhla

1
O mój Boże. Szukałem w Google prawie całą godzinę, aby dowiedzieć się, że użyłem +zamiast .. Dzięki!
marvinpoo

53

Możesz rozwiązać problem bez nowej logiki, po prostu rzucając rzecz na liczbę, co zapobiega ostrzeżeniu i jest równoważne zachowaniu w PHP 7.0 i niższych:

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

(Odpowiedź od Daniela Schroedera nie jest równoważna, ponieważ $ sub_total pozostanie nieustawione, jeśli zostaną napotkane wartości nienumeryczne. Na przykład, jeśli wydrukujesz $ sub_total, otrzymasz pusty ciąg, który prawdopodobnie jest nieprawidłowy na fakturze. rzutując upewniasz się, że $ sub_total jest liczbą całkowitą.)


4
to zła praktyka. Musisz filtrować swoje dane wejściowe
Ciro Vargas

4
Wydaje się, że to najlepsza odpowiedź. A mimo wszystko, co wiesz, te wartości pochodzą z bazy danych, być może nie będziesz musiał uciekać.
MH

3
@Ciro Vargas: To zależy od aplikacji. W wielu przypadkach chcesz, aby niezdefiniowana liczba całkowita była interpretowana jako zero. W każdym razie jest to odpowiednik zachowania PHP7.0 i nie wymaga przepisywania kodu. (Przyjęta odpowiedź wymaga przepisania.)
Roland Seuhs

@RolandSeuhs Nie jestem pewien, czy podążam, mnożąc dwa ciągi, '24' * '10' da 240 w PHP, '24' * null da 0, ale '24' * 'cat' zwróci wspomniany błąd powyżej, ponieważ „kot” jest wartością nienumeryczną. Możesz rzucić „kot” na int, ale to też nie da ci znaczącej sumy częściowej. Jeśli chodzi o moje rozwiązanie, działa ono w celu określenia, czy ilość i cena są liczbowe. Jeśli są to ciągi „24” i „10”, przechodzi, ale jeśli którykolwiek z nich jest łańcuchem nienumerycznym, kończy się niepowodzeniem. To, jak radzimy sobie z sub_total, nie było moim celem, przepraszam, jeśli tak wyszło.
DanielSchroederDev

3
***** CENA powinna być (float) powinna to umieścić!
Bhavin Rana,

25

W moim przypadku to przeze mnie używany +jak w innym języku, ale w PHP jest to operator konkatenacji ..


5

Przydarzyło mi się to szczególnie na PHPMyAdmin. Aby dokładniej odpowiedzieć na to pytanie , wykonałem następujące czynności:

W pliku:

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

Zmieniłem to:

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

Do tego:

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

Mam nadzieję, że ktoś uratuje kłopoty ...


4

Miałem ten problem z linkiem do paginacji do przodu i do tyłu .... po prostu ustaw (int) przed zmienną $ Page + 1 i zadziałało ...

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

Napotkałem problem w phpmyadmin z PHP 7.3. Dzięki @coderama, zmieniłem biblioteki / DisplayResults.class.php wiersz 855 z

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

w

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

Naprawiony.


3

Witam, W moim przypadku używam (WordPress) i PHP7.4 otrzymuję ostrzeżenie o problemie z wartością liczbową. Więc zmieniłem stary kod w następujący sposób:

Z:

$val = $oldval + $val;

Do:

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

Teraz ostrzeżenie zniknęło :)


2

Sprawdź, czy nie zwiększasz wartości za pomocą jakiejś zmiennej, czy jej wartość jest pustym ciągiem, takim jak „”.

Przykład:

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

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

Super, to przypadek pominięty w większości innych odpowiedzi.
Trendfischer

1

Spróbuj tego.

$sub_total = 0;

i teraz możesz tego użyć w swojej pętli

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

To powinno rozwiązać twój problem.


1

Właśnie spojrzałem na tę stronę, ponieważ miałem ten problem. Dla mnie miałem liczby zmiennoprzecinkowe obliczone z tablicy, ale nawet po oznaczeniu zmiennych jako zmiennoprzecinkowych błąd nadal był podawany, oto prosta poprawka i przykładowy kod pod spodem, który powodował problem.

Przykład 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

}

to jest kod, który zapętlił i utworzył nowe elementy div HTML. Kod działał dobrze, a elementy zostały utworzone, ale otrzymałem to samo ostrzeżenie w pliku error_log.

Po przeczytaniu innych przydatnych odpowiedzi doszedłem do wniosku, że sumuję ciąg i liczbę w błędnej linii. Więc zmieniłem kod w tej linii na

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

Teraz kod działa jak wcześniej, ale tym razem bez ostrzeżeń. Mam nadzieję, że ten przykład komuś się przyda.


1

Rozwiąż ten błąd na WordPress

Ostrzeżenie: napotkano wartość nienumeryczną w C: \ XAMPP \ htdocs \ aad-2 \ wp-obejmuje \ SimplePie \ Parse \ Date.php w linii 694

Proste rozwiązanie tutaj!

  1. zlokalizuj plik wp-includes\SimplePie\Parse\Date.php
  2. znajdź linię nr 694
  3. pokazujesz kod $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. i zmień to 3.) na tę linię $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;

działa w 100% :)


1

Dzieje się tak zwykle, gdy ściągasz łańcuchy ze znakiem +. W PHP można dokonać konkatenacji za pomocą znaku kropki (.) Więc czasami przypadkowo umieszczam znak + między dwoma ciągami w PHP i pokazuje mi ten błąd, ponieważ możesz używać tylko liczb + logowania.



0

Jeśli w kodzie napotkano wartość nieliczbową, spróbuj poniżej. Poniższy kod jest konwertowany na float.

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

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

 echo $PlannedAmount; //output = 0

0

w PHP, jeśli użyjesz + do konkatenacji, otrzymasz ten błąd. W php + jest operatorem arytmetycznym . https://www.php.net/manual/en/language.operators.arithmetic.php

niewłaściwe użycie operatora +:

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

używać . do konkatenacji

$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>";
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.