違い 参考資料-このエラーはPHPで何を意味していますか?




php 変数 宣言 (24)

これは何ですか?

これは、PHPをプログラミングする際に遭遇する可能性のある警告、エラー、および注意事項に関する多くの回答であり、修正する手がかりがありません。 これはコミュニティWikiでもあり、誰もがこのリストの追加と管理に参加するよう呼びかけられています。

どうしてこれなの?

Stack Overflowで「Headers already sent」「non-objectのメンバーを呼び出す といった質問が頻繁にポップアップします 。 これらの質問の根本的な原因は常に同じです。 したがって、これらの質問に対する回答は、通常、それらを繰り返し、その特定のケースでどのラインを変更するのかをOPに示します。 これらの回答は、OPの特定のコードにのみ適用されるため、サイトに価値を追加するものではありません。 同じエラーを持つ他のユーザーは、ローカライズされているため、ソリューションを簡単に読み取ることができません。 根本的な原因を理解すれば、エラーを修正するのは簡単ではないので、悲しいです。 したがって、このリストは一般的な方法で解を説明しようとします。

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

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

貢献したい場合は、「お気に入り」のエラーメッセージ、警告または通知、回答ごとに1つ、簡単な説明(マニュアルページの用語を強調表示しているにすぎない)、可能な解決方法またはデバッグ方法、価値のある既存のQ&Aのリスト。 また、既存の回答を自由に改善してください。

リスト

また見てください


注意:定義されていない定数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拡張モジュールやライブラリが見つからないというサインになることもあります。

関連する質問:


警告: [関数] :ストリームを開くことに失敗しました: [理由]

通常はincluderequireまたはfopenでファイルを呼び出すと、PHPがファイルを見つけられなかったり、ファイルを読み込むための十分な権限がありません。

これは、さまざまな理由で発生します。

  • ファイルパスが間違っています
  • ファイルパスは相対パスです
  • インクルードパスが間違っている
  • 権限があまりにも制限的
  • SELinuxは有効です
  • などなど ...

1つのよくある間違いは、絶対パスを使用しないことです。 これは、 dirname(__FILE__)dirname(__FILE__)ようなフルパスやマジック定数を使うと簡単に解決できます:

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

または:

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

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

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

関連する質問:

関連するエラー:


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

あなたのPHPコードの結果が何も表示されない場合や、あなたのリテラルPHPソースコードの出力の一部がWebページに表示されている場合は、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コードが実行されていないことを参照してください。代わりにページにコードが表示されます。


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

xyz->method()に似たコードでxyz->method()はオブジェクトではないため、そのmethodを呼び出すことはできません。

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

多くの場合、これはコードがエラー状態のチェックを欠いているという兆候です。 そのメソッドを呼び出す前に、オブジェクトが実際にオブジェクトであることを検証します。

typical例は

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

上記の例では、クエリをprepare()ことはできず、 prepare()$statementfalseを代入しfalse 。 値が真であるため、 falseは "非オブジェクト"なので、 execute()メソッドを呼び出そうとすると致命的なエラーになります。

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

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

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

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

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

関連する質問:

  • 非オブジェクト上のメンバ関数への呼び出し
  • すべてのPHPのリスト "致命的なエラー:メンバ関数への呼び出し...非オブジェクトの" に関する質問

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

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

まず、スクリプトに必要なメモリ量を最小限に抑えることです。 たとえば、大きなファイルを変数に読み込んでいる場合や、データベースから多数のレコードを取り出して配列に格納している場合、メモリが大量に消費される可能性があります。 コードを変更して、行単位でファイルを読み込むか、データベースレコードを一度に1つずつメモリに格納しないでフェッチします。 これは、シーンの裏側で何が起こっているのか、データがメモリに格納されているのか他の場所に格納されているのかを概念的に認識させる必要があります。

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

関連する質問:

  • すべて "致命的なエラー:XXXバイトのメモリサイズが使い果たされました" に関する質問

注意:初期化されていない文字列オフセット: *

名前が示しているように、このようなタイプのエラーは、反復処理しようとする可能性が最も高い場合、または存在しないキーを持つ配列から値を見つける場合に発生します。

$stringからすべての文字を表示しようとしてい$string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

上の例は、( オンラインデモ )を生成します

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

そして、スクリプトがDをエコーし​​終えるとすぐに、 for()ループの中でPHPにあなたに'ABCD'文字列の最初から5番目の文字を表示するように指示しているので、エラーは発生しますが、ループは0から数え始め、 4に達するまでにDをエコーすると、オフセットエラーが発生します。

