1229

これは何ですか?

これは、PHP のプログラミング中に発生する可能性があり、それらを修正する手がかりがない警告、エラー、および通知に関する多くの回答です。これはコミュニティ Wiki でもあるため、このリストへの追加と維持に参加するように誰でも招待されています。

どうしてこれなの?

「ヘッダーは既に送信されています」「オブジェクト以外のメンバーを呼び出しています」などの質問は、スタック オーバーフローで頻繁に発生します。これらの質問の根本原因は常に同じです。したがって、これらの質問に対する回答は通常、それらを繰り返してから、特定のケースでどの行を変更するかを OP に示します。これらの回答は、OP の特定のコードにのみ適用されるため、サイトに価値を追加しません。同じエラーを抱えている他のユーザーは、ローカライズされすぎているため、解決策を簡単に読み取ることができません。根本的な原因を理解すれば、エラーを修正するのは簡単なので、これは悲しいことです。したがって、このリストでは、ソリューションを一般的な方法で説明しようとしています。

ここで何をすべきですか?

あなたの質問がこれと重複しているとマークされている場合は、以下のエラー メッセージを見つけて、コードに修正を適用してください。回答には通常、一般的な回答だけでは明確でない場合に備えて、調査するための追加のリンクが含まれています。

貢献したい場合は、「お気に入り」のエラー メッセージ、警告または通知、回答ごとに 1 つずつ、それが何を意味するかについての簡単な説明 (マニュアル ページで用語を強調表示するだけであっても)、考えられる解決策またはデバッグ アプローチを追加してください。価値のある既存の Q&A のリスト。また、既存の回答を自由に改善してください。

リスト

また、参照してください。

4

37 に答える 37

295

警告: ヘッダー情報を変更できません - ヘッダーは既に送信されています

スクリプトが HTTP ヘッダーをクライアントに送信しようとしたが、以前に出力があったため、ヘッダーがクライアントに送信済みである場合に発生します。

これはE_WARNING、スクリプトを停止しません。

典型的な例は、次のようなテンプレート ファイルです。

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

このsession_start()関数は、セッション Cookie を含むヘッダーをクライアントに送信しようとします。しかし、PHP は<html>要素を出力ストリームに書き込んだときに、すでにヘッダーを送信しています。を一番上に移動する必要がsession_start()あります。

これを解決するには、警告をトリガーするコードの前の行を調べて、出力場所を確認します。そのコードの前にコードを送信するヘッダーを移動します。

見過ごされがちな出力は、PHP の終了後の改行?>です。?>ファイルの最後にある場合は、省略するのが標準的な方法と見なされます。同様に、この警告のもう 1 つの一般的な原因は、開始<?php点の前に空のスペース、行、または非表示の文字があり、Web サーバーがヘッダーと空白/改行を送信するため、PHP の解析が開始されたときに送信できなくなることです。任意のヘッダー。

ファイルに複数の<?php ... ?>コード ブロックが含まれる場合、それらの間にスペースを入れないでください。(注: 自動的に構築されたコードがある場合、複数のブロックがある可能性があります)

また、スクリプトのエンコーディングが BOM 付きの UTF-8 である場合など、コードにバイト オーダー マークが含まれていないことを確認してください。

関連する質問:

于 2012-10-07T15:21:03.630 に答える
199

致命的なエラー: メンバー関数への呼び出し ... 非オブジェクトで

xyz->method()where xyzis not an object のようなコードで発生するため、それをmethod呼び出すことはできません。

これは、スクリプトを停止させる致命的なエラーです (前方互換性に関する通知: PHP 7 以降ではキャッチ可能なエラーになります)。

ほとんどの場合、これはコードでエラー状態のチェックが行われていないことを示しています。メソッドを呼び出す前に、オブジェクトが実際にオブジェクトであることを検証します。

典型的な例は

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

上記の例では、クエリを準備できず、prepare()に割り当てfalseられ$statementます。メソッドを呼び出そうとすると、値がブール値であるため「非オブジェクト」であるためexecute()、致命的なエラーが発生します。false

関数がオブジェクトではなくブール値を返した理由を突き止めてください。たとえば$pdo、最後に発生したエラーのオブジェクトを確認します。これをデバッグする方法の詳細は、問題の特定の関数/オブジェクト/クラスのエラーの処理方法によって異なります。

