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?

Imran Rafique
źródło
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...
}
DanielSchroederDev
źródło
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.

Yassir Ennazk
źródło
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ą.)

Roland Seuhs
źródło
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 ..

CodeToLife
źródło
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 ...

coderama
źródło
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 }
?>
Ajmal Aamir
źródło
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.

Henz
źródło
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 :)

Jodyshop
źródł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;
}
Luiz Gustavo Martins
źródło
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.

Wadday
źródło
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
?>

źródło
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.

Neo
źródło
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])));
Nasirkhan Pathan
źródło
1
$sub_total_price = 0; 

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

echo $sub_total_price;

działa w 100% :)

Imran Imu
źródło
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.

ASammour
źródło
0

Upewnij się, że struktura kolumny to INT.

Borgy ES
źródło
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
mallikarjun SK
źródło
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>";
Lord
źródło