同様のエラー:

  • 不正な文字列オフセット 'オプション1'

注意:未定義のインデックス

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

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

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

spinach1両方が配列に存在しないため、 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 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

関連する質問:


警告:mysql_fetch_array()はパラメータ1がresource、booleanが指定されていると想定しています

まず、

新しいコードでmysql_*関数を使用しないでください 。 彼らはもはや維持されておらず、公式に推奨されていません赤い箱を見ますか? 代わりに準備文について学び、 PDOまたはMySQLiを使用してください。 この記事では、どちらを決定するのに役立ちます。 PDOを選択した場合、 ここでは良いチュートリアルです。

これは、 mysql_queryの結果からデータを取得しようとしたが、クエリが失敗したときに発生します。

これは警告であり、スクリプトを停止することはありませんが、プログラムを間違ってしまいます。

mysql_queryによって返された結果を次のようにチェックする必要があります。

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

関連する質問:

関連するエラー:

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


警告:ゼロ除算

警告メッセージ 'Division by zero'は、新しいPHP開発者の間で最もよく尋ねられる質問の1つです。このエラーは例外を発生させないため、開発者の中には、式の前にエラー抑止演算子@を追加することによって、警告を時折抑止するものがあります。例えば:

$value = @(2 / 0);

しかし、どのような警告と同様、最善の方法は、警告の原因を追跡して解決することです。警告の原因は、0で割った場合、0に等しい変数、または割り当てられていない変数(NULL == 0なので)の結果が「未定義」になるためです。

この警告を修正するには、値が0ではないことを確認するために式を書き直す必要があります。値がゼロの場合は、除算しないでください。または値を1に変更してから除算して、除算結果が追加の変数のみで除算されたものと等しくなるようにします。

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

関連する質問:


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

白ページまたは死の 白スクリーンとも呼ばれます。 これは、エラー報告がオフになり、致命的なエラー(多くの場合、構文エラー)が発生した場合に発生します。

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

一時的にエラーの表示を有効にする方が簡単な場合もあります。 白いページにエラーメッセージが表示されます。 これらのエラーはウェブサイトを訪れるすべての人に見えるので注意してください。

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

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

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

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

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

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

関連する質問:

関連するエラー:


致命的なエラー:オブジェクトコンテキストにないときに$ 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. すべて "オブジェクトコンテキストでないときは$ thisを使用する" に関する質問

注意:未定義の変数

これまでに定義されていない変数を使用しようとしたときに発生します。

典型的な例は

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

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

正しい方法は、たとえ空の文字列であっても変数を使用する前に変数を設定することです

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

関連する質問:


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

このエラーには2つのバリエーションがあります。

バリエーション1

$arr = [1, 2, 3];

この配列初期化子の構文は、PHP 5.4でのみ導入されました。それ以前のバージョンではパーサーエラーが発生します。可能であれば、インストールをアップグレードするか、古い構文を使用します。

$arr = array(1, 2, 3);

マニュアルのこの例も参照してください。

バリエーション2

$suffix = explode(',', 'foo,bar')[1];

配列逆参照関数の結果もPHP 5.4で導入されました。アップグレードが不可能な場合は、(一時的な)変数を使用する必要があります:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

マニュアルのこの例も参照してください。


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

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

エラーの場合:

これによりUnexpected T_ENCAPSED_AND_WHITESPACEUnexpected T_ENCAPSED_AND_WHITESPACEが発生し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を避けるため引用符でE_NOTICE 必要がありE_NOTICEPHPのドキュメントでは、複雑な変数に対してこの構文を推奨しています。

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マニュアルページの 変数の解析に関する節を参照してください。


警告:[関数]は、パラメータ1がresource、booleanが指定されていると想定しています

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

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

MySQLモジュールには2つのリソースタイプがあります。最初のものはデータベース接続のリンク識別子で、2番目はクエリの結果を保持するリソースです。

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

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

ときvar_dump編、値は次のようになります。

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

resource(1) of type (curl)

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

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

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

戻り値

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

したがって、このコードで$fpは、a 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);

関連するエラー:


警告:mysql_connect():ユーザー 'name'のアクセスが拒否されました@ 'host'