それでも->prepare失敗する場合は、$pdoデータベース ハンドル オブジェクトが現在のスコープに渡されていません。定義された場所を見つけます。次に、パラメーターとして渡すか、プロパティとして保存するか、グローバル スコープを介して共有します。

別の問題として、オブジェクトを条件付きで作成し、その条件付きブロックの外でメソッドを呼び出そうとすることがあります。例えば

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

条件付きブロックの外でメソッドを実行しようとすると、オブジェクトが定義されない場合があります。

関連する質問:

于 2012-10-07T15:11:00.930 に答える
124

何も見えません。ページは空で白です。

ホワイトページオブデスまたはホワイトスクリーンオブデスとも呼ばれます。これは、エラーレポートがオフになっていて、致命的なエラー(多くの場合構文エラー)が発生した場合に発生します。

エラーログを有効にしている場合は、エラーログに具体的なエラーメッセージが表示されます。これは通常、「php_errors.log」というファイルにあり、中央の場所(/var/log/apache2多くのLinux環境など)またはスクリプト自体のディレクトリ(共有ホスティング環境で使用されることもあります)にあります。

エラーの表示を一時的に有効にする方が簡単な場合があります。ホワイトページにエラーメッセージが表示されます。これらのエラーはWebサイトにアクセスするすべての人に表示されるため、注意してください。

これは、スクリプトの先頭に次のPHPコードを追加することで簡単に実行できます。

ini_set('display_errors', 1); error_reporting(~0);

コードはエラーの表示をオンにし、レポートを最高レベルに設定します。

ini_set()は実行時に実行されるため、解析/構文エラーには影響しません。これらのエラーはログに表示されます。それらを出力にも(たとえばブラウザで)表示したい場合は、display_startup_errorsディレクティブをに設定する必要がありますtrue。これは、php.iniまたはで、.htaccessまたは実行の構成に影響を与えるその他の方法で実行します。

同じ方法を使用してlog_errorsおよびerror_logディレクティブを設定し、独自のログファイルの場所を選択できます。

ログを確認するか、ディスプレイを使用すると、はるかに優れたエラーメッセージと、スクリプトが停止するコード行が表示されます。

関連する質問:

関連エラー:

于 2012-10-07T21:06:14.763 に答える
108

「通知: 未定義のインデックス」または「警告: 未定義の配列キー」

配列に存在しないキーで配列にアクセスしようとすると発生します。

