Warnung: Ein nicht numerischer Wert wurde gefunden

121

Kürzlich auf PHP 7.1 aktualisiert und es wird folgender Fehler angezeigt

Warnung: Ein nicht numerischer Wert in Zeile 29

So sieht Zeile 29 aus

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

Auf localhost funktioniert alles gut ..

Irgendwelche Ideen, wie man das angeht oder was es ist?

Imran Rafique
quelle
4
var_dump($item['quantity'], $product['price'])
u_mulder
2
Sieht aus wie eine neue Warnung in PHP 7 (wie Sie wissen). php.net/manual/en/migration71.other-changes.php Wenn Sie den Fehler erhalten, haben diese Variablen Werte? Ich denke, Sie könnten es vermeiden, indem Sie sie auf 0 initialisieren.
tjfo
1
@MichaelHanon Wo ist die Antwort, auf die Sie sich beziehen? Was ist der Syntaxfehler?
FKEinternet
1
$ sub_total + = ((int) $ item ['Quantität'] * (int) $ Produkt ['Preis']);
Ich bin die dümmste Person
Ich benutze Legacy-Format wie dieses a = a + b; oder str = str. "<a href='".str2."'> asd </a>"; oder $ this-> storeItems = $ this-> storeItems. $ str;
Säbel tabatabaee yazdi

Antworten:

105

Es scheint, dass in PHP 7.1 eine Warnung ausgegeben wird, wenn ein nicht numerischer Wert auftritt. Siehe diesen Link .

Hier ist der relevante Teil, der sich auf den Warnhinweis bezieht, den Sie erhalten:

Neue E_WARNING- und E_NOTICE-Fehler wurden eingeführt, wenn ungültige Zeichenfolgen mithilfe von Operatoren erzwungen werden, die Zahlen oder ihre Zuweisungsäquivalente erwarten. Ein E_NOTICE wird ausgegeben, wenn die Zeichenfolge mit einem numerischen Wert beginnt, aber nachfolgende nicht numerische Zeichen enthält, und ein E_WARNING wird ausgegeben, wenn die Zeichenfolge keinen numerischen Wert enthält.

Ich vermute, dass entweder $ item ['Quantität'] oder $ product ['Preis'] keinen numerischen Wert enthält. Stellen Sie daher sicher, dass dies der Fall ist, bevor Sie versuchen, sie zu multiplizieren. Verwenden Sie möglicherweise eine Bedingung, bevor Sie $ sub_total berechnen, wie folgt:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
DanielSchroederDev
quelle
2
Ich hatte dieses Problem, weil ich immer noch ein paar Pluszeichen in dem Asp hatte, den ich auf PHP übertrug. Strg + f und suche nach + Zeichen.
MH
Gibt es eine Möglichkeit, diese Warnung über php.ini auszuschalten?
BeniRose
3
Vielen Dank. Ich arbeite an einem älteren Symfony 1.4-Projekt, und es scheint, dass es einige Stellen gibt, an denen dies absichtlich geschieht, was sehr schmerzhaft war. Dies sollte wirklich eine Flagge in der php.ini sein, mit der Sie diese Strenge deaktivieren können.
BeniRose
9
Alternativ können Sie verwenden $sub_total += ((int)$item['quantity'] * (int)$product['price']);
ich bin die dümmste Person
2
Um fair zu sein, würde ich dies nicht ausschalten, es ist eine der nützlicheren Warnungen, die Sie tatsächlich dazu bringen können, einen Fehler zu finden - in unserem Fall einen, der seit Jahren vorhanden war und nicht bemerkt wurde. Wie Daniel sagte, wird es nur angezeigt, wenn Sie versuchen, Mathematik auf eine nicht numerische Zeichenfolge anzuwenden. Ich sehe keinen Fall, in dem dies das gewünschte Verhalten wäre. dh "Standard" * 86400 wäre gleich 0 und ohne diese Warnung würden Sie es nie erfahren, wenn Sie nicht zufällig den Code durchgehen.
Steve Childs
230

Nicht genau das Problem, das Sie hatten, aber der gleiche Fehler bei der Suche.

