PHPのエラー『Warning: A Non-numeric Value Encountered』の解決方法

  • 作成日 2025.03.05
  • php
PHPのエラー『Warning: A Non-numeric Value Encountered』の解決方法

このエラーは、数値であるべき変数に対して算術演算(加算、減算、乗算、除算など)を行ったときに発生する。特に、文字列やnull、配列などの非数値データが含まれると、この警告が出る。PHP 7.1以降では、より厳密な型チェックが行われるようになり、以前はエラーにならなかったコードでも警告が発生する可能性がある。

1. エラーの概要と発生条件

以下のような条件でエラーが発生する。

  • 数値演算を行おうとした変数が、数値ではない(文字列、null、配列など)
  • データの型変換が適切に行われていない
  • ユーザー入力やデータベースからの取得データが数値でない

2. エラー発生の例

次のコードは、数値ではない値に対して加算を試みているため、エラーが発生する。

$value = "abc";
$result = $value + 10; // エラー発生

エラーメッセージは次のようになる。

Warning: A non-numeric value encountered in script.php on line X

3. 解決策1: 型を明示的に数値に変換する

intval()またはfloatval()を使って明示的に型変換を行う。

$value = "10abc";
$result = intval($value) + 10; // 10 + 10 = 20
echo $result;

4. 解決策2: 型チェックを行う

is_numeric()関数を使って、変数が数値かどうかをチェックする。

$value = "abc";
if (is_numeric($value)) {
    $result = $value + 10;
} else {
    $result = "数値ではありません";
}
echo $result;

5. 解決策3: デフォルト値を設定する

??(null合体演算子)を使用して、変数がnullの場合にデフォルト値を設定する。

$value = $value ?? 0;
$result = $value + 10;

6. 解決策4: ユーザー入力のバリデーション

フォーム入力やAPIリクエストから受け取る値が数値であることを確認する。

$value = $_POST['number'] ?? '0';
if (!is_numeric($value)) {
    echo "無効な入力です";
} else {
    echo "入力された数値: " . (floatval($value) + 10);
}

7. 解決策5: データベースの値を確認する

データベースから取得した値が文字列型の場合、自動的に型変換されない可能性があるため、適切な変換を行う。

$value = $row['price'] ?? 0;
$result = floatval($value) + 10;
echo $result;

8. 解決策6: 配列の要素に対する処理

配列の要素を直接演算に使用するとエラーになるため、適切にアクセスする。

$array = ['value' => '15'];
$result = intval($array['value']) + 5;
echo $result;

9. 解決策7: エラーを無視する方法

PHPの設定で@を使うことで警告を抑制できるが、根本的な解決にはならないため非推奨。

$result = @$value + 10;

この方法はデバッグが難しくなるため、できるだけis_numeric()などを使って対応するのが望ましい。

10. まとめ

このエラーは、数値ではない値に対して算術演算を行った場合に発生する。is_numeric()でチェックしたり、intval()floatval()で型変換を行うことで防ぐことができる。また、ユーザー入力やデータベースからの取得データにも注意し、適切なバリデーションを実装することが重要。