Undefined Index通知の典型的な例は( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

spinachとの両方1が配列に存在しないため、E_NOTICEがトリガーされます。PHP 8.0 では、代わりに E_WARNING になります。

解決策は、インデックスにアクセスする前に、インデックスまたはオフセットが存在することを確認することです。これは、プログラムのバグを修正して、必要なときにそれらのインデックスが存在することを確認する必要があることを意味する場合があります。array_key_existsまたは、またはを使用してインデックスが存在するかどうかをテストする必要があることを意味する場合がありますisset

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

次のようなコードがある場合:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

$_POST['message']このページが最初にロードされたときに設定されず、上記のエラーが発生します。フォームが送信され、このコードが 2 回目に実行されたときにのみ、配列インデックスが存在します。通常、次の方法でこれを確認します。

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

関連する質問:

于 2012-10-07T16:53:29.207 に答える
89

警告: mysql_fetch_array() は、パラメーター 1 がリソースであると想定しています。ブール値が指定されています

何よりもまず:

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。


これは、 の結果からデータをフェッチしようとしたmysql_queryが、クエリが失敗した場合に発生します。

これは警告であり、スクリプトは停止しませんが、プログラムが間違ったものになります。

mysql_queryによって返された結果を確認する必要があります

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

関連する質問:

関連するエラー:

mysql*パラメータとして MySQL 結果リソースも期待する他の関数は、同じ理由で同じエラーを生成します。

于 2012-10-07T15:20:41.277 に答える
82

致命的なエラー: オブジェクト コンテキストでない場合に $this を使用する

$this代入できないPHPの特別な変数です。存在しないコンテキストでアクセスすると、この致命的なエラーが発生します。

このエラーが発生する可能性があります:

  1. 非静的メソッドが静的に呼び出された場合。例:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    修正方法:コードをもう一度確認してください。$thisオブジェクト コンテキストでのみ使用でき、静的メソッドでは使用しないでください。また、静的メソッドは非静的プロパティにアクセスしてはなりません。self::$static_property静的プロパティにアクセスするために使用

  2. クラスメソッドからのコードが通常の関数またはグローバルスコープにコピーされ、特殊変数保持している場合。修正方法:コードを確認し、別の置換変数に置き換えます。$this
    $this

関連する質問:

  1. 非静的メソッドを静的として呼び出します: PHP 致命的なエラー: オブジェクト コンテキストでないときに $this を使用する
  2. コードのコピー:致命的なエラー: オブジェクト コンテキストでないときに $this を使用する
  3. Stackoverflow に関するすべての「オブジェクト コンテキスト以外で $this を使用する」に関する質問
于 2012-10-07T15:52:06.820 に答える
77

致命的なエラー: 未定義の関数 XXX の呼び出し

まだ定義されていない関数を呼び出そうとすると発生します。一般的な原因には、拡張機能とインクルードの欠落、条件付き関数宣言、関数宣言内の関数、または単純なタイプミスが含まれます。

例 1 - 条件付き関数の宣言

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

この場合、fn()は true ではないため宣言され$someConditionません。

例 2 - 関数宣言内の関数

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

この場合、呼び出されfnたときにのみ宣言されます。後続の への呼び出しは、既存の関数の再宣言に関するエラーをトリガーすることcreateFn()に注意してください。createFn()

これは、PHP 組み込み関数でも見られる場合があります。公式マニュアルで関数を検索してみて、どの「エクステンション」(PHP モジュール) に属しているか、どのバージョンの PHP がサポートしているかを確認してください。

拡張機能が見つからない場合は、その拡張機能をインストールして、php.ini で有効にします。apt関数が表示される拡張機能については、PHP マニュアルのインストール手順を参照してください。パッケージ マネージャー ( Debian や Ubuntu、yumRed Hat や CentOS など)、またはコントロール パネルを使用して、拡張機能を有効にしたり、インストールしたりすることもできます。共有ホスティング環境で。

関数が、使用している PHP の新しいバージョンで導入されたものである場合は、マニュアルまたはそのコメント セクションに別の実装へのリンクが見つかる場合があります。PHP から削除された場合は、不要になった可能性があるため、その理由に関する情報を探してください。

インクルードが欠落している場合は、関数を呼び出す前に、関数を宣言するファイルを必ずインクルードしてください。

タイプミスの場合は、タイプミスを修正します。

関連する質問:

于 2012-10-08T14:43:16.253 に答える
73

解析エラー: 構文エラー、予期しない T_XXX

T_XXX予期しない場所にトークンがある場合、バランスの取れていない (余分な) 括弧がある場合、php.ini で有効化せずに短いタグを使用している場合などに発生します。

関連する質問:

詳細については、次を参照してください。

于 2012-10-07T15:22:38.873 に答える
71

致命的なエラー: 書き込みコンテキストで関数の戻り値を使用できません

これは通常、 で関数を直接使用する場合に発生しemptyます。

例:

if (empty(is_null(null))) {
  echo 'empty';
}

これはempty、関数ではなく言語構造であるためです。5.5 より前のバージョンの PHP では、引数として式を使用して呼び出すことはできません。PHP 5.5 より前では、 への引数はvariableempty()でなければなりませんでしたが、PHP 5.5 以降では任意の式 (関数の戻り値など) を使用できます。

emptyは、その名前にもかかわらず、変数が「空」かどうかを実際にはチェックしません。代わりに、変数が存在しないか、または== false. 式 (is_null(null)例のように) は常に存在すると見なされるため、ここでemptyは false に等しいかどうかのみをチェックしています。empty()ここを!に置き換えるif (!is_null(null))か、明示的に false と比較することができif (is_null(null) == false)ます。

関連する質問:

于 2012-10-07T16:16:35.923 に答える
64

MySQL:SQL構文にエラーがあります。近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください...行...

このエラーは、MySQLクエリに渡されたデータを適切にエスケープするのを忘れたためによく発生します。

してはいけないことの例(「悪い考え」):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

このコードは、 http://example.com/edit.php?id = 10(投稿番号10を編集するため)などのURLを使用して、送信するフォームのあるページに含めることができます。

送信されたテキストに一重引用符が含まれている場合はどうなりますか?$query最終的には:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

そして、このクエリがMySQLに送信されると、途中に余分な一重引用符があるため、構文が間違っていると文句を言います。

このようなエラーを回避するには、クエリで使用する前に常にデータをエスケープする必要があります

SQLクエリで使用する前にデータをエスケープすることも非常に重要です。エスケープしないと、スクリプトがSQLインジェクションに対して開かれるためです。SQLインジェクションは、レコード、テーブル、またはデータベース全体の変更、損失、または変更を引き起こす可能性があります。これは非常に深刻なセキュリティの問題です。

ドキュメンテーション:

于 2012-10-07T17:45:04.700 に答える
55

解析エラー: 構文エラー、予期しない T_ENCAPSED_AND_WHITESPACE

PHP 8.0 以降では、メッセージは代わりに次のようになります。

構文エラー、予期しない文字列コンテンツ ""、"-" または識別子または変数または数値が必要です

このエラーは、複雑な変数構成全体が で囲まれていない場合に、二重引用符で囲まれた文字列内で補間のために引用符で囲まれたキーを使用して配列値を参照しようとしたときに最もよく発生し{}ます。

エラーケース:

これにより、Unexpected T_ENCAPSED_AND_WHITESPACE次のようになります。

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

考えられる修正:

二重引用符で囲まれた文字列では、PHP は配列キー文字列を引用符なしで使用することを許可し、. を発行しませんE_NOTICE。したがって、上記は次のように記述できます。

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

複雑な配列変数とキー全体を で囲むことができます{}。その場合、.を避けるために引用符で囲む必要E_NOTICEがあります。 PHP のドキュメントでは、複雑な変数に対してこの構文を推奨しています。

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

もちろん、上記のいずれかに代わる方法は、配列変数を補間する代わりに連結することです。

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

参考までに、PHP Strings man ページのVariable Parsingのセクションを参照してください。

于 2012-12-18T14:52:32.023 に答える
53

致命的なエラー: XXX バイトの許容メモリ サイズを使い果たしました (XXX バイトを割り当てようとしました)

スクリプトを実行するのに十分なメモリがありません。PHP がメモリ制限に達し、実行を停止しました。このエラーは致命的であり、スクリプトは停止します。メモリ制限の値は、php.iniファイルまたはスクリプトで使用して構成できますini_set('memory_limit', '128 M');(これにより、で定義された値が上書きされますphp.ini)。メモリ制限の目的は、単一の PHP スクリプトが使用可能なすべてのメモリを使い果たし、Web サーバー全体がダウンするのを防ぐことです。

最初に行うことは、スクリプトが必要とするメモリの量を最小限に抑えることです。たとえば、大きなファイルを変数に読み込む場合、またはデータベースから多数のレコードをフェッチしてそれらをすべて配列に格納する場合、大量のメモリが使用される可能性があります。コードを変更して、代わりにファイルを 1 行ずつ読み取るか、データベース レコードを一度に 1 つずつフェッチして、すべてをメモリに格納しないようにします。これには、舞台裏で何が起こっているのか、データがメモリに保存されているときと他の場所に保存されているときについて、少し概念的な認識が必要です。

スクリプトがメモリを集中的に使用する作業を行っていないときにこのエラーが発生した場合は、コードをチェックして、メモリ リークがあるかどうかを確認する必要があります。memory_get_usage関数はあなたの友達です。

関連する質問:

于 2012-10-07T15:36:31.607 に答える
46

警告: [関数] : ストリームを開けませんでした: [理由]

通常はinclude,requireまたはfopenでファイルを呼び出し、PHP がファイルを見つけられなかったか、ファイルをロードするための十分な権限がない場合に発生します。

これはさまざまな理由で発生する可能性があります。

  • ファイルパスが間違っています
  • ファイルパスは相対です
  • インクルードパスが間違っています
  • 権限が厳しすぎる
  • SELinuxが有効です
  • などなど ...

よくある間違いの 1 つは、絶対パスを使用しないことです。これは、フル パスまたはor のような魔法の定数を使用することで簡単に解決できます。__DIR__dirname(__FILE__)

include __DIR__ . '/inc/globals.inc.php';

また:

require dirname(__FILE__) . '/inc/globals.inc.php';

正しいパスが使用されていることを確認することは、これらの問題のトラブルシューティングの 1 つのステップです。これは、存在しないファイル、アクセスを妨げているファイル システムの権限、または PHP 自体によるオープン ベースのディレクトリ制限に関連している可能性もあります。

この問題を迅速に解決する最善の方法は、以下のトラブルシューティング チェックリストに従うことです。

関連する質問:

関連するエラー:

于 2012-10-10T13:14:49.320 に答える
45

解析エラー: 構文エラー、予期しない T_PAAMAYIM_NEKUDOTAYIM

スコープ解決演算子は、ヘブライ語の פעמים נקודתים から「Paamayim Nekudotayim」とも呼ばれます。これは「ダブルコロン」を意味します。

このエラーは通常、誤ってコードを挿入した場合に発生::します。

関連する質問:

ドキュメンテーション:

于 2012-10-07T15:29:54.690 に答える
45

注意: 未定義変数

以前に定義されていない変数を使用しようとすると発生します。

典型的な例は

foreach ($items as $item) {
    // do something with item
    $counter++;
}

以前に定義していなかった場合$counter、上記のコードは通知をトリガーします。

正しい方法は、変数を使用する前に設定することです

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

同様に、たとえば無名関数を使用する場合など、変数はそのスコープ外ではアクセスできません。

$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) {
  // Prefix is undefined
  return "${prefix} ${food}";
}, $food);