この警告は、資格情報が無効または不足しているMySQL / MariaDBサーバに接続すると表示されます(ユーザ名/パスワード)。だから、これは一般的にあるではないコードの問題が、サーバー構成の問題。

  • mysql_connect("localhost", "user", "pw")例については、マニュアルページを参照してください。

  • 実際にa $usernameとbを使用していることを確認してください$password

    • あなたがパスワードを使わないでアクセスするのは珍しいことです。これは、警告が発せられたときに起きたこと(using password: NO)です。
    • 通常、ローカルのテストサーバだけが、ユーザ名root、パスワード、およびtestデータベース名で接続することができます。

    • コマンドラインクライアントを使用して、それらが本当に正しいかどうかをテストできます。
      mysql --user="username" --password="password" testdb

    • ユーザー名とパスワードは大文字と小文字を区別し、空白は無視されません。パスワードに以下のようなメタ文字が含まれている場合は、$それらをエスケープするか、パスワードを一重引用符で囲みます

    • ほとんどの共有ホスティングプロバイダは、unixユーザアカウントに関連してmysqlアカウントをプリペアします(プレフィックスや余分な数字の接尾辞だけであることもあります)。パターンやドキュメント、パスワードを設定するためのCPanelなどのインタフェースについては、ドキュメントを参照してください。

    • コマンドラインを使用したユーザーアカウントの追加に関するMySQLのマニュアルを参照してください。管理ユーザーとして接続すると、次のようなクエリを発行できます。
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • また、AdminerWorkBenchなどのグラフィカルツールを使用して、アカウントの詳細を作成、確認、修正することもできます。

    • あなたの資格情報を修正できない場合は、インターネットに「助けてください」と尋ねることは効果がありません。あなたとあなたのホスティングプロバイダだけが、物事を診断して修正するのに十分なアクセス権とアクセス権を持っています。

  • プロバイダが指定したホスト名を使用して、データベースサーバにアクセスできることを確認します。
    ping dbserver.hoster.example.net

    • あなたのWebサーバー上のSSHコンソールからこれを直接確認してください。ローカル開発クライアントから共有ホスティングサーバーへのテストはほとんど意味がありません。

    • サーバ名"localhost"は通常、使用可能な場合にはローカルの名前付きソケットを使用します。他の場合は"127.0.0.1"代替として試すことができます。

    • あなたのMySQL / MariaDBサーバは、別のポートでリッスンしてから使用してください"servername:3306"

    • それが失敗すると、おそらくファイアウォールの問題があります。(オフトピック、プログラミングの質問ではありません。リモート推測は不可能です。)

  • 例えば、またはのような定数を使用するときは、実際にdefinedていることを確認してください。DB_USERDB_PASSWORDdefined

    • あなたがa "Warning: Access defined for 'DB_USER'@'host'"とa を得るなら"Notice: use of undefined constant 'DB_PASS'"、それはあなたの問題です。

    • あなたの例xy/db-config.phpが実際に含まれていたかどうかを確認してください。

  • 正しく設定されたGRANT権限がないか確認してください。

    • username+ passwordペアを持つことは十分ではありません。

    • 各MySQL / MariaDBアカウントには、一連のアクセス権が添付されています。

    • これらは、接続が許可されているデータベース、接続が発生しているクライアント/サーバー、許可されているクエリを制限できます。

    • したがって、特定のテーブルまたは/ およびより一般的なものからのmysql_queryアクセス権を持っていない場合は、「アクセス拒否」警告がコールに表示されることがあります。SELECTINSERTUPDATEDELETE

    • 次のようなクエリを使用してadminアカウントを使用してコマンドラインクライアントごとに接続すると、アカウントのアクセス許可を変更できます。
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • 警告が最初に表示されるWarning: mysql_query(): Access denied for user ''@'localhost'場合は、php.iniの事前設定されたアカウントとパスワードのペアがあります。

    • それを確認mysql.default_user=し、mysql.default_password=意味のある値を持っています。

    • 多くの場合、これはプロバイダー構成です。だから、不一致のサポートに連絡してください。

  • 共有ホスティングプロバイダのドキュメントを探します:

  • 使用可能な接続プールなくなっている可能性があります。同時接続数が多すぎると、アクセス拒否警告が表示されます。(セットアップを調査する必要があります。これはプログラミングに関する質問ではなく、トピック以外のサーバー構成の問題です。)

  • libmysqlクライアントのバージョンがデータベース・サーバーと互換性がない可能性があります。通常、MySQLおよびMariaDBサーバには、ドライバでコンパイルされたPHPを使用できます。カスタムセットアップ、古いPHPバージョン、さらには新しいデータベースサーバ、または古いバージョンのデータベースがある場合、バージョンが一致しないと接続が妨げられることがあります。(いいえ、自分で調べる必要があります。誰もあなたの設定を推測することはできません)。

その他の参考文献:

Btw、あなたはおそらく、mysql_*もはや機能を使用したくないでしょう。新規参入者はしばしばmysqliに移行しますが、これはちょっと退屈です。代わりにPDOと準備されたステートメントを読んでください
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


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

スクリプトがHTTPヘッダーをクライアントに送信しようとしたときに既に出力されているため、ヘッダーが既にクライアントに送信されていた場合に発生します。

これはE_WARNINGあり、スクリプトを停止することはありません。

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

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

session_start()関数はセッションクッキーを含むヘッダーをクライアントに送信しようとします。 しかし、 <html>要素を出力ストリームに<html>と、PHPは既にヘッダーを送信していました。 session_start()を先頭に移動する必要があります。

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

よく見落とされる出力は、PHPの終了後の新しい行?> 。 それがファイル内の最後のものであるときは?>を省略することが標準的な方法と考えられます。 同様に、この警告のもう一つの一般的な原因は、 <?php前に空白、行、または目に見えない文字があるため、PHPが解析を開始するときにWebサーバーがヘッダーと空白/改行を送信する場合です任意のヘッダーを提出する。

ファイルに複数の<?php ... ?>コードブロックがある場合は、それらの間にスペースを入れてはいけません。 (注:自動的に構築されたコードを持っていた場合、複数のブロックがあるかもしれません)

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

関連する質問:


警告:不正な文字列オフセット 'XXX'

これは、角括弧構文で配列要素にアクセスしようとしたときに起こりますが、配列ではなく文字列に対してこれを実行しているので、操作がはっきりとわかりません

例:

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

変数を配列にする必要があると思う場合は、その変数がどこから来ているのかを確認し、そこで問題を修正してください。


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

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

つまり、同じ関数/クラス名を2回使用していて、それらの名前の1つを変更する必要がありinclude_once 。それはrequire_onceまたはinclude_onceを使用requireまたはincludeを使用したためです。

クラスまたは関数が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();

do_stuff()への2回目の呼び出しでは、上記のエラーが発生します。 requirerequire_onceに変更requireことによって、 MyClassの定義を含むファイルが一度だけロードされ、エラーが回避されることが確実になります。


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

予期せぬ場所にT_XXXトークンがあり、不均衡な(余計な)括弧、php.iniでアクティブ化せずに短いタグを使うなど、多くのことがT_XXXます

関連する質問:

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


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(投稿番号10を編集する)などのURLを使用して、送信するフォームのページに含めることができます。

送信されたテキストに一重引用符が含まれているとどうなりますか? $queryは次のようになり$query

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

このクエリがMySQLに送信されると、真ん中に余分な一重引用符があるため、構文が間違っていると不平を言うでしょう。

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

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

ドキュメンテーション:


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

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

例1 - 条件付き関数宣言

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

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

例2 - 関数宣言の関数

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

この場合、 fncreateFn()が呼び出されたcreateFn()のみ宣言されます。 createFn()を後で呼び出すと、Existing関数の再宣言に関するエラーが発生することに注意してください。

また、PHP組み込み関数の場合はこれを見ることができます。 公式マニュアルの機能を調べて、それが属する「拡張モジュール」(PHPモジュール)とそれをサポートするPHPのバージョンを確認してください。

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

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

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

タイプミスの場合は、タイプミスを修正してください。

関連する質問:

  • https://.com/search?q=Fatal+error%3A+Call+to+undefined+function

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

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

非オブジェクト通知の典型的な例は、

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

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

これは、配列の存在しないインデックスまたはキーへのアクセスに似ています(「注意:未定義インデックス」を参照)。

この例は非常に単純化されています。多くの場合、このような通知は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 ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

関連するエラー:

  • 注意:未定義のインデックス
  • 致命的なエラー:非オブジェクト上のメンバ関数への呼び出し...

厳密な標準:非静的メソッド[<class> :: <method>]は静的に呼び出されるべきではありません

静的であるためにクラスで非静的メソッドを呼び出そうとしたときに発生E_STRICTし、error_reporting()設定にもフラグが設定されています。

例:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() または $html::br()

あなたが実際に追加しないことで、このエラーを回避することが可能E_STRICTerror_reporting()、例えば

error_reporting(E_ALL & ~E_STRICT);

PHP 5.4.0以降E_STRICTE_ALL[ ref ]に含まれているからです。しかし、それはアドバイスできません。解決方法は、目的の静的関数を実際のものとして定義することstaticです。

public static function br() {
  echo '<br>';
}

従来どおり関数を呼び出すことができます:

$html = new HTML();
$html->br();

関連する質問:





warnings