Dies ist mir passiert, als ich zu viel Zeit mit JavaScript verbracht habe.

Als ich zu PHP zurückkam, verkettete ich zwei Zeichenfolgen mit " +" anstelle von " ." und bekam diesen Fehler.

Yassir Ennazk
quelle
24
Dieses verdammte Ding hat mich 2019 gestolpert, LOL. Die String-Verkettung von PHP muss neu strukturiert werden!
Daniel Dut
2
Und hier 2 Wochen nachdem ich nodejs gemacht und zu PHP zurückgekehrt war, sah ich mich diesem Fehler erneut gegenüber lol
imin
3
Sobald versucht wird, eine Zeichenfolge mit a zu verketten +, wird angenommen, dass es sich um einen intWert handelt ... während die angegebenen Operanden keinen numerischen Datentyp haben.
Martin Zeitler
1
haha, das gleiche ist bei mir passiert, ich verbringe zu viel Zeit mit JS und wenn es um PHP geht, versuche ich JS-Code zu verwenden. Aber der PHP-Interpreter lässt mich das nicht tun.
Hemant Sankhla
1
Oh mein Gott. Ich habe fast eine ganze Stunde gegoogelt, nur um herauszufinden, dass ich +stattdessen verwendet habe .. Vielen Dank!
Marvinpoo
52

Sie können das Problem ohne neue Logik lösen, indem Sie das Ding einfach in die Zahl eingeben, was die Warnung verhindert und dem Verhalten in PHP 7.0 und darunter entspricht:

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

(Die Antwort von Daniel Schroeder ist nicht gleichwertig, da $ sub_total nicht gesetzt wird, wenn nicht numerische Werte gefunden werden. Wenn Sie beispielsweise $ sub_total ausdrucken, erhalten Sie eine leere Zeichenfolge, die in einer Rechnung wahrscheinlich falsch ist. - by Beim Casting stellen Sie sicher, dass $ sub_total eine Ganzzahl ist.)

Roland Seuhs
quelle
4
Das ist eine schlechte Praxis. Sie müssen Ihre Eingaben filtern
Ciro Vargas
3
Dies scheint die beste Antwort zu sein. Und soweit Sie wissen, dass diese Werte aus der Datenbank stammen, müssen Sie möglicherweise nicht entkommen.
MH
3
@Ciro Vargas: Das hängt von der Anwendung ab. In vielen Fällen möchten Sie, dass eine undefinierte Ganzzahl als Null interpretiert wird. Auf jeden Fall entspricht dies dem PHP7.0-Verhalten und erfordert kein Umschreiben des Codes. (Die akzeptierte Antwort erfordert ein Umschreiben.)
Roland Seuhs
@ RolandSeuhs Ich bin mir nicht sicher, ob ich beim Multiplizieren von zwei Zeichenfolgen folge: '24' * '10' ergibt 240 in PHP, '24' * null ergibt 0, aber '24' * 'cat' löst den genannten Fehler aus oben, weil 'cat' ein nicht numerischer Wert ist. Sie können 'cat' in ein int umwandeln, aber das gibt Ihnen auch keine aussagekräftige Zwischensumme. Bei meiner Lösung wird ermittelt, ob Menge und Preis numerisch sind. Wenn es sich um die Zeichenfolgen '24' und '10' handelt, wird sie übergeben, aber wenn eine der beiden Zeichenfolgen eine nicht numerische Zeichenfolge ist, schlägt sie fehl. Wie mit sub_total umgegangen wird, war nicht wirklich mein Ziel. Tut mir leid, wenn es so kam.
DanielSchroederDev
3
***** PREIS sollte sein (float) sollte das setzen!
Bhavin Rana
24

In meinem Fall wurde es wegen mir +wie in einer anderen Sprache verwendet, aber in PHP-Strings ist der Verkettungsoperator ..

CodeToLife
quelle
5

Dies geschah mir speziell auf PHPMyAdmin. Um dies genauer zu beantworten , habe ich Folgendes getan:

Im Ordner:

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

Ich habe das geändert:

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

Dazu:

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

Hoffe, dass jemand Probleme hat ...

Coderama
quelle
4