これは、代わりに次を使用して渡す必要がありますuse

$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) use ($prefix) {
  return "${prefix} ${food}";
}, $food);

注意: 未定義のプロパティ

このエラーはほとんど同じことを意味しますが、オブジェクトのプロパティを参照しています。counter上記の例を再利用すると、プロパティが設定されていないため、このコードはエラーをトリガーします。

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

関連する質問:

于 2012-10-08T09:14:58.090 に答える
44

注意: 未定義の定数 XXX の使用 - 'XXX' と仮定

または、PHP 7.2 以降の場合:

警告: 未定義の定数 XXX の使用 - 'XXX' と見なされます (これは、PHP の将来のバージョンでエラーをスローします)

この通知は、トークンがコードで使用され、定数のように見えますが、その名前の定数が定義されていない場合に発生します。

この通知の最も一般的な原因の 1 つは、連想配列のキーとして使用される文字列を引用できないことです。

例えば:

// Wrong
echo $array[key];

// Right
echo $array['key'];

別の一般的な原因は$、変数名の前に (ドル) 記号がないことです。

// Wrong
echo varName;

// Right
echo $varName;

または、他の定数またはキーワードのスペルを間違えた可能性があります。

// Wrong
$foo = fasle;

// Right
$foo = false;

また、ライブラリで定義された定数にアクセスしようとしたときに、必要な PHP 拡張機能またはライブラリが見つからないことを示している可能性もあります。

