警告:数値以外の値が発生しました


122

最近PHP 7.1に更新され、次のエラーが発生し始めます

警告:29行目で数値以外の値が見つかりました

29行目は次のようになります

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

localhostではすべて正常に動作します。

これに取り組む方法またはそれが何であるかについてのアイデアはありますか?


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

2
PHP 7の新しい警告のように見えます(ご存知のとおり)。php.net/manual/en/migration71.other-changes.php エラーが発生した場合、これらの変数には値がありますか?私はあなたが0にそれらを初期化することによって、それを避けることができると思う
tjfo

1
@MichaelHanonあなたが言及している答えはどこですか?構文エラーとは何ですか?
FKEinternet 2017年

1
$ sub_total + =((int)$ item ['quantity'] *(int)$ product ['price']);
私は最も愚かな人です

私はこのようなレガシー形式を使用しますa = a + b; またはstr = str。 "<a href='".str2."'> asd </a>"; または$ this-> storeItems = $ this-> storeItems。$ str;
saber tabatabaee yazdi

回答:


105

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 2017

3
ありがとう。私はレガシーのSymfony 1.4プロジェクトに取り組んでおり、これが意図的に発生する場所がいくつかあるようで、これは苦痛でした。これは実際にはphp.iniのフラグで、このレベルの厳格さを無効にすることができます。
BeniRose 2017

9
あるいは、次のように使用することもできます$sub_total += ((int)$item['quantity'] * (int)$product['price']);
私は最も愚かな人です

2
公平を期すために、これをオフにしないでください。これは、実際にバグを見つけるのに役立つより有用な警告の1つです-私たちの場合、何年も前から存在していて気づかなかったものです。ダニエルが言ったように、数値以外の文字列に数学を適用しようとした場合にのみ表示されます。これが望ましい振る舞いになるケースは見当たりません。つまり、「デフォルト」* 86400は0に等しく、この警告がないと、コードをステップ実行しない限り、決してわかりません。
スティーブチャイルズ2018年

230

あなたが持っていた正確な問題ではありませんが、検索している人々のための同じエラー。

これは、JavaScriptに時間をかけすぎたときに起こりました。

PHPに戻ると、2つの文字列を " +"ではなく" "で連結する.と、そのエラーが発生しました。


24
このいまいましいことは、2019年に私を驚かせました PHPの文字列連結は再構築する必要があります!
Daniel

2
そして、ここでnodejsを実行してPHPに戻ってから2週間後、再びこのエラーに直面しましたlol
imin

3
文字列がと連結されるとすぐ+に、それはint値であると見なされます...指定されたオペランドは数値データ型ではありません。
Martin

1
ハハ、同じことが私にも起こりました、私はJSにあまりにも多くの時間を費やし、それがPHPになるとJSコードを使用しようとします。しかし、PHPインタープリターは私にそれをさせません。
Hemant Sankhla

1
何てことだ。の+代わりに使用したことを確認するためだけに、ほぼ1時間グーグルで作業してきました.。ありがとう!
marvinpoo

52

新しいロジックなしで問題を数値にキャストするだけで問題を解決できます。これは警告を防ぎ、PHP 7.0以下の動作と同等です。

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

(Daniel Schroederからの回答は、$ sub_totalが数値以外の値に遭遇すると未設定のままになるため、同等ではありません。たとえば、$ sub_totalを印刷すると、空の文字列が返されます。これはおそらく請求書では間違っています。キャストする場合は、$ sub_totalが整数であることを確認してください。)


4
それは悪い習慣です。入力をフィルタリングする必要があります
Ciro Vargas '25年

3
これが最良の答えのようです。そして、これらの値がデータベースからのものであることを知っているすべての人にとって、エスケープする必要がない場合もあります。
MH

3
@Ciro Vargas:アプリケーションによって異なります。多くの場合、未定義の整数をゼロとして解釈する必要があります。とにかく、これはPHP7.0の動作と同等であり、コードを書き直す必要はありません。(受け入れられた答えは書き換えを必要とします。)
Roland Seuhs

@RolandSeuhs 2つの文字列を乗算すると、'24 '*' 10 'はPHPで240を生成し、'24' * nullは0を生成しますが、'24 '*' cat 'は上記のエラーをスローします上記の 'cat'は非数値であるためです。'cat'をintにキャストできますが、それでも意味のある小計は得られません。私の解決策に関しては、数量と価格が数値であるかどうかを決定するために機能します。それらが文字列「24」と「10」の場合は合格ですが、どちらかが非数値文字列の場合は失敗します。sub_totalがどのように処理されるかは、私の目的ではありませんでした。
DanielSchroederDev 2017

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でこのエラーを解決する

警告:C:\ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.phpの行694で非数値が見つかりました

ここで簡単な解決策!

  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で2つの文字列の間に誤って+記号を挿入すると、このエラーが表示されます。



0

コードで数値以外の値が見つかった場合は、以下の値を試してください。以下のコードは浮動小数点に変換されます。

$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.