Ich hatte dieses Problem mit meiner Paginierung vorwärts und rückwärts Link .... einfach (int) vor die Variable $ Page + 1 setzen und es hat funktioniert ...

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

Ich bin auf das Problem in phpmyadmin mit PHP 7.3 gestoßen. Danke @coderama, ich habe die Bibliothek / DisplayResults.class.php Zeile 855 von geändert

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

in

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

Fest.

Henry
quelle
3

Hallo, in meinem Fall mit (WordPress) und PHP7.4 erhalte ich eine Warnung bezüglich eines Problems mit numerischen Werten. Also habe ich den alten Code wie folgt geändert:

Von:

$val = $oldval + $val;

Zu:

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

Jetzt ist die Warnung verschwunden :)

Jodyshop
quelle
2

Überprüfen Sie, ob Sie mit einer Variablen nicht inkrementieren, dass ihr Wert eine leere Zeichenfolge wie '' ist.

Beispiel:

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

foreach($integers as $integer) {
    $total += $integer;
}
Luiz Gustavo Martins
quelle
Super, dies ist ein Fall, der in den meisten anderen Antworten übersehen wird.
Trendfischer
1

Versuche dies.

$sub_total = 0;

und innerhalb Ihrer Schleife können Sie dies jetzt verwenden

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

Es sollte Ihr Problem lösen.

Wadday
quelle
1

Ich habe mir diese Seite gerade angesehen, als ich dieses Problem hatte. Für mich wurden Gleitkommazahlen aus einem Array berechnet, aber selbst nachdem die Variablen als Gleitkommazahlen festgelegt wurden, wurde der Fehler immer noch angegeben. Hier ist die einfache Korrektur und der Beispielcode, unter denen das Problem verursacht wurde.

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

quelle
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

}

Das ist der Code, den ich hatte, der eine Schleife erstellt und neue HTML-Div-Elemente erstellt hat. Der Code hat gut funktioniert und die Elemente wurden gebildet, aber ich habe die gleiche Warnung im error_log erhalten.

Nachdem ich die nützlichen anderen Antworten gelesen hatte, stellte ich fest, dass ich eine Zeichenfolge und eine Zahl in der fehlerhaften Zeile zusammenfasste. Also habe ich den Code in dieser Zeile in geändert

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

Jetzt funktioniert der Code wie früher, diesmal jedoch ohne Warnungen. Hoffe, dieses Beispiel wäre für jemanden nützlich.

Neo
quelle
1

Lösen Sie diesen Fehler in WordPress

Warnung: Ein nicht numerischer Wert in C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php in Zeile 694

Einfache Lösung hier!

  1. Suchen Sie eine Datei von wp-includes\SimplePie\Parse\Date.php
  2. finde eine Zeile Nr. 694
  3. Sie zeigen den Code $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. und ändern Sie diese 3.) in diese Zeile $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
Nasirkhan Pathan
quelle
1
$sub_total_price = 0; 

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

echo $sub_total_price;

es funktioniert 100% :)

Imran Imu
quelle
1

Das passiert normalerweise, wenn Sie Strings mit + Zeichen verbinden. In PHP können Sie eine Verkettung mit dem Punktzeichen (.) Durchführen. Manchmal setze ich versehentlich ein + Zeichen zwischen zwei Zeichenfolgen in PHP und es zeigt mir diesen Fehler, da Sie nur + Zeichen in Zahlen verwenden können.

ASammour
quelle
0

Stellen Sie sicher, dass Ihre Spaltenstruktur INT ist.

Borgy ES
quelle
0

Wenn in Ihrem Code ein nicht numerischer Wert gefunden wird, versuchen Sie es unter einem. Der folgende Code wird in float konvertiert.

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

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

 echo $PlannedAmount; //output = 0
mallikarjun SK
quelle
0

Wenn Sie in PHP + für die Verkettung verwenden, wird dieser Fehler angezeigt. In PHP + ist ein arithmetischer Operator. https://www.php.net/manual/en/language.operators.arithmetic.php

falsche Verwendung des Operators +:

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

verwenden . zur Verkettung

$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>";
Herr
quelle