関連する質問:

于 2012-10-07T22:06:37.380 に答える
43

致命的なエラー: クラス[クラス名]を再宣言できません

致命的なエラー: [関数名]を再宣言できません

これは、同じ関数/クラス名を 2 回使用していて、そのうちの 1 つの名前を変更する必要があるか、 または を使用する必要がある場所でrequireまたはを使用しているためであることを意味します。includerequire_onceinclude_once

クラスまたは関数が PHP で宣言されると、それは不変であり、後で新しい値で宣言することはできません。

次のコードを検討してください。

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

を 2 回目に呼び出すとdo_stuff()、上記のエラーが発生します。に変更requireすることrequire_onceで、 の定義を含むファイルがMyClass1 回だけ読み込まれ、エラーが回避されることが保証されます。

于 2012-12-14T13:18:39.567 に答える
36

解析エラー: 構文エラー、予期しない T_VARIABLE

考えられるシナリオ

コードのどこが間違っているのかわかりません。ここに私の完全なエラーがあります:

解析エラー: 構文エラー、予期しない T_VARIABLE 行 x

私がしようとしていること

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

答え

解析エラー:プログラムの構文に問題があります。たとえば、ステートメントの末尾にセミコロンが残っている、または上記の場合のように.演算子が欠落しているなどです。解析エラーが発生すると、インタープリターはプログラムの実行を停止します。

簡単に言えば、これは構文エラーです。つまり、コードに何かがあり、コードが正しく解析されず、実行されていないことを意味します。

あなたがすべきことは、単純な間違いがないかどうか、エラーが発生している行の周りを注意深くチェックすることです。

このエラー メッセージは、ファイルの行 x で、PHP インタープリターが開き括弧を予期していたが、代わりにT_VARIABLE. そのT_VARIABLEことは と呼ばれtokenます。これは、プログラムのさまざまな基本部分を表現する PHP インタープリターの方法です。インタプリタがプログラムを読み取るとき、書き込んだ内容をトークンのリストに変換します。プログラムのどこに変数を置いてもT_VARIABLE、インタープリターのリストにトークンがあります。

よく読んでください:パーサートークンのリスト

したがって、E_PARSE少なくともphp.ini. 解析エラーは、実動スクリプトに存在してはなりません。

コーディング中に、次のステートメントを追加することを常にお勧めしました。

error_reporting(E_ALL);

PHP エラー報告

また、入力中に解析エラーを知らせる IDE を使用することをお勧めします。以下を使用できます。

  1. NetBeans (素晴らしい美しさ、フリーソフトウェア) (私の意見では最高)
  2. PhpStorm (ゴードンおじさんはこれが大好き: P、有料プラン、プロプライエタリおよびフリー ソフトウェアを含む)
  3. Eclipse (美女と野獣、フリーソフト)

関連する質問:

于 2013-03-21T04:31:16.187 に答える
34

Notice: 非オブジェクト エラーのプロパティを取得しようとしています

オブジェクトがないときにオブジェクトのプロパティにアクセスしようとすると発生します。

非オブジェクト通知の典型的な例は次のとおりです。

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

この場合、$usersは配列 (オブジェクトではない) であり、プロパティはありません。

これは、配列の存在しないインデックスまたはキーにアクセスするのと似ています ( Notice: Undefined Indexを参照)。

この例はかなり単純化されています。ほとんどの場合、そのような通知は、チェックされていない戻り値を示します。たとえばNULL、オブジェクトが存在しないか、予期しない非オブジェクト値 (たとえば、Xpath の結果、予期しない形式の JSON 構造、予期しない形式の XML など) の場合にライブラリが返される場合などです。しかし、コードはそのような状態をチェックしません。

これらの非オブジェクトはさらに処理されることが多いため、非オブジェクトでオブジェクト メソッドを呼び出したときに致命的なエラーが発生することがよくあります (参照:致命的なエラー: 非オブジェクトのメンバー関数への呼び出し ... を参照)。脚本。

エラー状態をチェックしたり、変数が期待値と一致することを確認したりすることで、簡単に防ぐことができます。DOMXPathの例を使用したこのような通知は次のとおりです。

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

問題は、コレクションnodeValueに存在するかどうかがチェックされていないときに、最初のアイテムのプロパティ (フィールド) にアクセスすることです。$result代わりに、コードが動作するオブジェクトに変数を割り当てることで、コードをより明示的にすることをお勧めします。

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

関連するエラー:

于 2014-10-26T11:20:33.417 に答える
29

警告: open_basedir 制限が有効です

この警告は、ファイルおよびディレクトリ アクセスに関連するさまざまな機能で表示される可能性があります。構成の問題について警告します。

表示される場合は、一部のファイルへのアクセスが禁止されていることを意味します。

警告自体は何も壊しませんが、ほとんどの場合、ファイル アクセスが妨げられると、スクリプトは適切に機能しません。

修正は、通常、PHP 構成を変更することであり、関連する設定が呼び出されopen_basedirます。

間違ったファイル名またはディレクトリ名が使用されることがありますが、正しい名前を使用することで修正できます。

関連する質問:

于 2012-10-07T19:44:32.163 に答える
23

警告: [関数]は、パラメーター 1 がリソースであると想定しています。ブール値が指定されています

(警告のより一般的なバリエーション: mysql_fetch_array() は、パラメーター 1 がリソースであると想定し、ブール値が与えられます)

リソースは PHP のです (文字列、整数、オブジェクトなど)。リソースは、それ自体に本質的に意味のある値を持たない不透明なブロブです。リソースは、PHP 関数または拡張機能の特定のセットに固有であり、それらによって定義されます。たとえば、Mysql 拡張機能は 2 つのリソース タイプを定義します

MySQL モジュールで使用されるリソース タイプは 2 つあります。1 つ目はデータベース接続のリンク識別子で、2 つ目はクエリの結果を保持するリソースです。

cURL 拡張機能は、別の2 つのリソース タイプを定義します。

... cURL ハンドルと cURL マルチハンドル。

ed の場合var_dump、値は次のようになります。

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

ほとんどのリソースは、(1)特定のタイプ ( (curl)) の数値識別子 ( ) です。

これらのリソースを持ち歩き、そのようなリソースが何かを意味するさまざまな機能に渡します。通常、これらの関数は特定のデータをバックグラウンドで割り当てます。リソースは、このデータを内部的に追跡するために使用する単なる参照です。


... パラメーター 1 がリソースであると想定しています。指定されたブール値false」エラーは、通常、リソースを作成するはずだったが、代わりに返されたチェックされていない操作の結果です。たとえば、fopen関数には次の説明があります。

戻り値

成功時またはFALSEエラー時にファイル ポインター リソースを返します。

したがって、このコードでは、または$fpのいずれかになります。resource(x) of type (stream)false

$fp = fopen(...);

fopen操作が成功したか失敗したかを確認せず$fp、有効なリソースであるか、リソースを必要とする別の関数にfalse渡した場合、上記のエラーが発生する可能性があります。$fp

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

リソースを割り当てようとして失敗する可能性がある関数の戻り値を常にエラーチェックする必要があります。

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

関連するエラー:

于 2012-12-28T09:51:52.383 に答える
22

警告: 無効な文字列オフセット 'XXX'

これは、角括弧構文で配列要素にアクセスしようとしたときに発生しますが、これを配列ではなく文字列に対して行っているため、操作は明らかに意味がありません

例:

$var = "test";
echo $var["a_key"];

変数が配列であるべきだと思われる場合は、それがどこから来たのかを調べて、そこで問題を修正してください。

于 2014-12-28T16:40:40.100 に答える
20

コードが実行されない/PHP コードの一部のように見えるものが出力される

PHP コードからの結果がまったく表示されない場合、および/または Web ページにリテラル PHP ソース コード出力の一部が表示される場合は、PHP が実際に実行されていないことを確信できます。ブラウザーで [ソースの表示] を使用すると、おそらく PHP ソース コード ファイル全体がそのまま表示されます。PHP コードは<?php ?>タグに埋め込まれているため、ブラウザーはそれらを HTML タグとして解釈しようとし、結果が多少混乱する場合があります。

実際に PHP スクリプトを実行するには、以下が必要です。

  • スクリプトを実行する Web サーバー
  • ファイル拡張子を .php に設定します。そうしないと、Web サーバーはそれをそのように解釈しません*
  • Web サーバー経由で .php ファイルにアクセスするには

※再設定しなければ全て設定可能です。

この最後のものは特に重要です。ファイルをダブルクリックするだけで、次のようなアドレスを使用してブラウザーで開くことができます。

file://C:/path/to/my/file.php

これは、実行している可能性のある Web サーバーを完全にバイパスしており、ファイルは解釈されません。おそらく次のような、Web サーバー上のファイルの URL にアクセスする必要があります。

http://localhost/my/file.php

<?の代わりに短い開始タグを使用しているかどうか、<?phpおよび PHP 構成で短い開始タグがオフになっているかどうかを確認することもできます。

PHPコードが実行されていないことも参照してください。代わりにコードがページに表示されます

于 2014-06-26T05:51:40.513 に答える
1

致命的なエラー: Uncaught TypeError: some_function(): Argument #1 must be of type x, y given

このエラーはそれ自体を説明しています。コードが呼び出しsome_function()を試み、引数の 1 つとして間違った型のデータを渡しました。例えば:

<?php declare(strict_types=1);

function multiply(int $x, int $y) { return $x * $y; }

echo multiply("3", 4);

呼び出された関数の最初の引数はintスカラー型であり、呼び出しは厳密な型が有効になっているファイル ( stict_types=1) にあるため、a を渡すと型エラーが発生stringします。

致命的なエラー: Uncaught TypeError: Multiply(): Argument #1 ($x) must be of type integer, string given in...

この例は 3v4l.org にあります。

于 2021-06-01T00:06:00.803 に答える