これは、プログラミング中に発生する可能性のある警告、エラー、および通知に関する多数の回答ですPHP、それらを修正する方法についての手掛かりはありません。これはコミュニティWikiでもありますので、誰でもこのリストに追加して管理することに参加してください。
"ヘッダーは既に送信された" や "非オブジェクトのメンバーを呼び出す" _などの質問は、スタックオーバーフローで頻繁に表示されます。これらの質問の根本的な原因は常に同じです。そのため、それらの質問に対する答えは、通常それらを繰り返してから、特定のケースでどの行を変更するかをOPに示します。これらの回答は、OPの特定のコードにのみ適用されるため、サイトに価値を追加するものではありません。同じエラーを持つ他のユーザーは、ローカライズされているため、簡単に解決策を読み取ることができません。根本的な原因を理解したら、エラーを修正するのは簡単なので、それは悲しいことです。したがって、このリストは一般的な方法で解決策を説明しようとします。
質問がこの質問と重複しているとマークされている場合は、下記のエラーメッセージを見つけてコードに修正を適用してください。一般的な回答だけでは明らかにならない場合があるため、回答には通常、調査のためのリンクが含まれています。
あなたが貢献したいならば、あなたの「好きな」エラーメッセージ、警告または注意、答えごとに1つ、それが意味することについての短い説明(たとえそれが彼らのマニュアルページに用語を強調するだけであっても)、考えられる解決策またはデバッグアプローチ価値がある既存のQ&Aのリスト。また、既存の回答を自由に改善してください。
また、見なさい:
スクリプトがクライアントにHTTPヘッダーを送信しようとしたときに発生しますが、以前に既に出力があったため、ヘッダーが既にクライアントに送信されていました。
これは E_WARNING
であり、スクリプトを停止しません。
典型的な例は、次のようなテンプレートファイルです。
<html>
<?php session_start(); ?>
<head><title>My Page</title>
</html>
...
session_start()
関数は、セッションCookieを含むヘッダーをクライアントに送信しようとします。ただし、PHPは、<html>
要素を出力ストリームに書き込んだときに既にヘッダーを送信しました。 session_start()
を一番上に移動する必要があります。
これを解決するには、警告をトリガーするコードbeforeの行を調べて、出力先を確認します。ヘッダー送信コードをそのコードの前に移動します。
見過ごされがちな出力は、PHPが?>
を閉じた後の新しい行です。ファイル内の最後のものである場合、?>
を省略することは標準的な方法と見なされます。同様に、この警告のもう1つの一般的な原因は、開始<?php
の前に空のスペース、行、または非表示の文字があるため、Webサーバーがヘッダーと空白/改行を送信するため、PHPが解析を開始するときですヘッダーを送信できなくなります。
ファイルに複数の<?php ... ?>
コードブロックがある場合、それらの間にスペースを入れないでください。 (注:コードが自動的に構築された場合、複数のブロックが存在する可能性があります)
また、たとえば、スクリプトのエンコードがBOM付きUTF-8である場合など、コードにバイトオーダーマークがないことを確認してください。
関連する質問:
xyz
がオブジェクトではないため、method
を呼び出すことができないxyz->method()
のようなコードが発生します。
これは致命的なエラーであり、スクリプトを停止させます(前方互換性の通知:PHP 7で始まるキャッチ可能なエラーになります)。
ほとんどの場合、これはコードにエラー状態のチェックがないことを示しています。メソッドを呼び出す前に、オブジェクトが実際にオブジェクトであることを確認してください。
典型的 例は
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
上記の例では、クエリは準備できず、prepare()
はfalse
を$statement
に割り当てます。値がブール値であるためfalse
は「非オブジェクト」であるため、execute()
メソッドを呼び出そうとすると致命的エラーが発生します。
Figure = why あなたの関数はオブジェクトの代わりにブール値を返しました。たとえば、最後に発生したエラーについては$pdo
オブジェクトを確認してください。これをデバッグする方法の詳細は、問題となっている特定の関数/オブジェクト/クラスについてエラーがどのように処理されるかによって異なります。
->prepare
さえ失敗しているなら、あなたの$pdo
データベースハンドルオブジェクト は現在のスコープに渡されませんでした 。定義された場所を見つけます。それをパラメータとして渡したり、プロパティとして保存したり、グローバルスコープで共有したりします。
もう1つの問題は、条件付きでオブジェクトを作成してから、その条件付きブロックの外側でメソッドを呼び出そうとしていることです。例えば
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
条件付きブロックの外側でメソッドを実行しようとすると、オブジェクトが定義されない可能性があります。
関連する質問
死の白ページ または 死の白画面 とも呼ばれます。これは、エラー報告が無効になっていて致命的なエラー(多くの場合構文エラー)が発生したときに発生します。
エラーログを有効にしている場合は、エラーログに具体的なエラーメッセージが表示されます。これは通常 "php_errors.log"と呼ばれるファイルの中、中央の場所(例えば、多くのLinux環境では/var/log/Apache2
)またはスクリプト自体のディレクトリ(共有ホスティング環境で使用されることもあります)にあります。
一時的にエラーの表示を有効にする方が簡単なこともあります。その後、ホワイトページにエラーメッセージが表示されます。これらのエラーはWebサイトを訪れるすべての人に表示されるため、注意してください。
これは、スクリプトの先頭に次のPHPコードを追加することで簡単に実行できます。
ini_set('display_errors', 1); error_reporting(~0);
コードはエラーの表示をオンにして、レポートを最高レベルに設定します。
ini_set()
は実行時に実行されるため、解析/構文エラーには影響しません。これらのエラーはログに表示されます。それらを出力にも表示したい場合(ブラウザなど)、 display_startup_errors
ディレクティブをtrue
に設定する必要があります。これはphp.ini
内または.htaccess
内、あるいは 設定に影響を与える他の方法 before runtime のいずれかで行います。
同じ方法を使用して、 log_errors および error_log ディレクティブを設定して、独自のログファイルの場所を選択できます。
ログを見たり表示を使用したりすると、はるかに優れたエラーメッセージと、スクリプトが停止するコード行が表示されます。
関連する質問
関連エラー
配列に存在しないキーで配列にアクセスしようとしたときに発生します。
Undefined Index
通知の典型的な例は( demo )です。
$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];
spinach
と1
の両方が配列に存在しないため、 E_NOTICE
がトリガされます。
解決策は、そのインデックスにアクセスする前に、インデックスまたはオフセットが存在することを確認することです。これは、あなたが期待するときにそれらのインデックスが存在することを確実にするためにあなたのプログラムのバグを修正する必要があることを意味するかもしれません。または、インデックスが 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
関連する質問
何よりもまず:
新しいコードで
mysql_*
関数を使用しないでください 。それらはもはや保守されておらず 、公式には非推奨です 。 赤いボックス ?代わりに prepared statement について学び、 PDO または MySQLiを使用します - この記事 はどちらを決定するのに役立ちます。 PDOを選択する場合、 こちらが良いチュートリアルです 。
これは、mysql_query
の結果からデータをフェッチしようとしたが、クエリが失敗したときに発生します。
これは警告であり、スクリプトを停止しませんが、プログラムを誤らせます。
mysql_query
によって返された結果を確認する必要があります
$res = mysql_query($sql);
if (!$res) {
die(mysql_error());
}
// after checking, do the fetch
関連する質問:
関連エラー:
また、MySQL結果リソースをパラメーターとして予期する他のmysql*
関数は、同じ理由で同じエラーを生成します。
まだ定義されていない関数を呼び出そうとすると起こります。一般的な原因には、拡張機能の欠落とインクルード、条件付き関数宣言、関数宣言内の関数、または単純なタイプミスが含まれます。
例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
この場合、fn
は、createFn()
が呼び出されたときにのみ宣言されます。 createFn()
への後続の呼び出しは、既存の関数の再宣言に関するエラーをトリガーすることに注意してください。
PHP組み込み関数でもこれが表示される場合があります。 公式マニュアル で関数を検索してみて、それがどの「拡張」(PHPモジュール)に属し、PHPのどのバージョンがそれをサポートしているかを確認してください。
拡張機能がない場合は、その拡張機能をインストールし、php.iniで有効にします。関数が表示される拡張機能については、PHPマニュアルのインストール手順を参照してください。パッケージマネージャーを使用して拡張機能を有効化またはインストールすることもできます(たとえば、DebianまたはUbuntuのapt
yum
(Red HatまたはCentOSの場合)、または共有ホスティング環境のコントロールパネル。
使用しているものからPHPの新しいバージョンで関数が導入された場合、マニュアルまたはそのコメントセクションで代替実装へのリンクを見つけることができます。 PHPから削除されている場合は、不要になる可能性があるため、理由に関する情報を探してください。
インクルードが欠落している場合は、関数を呼び出す前に関数を宣言するファイルを必ず含めてください。
タイプミスの場合は、タイプミスを修正してください。
関連する質問:
$this
は、割り当てられないPHP 内の特殊変数です。存在しないコンテキストでアクセスされた場合、この致命的なエラーが発生します。
このエラーが発生する可能性があります。
静的でないメソッドが静的に呼び出された場合例:
class Foo {
protected $var;
public function __construct($var) {
$this->var = $var;
}
public static function bar () {
// ^^^^^^
echo $this->var;
// ^^^^^
}
}
Foo::bar();
修正方法:$this
はオブジェクトコンテキストでのみ使用でき、静的メソッドでは使用しないでください。また、静的メソッドは非静的プロパティにアクセスしてはいけません。静的プロパティにアクセスするにはself::$static_property
を使用します。
クラスメソッドからのコードが通常の関数または単にグローバルスコープandにコピーされている場合は、$this
特殊変数を保持します。
修正方法:コードを確認して、$this
を別の置換変数に置き換えます。
関連する質問
予期しない場所に T_XXX
token があったり、バランスの取れていない(余分な)括弧があったり、php.iniで有効にしないで短いタグを使用したりした場合などに起こります。
関連する質問
さらに助けが必要な場合:
これは通常、関数をempty
で直接使用するときに起こります。
例:
if (empty(is_null(null))) {
echo 'empty';
}
これは empty
が言語の構成要素であり関数ではないため、5.5より前のPHPバージョンでは引数として式を使って呼び出すことができないためです。 PHP 5.5より前では、empty()
の引数は 変数 でなければなりませんが、PHPでは任意の式(関数の戻り値など)を使用できます。 5.5以上.
empty
は、その名前にもかかわらず、実際には変数が "空"であるかどうかをチェックしません。代わりに、変数が存在しないか、または== false
をチェックします。式(例のis_null(null)
など)は常に存在すると見なされるため、ここでempty
はfalseに等しいかどうかのみを確認します。ここでempty()
を!
に置き換えることができます。 if (!is_null(null))
、または明示的にfalseと比較します。 if (is_null(null) == false)
。
関連する質問
このエラーは、MySQLクエリに渡されたデータを適切にエスケープするのを忘れたためによく起こります。
notは何をするべきか( "悪い考え")の例:
$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);
このコードは、 http://example.com/edit.php?id = 10 のようなURLを使用して送信するフォームのあるページに含めることができます(投稿番号10を編集するため)。
送信されたテキストに一重引用符が含まれているとどうなりますか? $query
は次のようになります。
$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';
そしてこのクエリがMySQLに送信されると、途中に余分な一重引用符があるため、構文が間違っていると文句を言われます。
このようなエラーを回避するには、クエリで使用する前に常にはデータをエスケープする必要があります)。
SQLクエリで使用する前にデータをエスケープすることも非常に重要です。そうしないと、スクリプトがSQLインジェクションに対してオープンになるためです。 SQLインジェクションは、レコード、テーブル、またはデータベース全体の変更、喪失、または修正を引き起こす可能性があります。これは非常に深刻なセキュリティ問題です。
ドキュメンテーション:
このエラーは、複合変数全体が{}
で囲まれていない場合に、二重引用符で囲まれた文字列内の補間のためにquoted keyを使用して配列値を参照しようとしたときに最もよく発生します。
これはUnexpected T_ENCAPSED_AND_WHITESPACE
になります:
echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^
二重引用符で囲まれた文字列では、PHPは配列キー文字列の使用unquotedを許可し、E_NOTICE
を発行しません。したがって、上記は次のように書くことができます。
echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^
複雑な配列変数とキー全体を{}
で囲むことができます。その場合、E_NOTICE
を避けるためにshouldを引用符で囲む必要があります。 PHP documentation は、複雑な変数に対してこの構文を推奨しています。
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']}";
もちろん、上記のanyに代わるものは、配列変数を補間する代わりに連結することです:
echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^
参照用に、 the PHP Strings manual page のVariable Parsingのセクションを参照してください。
スクリプトを実行するのに十分なメモリがありません。 PHPはメモリ制限に達したため、実行を停止します。このエラーは致命的です、スクリプトは停止します。 memory limit の値は、php.ini
ファイルで、またはスクリプトでini_set('memory_limit', '128 M');
を使用して(php.ini
で定義された値を上書きすることで)設定できます。メモリ制限の目的は、1つのPHPスクリプトがすべての使用可能なメモリを大量に消費し、Webサーバ全体を停止させるのを防ぐことです。
最初にすべきことは、スクリプトが必要とするメモリ量を最小限に抑えることです。たとえば、大きなファイルを変数に読み込んでいる場合、またはデータベースから多数のレコードをフェッチしてそれらをすべて配列に格納している場合は、大量のメモリを使用する可能性があります。コードを変更して、ファイルを1行ずつ読み込むか、データベースレコードを1つずつメモリに格納せずに一度に1つずつ取得します。これには、舞台裏で何が起こっているのか、そしてデータがいつ他の場所に保存されているのかという概念的な認識が少し必要です。
スクリプトがメモリを多用する作業を行っていないときにこのエラーが発生した場合は、コードをチェックしてメモリリークがないかどうかを確認する必要があります。 memory_get_usage
関数はあなたの友達です。
関連する質問
通常、include
、require
、fopen
のいずれかでファイルを呼び出し、PHPがファイルを見つけることができなかったか、ファイルをロードするための十分な許可がない場合に起こります。
これはさまざまな理由で発生する可能性があります。
よくある間違いの1つは、絶対パスを使用しないことです。これは、フルパス、または__DIR__
やdirname(__FILE__)
のような 魔法の定数 を使うことで簡単に解決できます。
include __DIR__ . '/inc/globals.inc.php';
または
require dirname(__FILE__) . '/inc/globals.inc.php';
正しいパスが使用されていることを確認することが、これらの問題を解決するための1つのステップです。これは、存在しないファイル、アクセスを妨げるファイルシステムの権利、またはPHP自体によるopen basedir制限にも関連します。
この問題を迅速に解決する最善の方法は、以下のトラブルシューティングチェックリストに従うことです。
関連する質問
関連エラー:
スコープ解決演算子は、ヘブライ語から「Paamayim Nekudotayim」とも呼ばれます。これは "二重コロン"または "二重ドット二重"を意味します。
このエラーは通常、誤ってコードに::
を入れた場合に発生します。
関連する質問
ドキュメンテーション:
これは、同じ関数/クラス名を2回使用していて、そのうちの1つを名前変更する必要があるか、または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番目の呼び出しは上記のエラーを生成します。 require
をrequire_once
に変更することで、MyClass
の定義を含むファイルが一度だけロードされ、エラーが回避されることを確認できます。
またはPHP 7.2以降の場合
この通知は、トークンは、コードで使用されている場合に発生すると一定になるように見えますが、その名前の定数が定義されていません。
この通知の最も一般的な原因の1つは、連想配列キーとして使用されている文字列を引用できないことです。
例えば:
// Wrong
echo $array[key];
// Right
echo $array['key'];
もう1つの一般的な原因は、変数名の前に$
(ドル)記号がないことです。
// Wrong
echo varName;
// Right
echo $varName;
それとも何か他の定数またはキーワードをスペルミスしています:
// Wrong
$foo = fasle;
// Right
$foo = false;
また徴候である可能性があり、その必要PHP拡張したり、そのライブラリで定義された定数にアクセスしようとすると、ライブラリが不足しています。
関連する質問
以前に定義されていない変数を使用しようとしたときに起こります。
典型的な例は
foreach ($items as $item) {
// do something with item
$counter++;
}
以前に$counter
を定義しなかった場合は、上記のコードが通知をトリガーします。
正しい方法は、変数が空の文字列であっても、使用する前に変数を設定することです。
$counter = 0;
foreach ($items as $item) {
// do something with item
$counter++;
}
関連する質問
考えられるシナリオ
私のコードがどこで間違っていたのか見つけることができないようです。これが私の完全な誤りです。
構文解析エラー:構文エラー、行xに予期しないT_VARIABLE
私がやっていること
$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);
また、入力中に解析エラーを知らせるIDEを使用することをお勧めします。あなたが使用することができます:
関連する質問
オブジェクトがないときにオブジェクトのプロパティにアクセスしようとすると発生します。
非オブジェクト通知の典型的な例は次のようになります
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
この場合、$users
は配列(オブジェクトではない)であり、プロパティはありません。
これは、存在しないインデックスまたは配列のキーへのアクセスに似ています( 注意:未定義のインデックス を参照)。
この例は非常に単純化されています。ほとんどの場合、このような通知は未チェックの戻り値を通知します。ライブラリがNULL
を返す場合、オブジェクトが存在しないか、予期しない非オブジェクト値のみ(Xpath結果、予期しない形式のJSON構造、予期しない形式のXMLなど)であるが、コードがチェックしない場合そのような状態。
これらの非オブジェクトはさらに処理されることが多いため、非オブジェクトでオブジェクトメソッドを呼び出すと、次に致命的なエラーが発生することがよくあります(参照: 致命的なエラー:メンバー関数を呼び出す... object )スクリプトを停止します。
エラー条件をチェックするか、変数が期待値に一致するか、またはその両方をチェックすることで簡単に防ぐことができます。ここで、DOMXPathの例のような通知:
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object
問題は、最初のアイテムが$result
コレクションに存在するかどうかを確認していないときに、最初のアイテムのnodeValue
プロパティ(フィールド)にアクセスすることです。代わりに、コードが動作するオブジェクトに変数を割り当てることにより、コードをより明確にすることができます。
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$div = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
$divText = $div->nodeValue;
}
echo $divText;
関連エラー:
*
名前が示すように、この種のエラーは、存在しないキーを使用して配列を反復処理したり、配列から値を見つけようとしている可能性が最も高い場合に発生します。
$string
からのすべての手紙を見せようとしている、あなたを考慮してください
$string = 'ABCD';
for ($i=0, $len = strlen($string); $i <= $len; $i++){
echo "$string[$i] \n";
}
上記の例では( online demo )が生成されます。
A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X
そして、スクリプトがD
のエコーを終了するとすぐにエラーになるでしょう。なぜならfor()
ループの中で、PHPに'ABCD'
の最初から5番目の文字列を表示するように指示したからです。ループは0
から数え始め、4
に達するまでにD
をエコーするので、オフセットエラーが発生します。
同様のエラー:
この警告は、ファイルおよびディレクトリへのアクセスに関連するさまざまな機能で発生する可能性があります。設定の問題について警告します。
表示されたら、一部のファイルへのアクセスが禁止されています。
警告自体は何も壊しませんが、ほとんどの場合、ファイルアクセスが妨げられているとスクリプトが正しく動作しません。
修正方法は、通常 PHP configuration を変更することです。関連する設定は open_basedir
です。
間違ったファイル名やディレクトリ名が使われることもありますが、その場合は正しい名前を使うように修正します。
関連する質問
このエラーには2つの変種があります。
$arr = [1, 2, 3];
この配列初期化子の構文はPHP 5.4でのみ導入されました。それより前のバージョンではパーサエラーが発生します。可能であれば、インストールをアップグレードするか、古い構文を使用してください。
$arr = array(1, 2, 3);
マニュアルの この例 も参照してください。
$suffix = explode(',', 'foo,bar')[1];
配列間接参照関数の結果はPHP 5.4でも導入されました。アップグレードできない場合は、(一時的な)変数を使用する必要があります。
$parts = explode(',', 'foo,bar');
$suffix = $parts[1];
マニュアルの この例 も参照してください。
( Warning:mysql_fetch_array()のより一般的なバリエーションは、パラメータ1がリソースであることを想定しています、ブール値が与えられます )
リソースはPHP内の 型 です(文字列、整数、オブジェクトなど)。リソースは、それ自体の本質的に意味のある値を持たない不透明なBLOBです。リソースは、特定のPHP関数または拡張子のセットに固有のものであり、それらによって定義されます。例えば、Mysql拡張 2つのリソースタイプを定義します :
MySQLモジュールでは2つのリソースタイプが使用されています。最初のものはデータベース接続のためのリンク識別子、2番目のものはクエリの結果を保持するリソースです。
CURLエクステンションは別のものを定義します 2つのリソースタイプ :
... cURLハンドルとcURLマルチハンドル。
var_dump
edの場合、値は次のようになります。
$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);
関連エラー:
これは、角括弧の構文で配列要素にアクセスしようとしたときに発生しますが、これは配列ではなく文字列で実行されるため、 操作は明らかに意味がありません 。
例:
$var = "test";
echo $var["a_key"];
変数が配列であるべきだと思うのなら、それがどこから来たのかを見て、そこで問題を解決してください。
PHPコードの結果がまったく表示されない場合や、WebページにリテラルPHPソースコードの一部が表示されている場合は、必ずPHPは実際には実行されていません。ブラウザで[ソースの表示]を使用している場合は、おそらくPHPソースコードファイル全体がそのまま表示されているはずです。 PHPコードは<?php ?>
タグに埋め込まれているので、ブラウザはそれらをHTMLタグとして解釈しようとしますが、結果は多少混乱して見えるかもしれません。
PHPスクリプトを実際に実行するには、次のものが必要です。
*再設定しない限り、すべて設定できます。
この最後のものは特に重要です。ファイルをダブルクリックするだけで、ブラウザで次のようなアドレスを使用して開くことができます。
file://C:/path/to/my/file.php
これは実行している可能性があるWebサーバーを完全に迂回しており、ファイルは解釈されていません。 Webサーバー上のファイルのURLにアクセスする必要があります。
http://localhost/my/file.php
<?
の代わりに短いオープンタグ<?php
を使用していて、PHP設定で短いオープンタグがオフになっているかどうかも確認することをお勧めします。
この警告は、無効または欠落した認証情報(ユーザー名/パスワード)でMySQL/MariaDBサーバーに接続したときに表示されます。そのため、これは通常notコードの問題ですが、サーバー構成の問題です。
例については mysql_connect("localhost", "user", "pw")
のマニュアルページを参照してください。
実際に$username
および$password
を使用したことを確認してください。
(using password: NO)
を言ったときに起きたことです。ローカルのテストサーバーだけが、通常、ユーザー名root
、パスワードなし、およびtest
データベース名での接続を許可します。
コマンドラインクライアントを使って、それらが 本当に正しい であるかどうかをテストできます。mysql --user="username" --password="password" testdb
ユーザー名とパスワードは大文字と小文字を区別、空白はnotは無視されます。パスワードに$
のようなメタ文字が含まれている場合は、それらをエスケープするか、またはパスワードを 一重引用符 に入れます。
ほとんどの共有ホスティングプロバイダは、unixユーザアカウントに関連してmysqlアカウントを事前に宣言しています(時には単にプレフィックスや余分な数字のサフィックス)。パターンやドキュメントについてはdocsを、そしてパスワードを設定するためのCPanelやその他のインターフェースを参照してください。
ユーザーアカウントの追加 /コマンドラインの使用に関するMySQLのマニュアルを参照してください。 admin userとして接続している場合は、次のようなクエリを発行できます。CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
または Adminer または WorkBench またはその他のグラフィカルツールを使用して、アカウントの詳細を作成、確認、または修正します。
資格情報を修正できない場合は、インターネットに「助けてください」と要求しても効果はありません。あなたとあなたのホスティングプロバイダだけがものを診断して修正するための許可と十分なアクセスを持っています。
プロバイダから指定されたホスト名を使用して、 が データベースサーバーに到達できることを確認します。ping dbserver.hoster.example.net
WebサーバーのSSHコンソールから直接確認してください。あなたのローカル開発クライアントからあなたの共有ホスティングサーバーまでテストすることはめったに意味がありません。
多くの場合、サーバー名を"localhost"
にするだけでよく、通常は利用可能な場合はローカルの名前付きソケットを使用します。それ以外の場合は、フォールバックとして"127.0.0.1"
を試すことができます。
MySQL/MariaDBサーバーが別のポートをリッスンする場合は、"servername:3306"
を使用してください。
それが失敗した場合は、おそらくファイアウォールの問題があります。 (話題外、プログラミング上の質問ではありません。リモートでの推測支援は不可能です。)
定数 を使用する場合DB_USER
またはDB_PASSWORD
は、それらが実際に defined であることを確認してください。
あなたが"Warning: Access defined for 'DB_USER'@'Host'"
と"Notice: use of undefined constant 'DB_PASS'"
を手に入れたなら、それはあなたの問題です。
あなたのxy/db-config.php
は実際に含まれていてwhatelseでした。
正しく設定されたGRANT
permissions を確認してください。
username
+ password
のペアを持つだけでは不十分です。
各MySQL/MariaDBアカウントには、添付の権限セットを設定できます。
それらはあなたがどのデータベースに接続を許可されているか、どのクライアント/サーバーから接続が由来しているか、そしてどのクエリが許可されているかを制限することができます。
特定のテーブルからのSELECT
、またはINSERT
/UPDATE
、より一般的にはDELETE
に対するアクセス権がない場合は、「アクセスが拒否されました」という警告が mysql_query
呼び出しにも表示されることがあります。
アカウントのパーミッションを調整することができます コマンドラインクライアントごとにadminアカウントを使用して以下のようなクエリを使用して接続した場合GRANT ALL ON yourdb.* TO 'username'@'localhost';
警告が最初にWarning: mysql_query(): Access denied for user ''@'localhost'
で表示される場合は、 php.iniに事前設定されたアカウントとパスワードのペア があるとします。
mysql.default_user=
とmysql.default_password=
に意味のある値があることを確認してください。
多くの場合、これはプロバイダ構成です。そのため、ミスマッチについてはサポートに連絡してください。
共有ホスティングプロバイダのドキュメントを探します。
例えば HostGator 、 GoDaddy 、 1and1 、 DigitalOcean 、 BlueHost 、 DreamHost 、 MediaTemple 、 ixWebhosting 、 lunarhosting 、または単にグーグルのあなたのもの。
それ以外の場合は、サポートチャネルを通じてWebホスティングプロバイダに相談してください。
利用可能な接続プールが使い果たされましたもあるかもしれないことに注意してください。同時接続数が多すぎると、アクセス拒否の警告が表示されます。 (あなたはセットアップを調査しなければなりません。それは、プログラミングの問題ではなく、トピックから外れたサーバー構成の問題です。)
あなたのlibmysqlクライアントバージョンは互換性がないかもしれませんデータベースサーバと。通常、MySQLおよびMariaDBサーバーは、ドライバーでコンパイルされたPHPを使用してアクセスできます。カスタムセットアップ、または古いPHPバージョン、およびはるかに新しいデータベースサーバー、あるいはかなり古いデータベースサーバーがある場合 - バージョンの不一致が原因で接続が妨げられる可能性があります。 (いいえ、あなたは自分自身を調査する必要があります。あなたの設定を推測することはできません)。
その他の参考文献
ところで、あなたはおそらく
mysql_*
関数をもう使いたくないでしょう 。新参者はしばしば mysqli に移行しますが、これも面倒です。代わりに PDOと準備されたステートメントを読んでください 。$db = new PDO("mysql:Host=localhost;dbname=testdb", "username", "password");
これは単に配列を文字列として扱おうとした場合に起こります。
$arr = array('foo', 'bar');
echo $arr; // Notice: Array to string conversion
$str = 'Something, ' . $arr; // Notice: Array to string conversion
結果は明確に定義されていないため、単純に配列をecho
nameまたは文字列と連結することはできません。 PHPは、配列の代わりに文字列 "Array"を使用し、それがおそらく意図したものではないので、ここでコードをチェックする必要があることを示す通知をトリガーします。代わりに、このようなものがほしいと思うかもしれません。
echo $arr[0]; // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar
または配列をループします。
foreach($arr as $key => $value) {
echo "array $key = $value";
// displays first: array 0 = foo
// displays next: array 1 = bar
}
この通知があなたが期待していない場所に現れた場合、それはあなたが文字列だと思った変数が実際には配列であることを意味します。つまり、あなたのコードにはあなたが期待する文字列ではなくこの変数を配列にするバグがあります。
警告メッセージ '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
}
関連する質問
クラスの静的でないためにクラスで非静的メソッドを呼び出そうとしたときに発生します。また、error_reporting()
設定にE_STRICT
フラグがあります。
例:
class HTML {
public function br() {
echo '<br>';
}
}
HTML::br()
または$html::br()
error_reporting()
にE_STRICT
を追加しないことで、このエラーを実際に回避できます。
error_reporting(E_ALL & ~E_STRICT);
PHP 5.4.0以降では、E_STRICT
はE_ALL
[ ref ]に含まれています。しかし、それはお勧めできません。解決策は、意図した静的関数を実際のstatic
として定義することです。
public static function br() {
echo '<br>';
}
または従来通り関数を呼び出す:
$html = new HTML();
$html->br();
関連する質問
クラスが use
multiple Traits を試行しようとしたときに発生します。これらのTraitのうち2つ以上が プロパティを定義した を持ち、プロパティの初期値が異なります。
例:
<?php
trait TraitA
{
public $x = 'a';
}
trait TraitB
{
public $x = 'b';
}
class ClassC
{
use TraitA, TraitB;
}
問題あり: 競合するメソッド 間の競合を解決することは可能ですが、競合する2つのプロパティ間の競合を解決する構文は現在ありません。現時点での唯一の解決策は refactor です。つまり、致命的なエラーを引き起こすプロパティ名間の競合を回避します。
関連する質問
HTTPステータスコード500と一般的なApacheまたはブラウザの警告は非常に広いメッセージです。実際のエラーではありません。 Webサーバの設定ミス(.htaccess
)なのか、それともPHP致命的なエラーなのかを判断するには、error.log
を見てください。
通常、Webサーバーerror.log
は以下の場所にあります。
/var/log/Apache2
。ローカルホストおよび仮想ホストによく使用されます。/var/www/_user12345_/logs
または類似のもの。logs/
フォルダの横にhtdocs/
ディレクトリがあります。C:\xampp\Apache\logs\error.log
。httpd.conf
とそのErrorLog
ディレクティブを調べてください。/var/log/nginx/nginx_error.log
。C:\inetpub\logs\LogFiles
。テキストファイルです。エラー時間と最もよく一致するエントリを検索し、エラーメッセージのかなりの部分( "PHP Error:…"から "in line ..."まで)を使用して、さらにGoogleで検索します。
[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message:
PHP Error: Unfiltered input
variable $_JSON['pokestop_lng'] in filyfile.php on line 845
FPM設定の場合、ここで致命的なPHPエラーが表示されることがよくあります。古いmod_php(共有ホスティング)の設定はしばしば警告と通知を混同します(通常これも調べる価値があります)。
システムまたはApacheのログ記録メカニズムを使用するように設定されていない場合は、 PHPのerror.log も確認してください。一般的にはデフォルトのままにして、error_display
+ error_reporting
を有効にして具体的なエラーを明らかにする方が簡単です。 HTTP 500の包括的なページは、結局、 PHPの死の白い画面 の変形にすぎません。
また見なさい:
これは、匿名関数(またはクロージャ)を実行していないことを意味します。
この例では、矢印関数を使用してエラーがスローされます。
echo $fn = fn($x = 42) => $x;
または、匿名関数の場合
echo function($x = 42) { return $x; };
このエラーを解決するには、クロージャを実行する必要があります。
echo $fn = (fn($x = 42) => $x)(30); // take notice of the 2 sets of brackets
echo (function($x = 42) { return $x; })(30);
間違ったタイプのパラメータが関数に渡された場合 - そしてPHPはそれを自動的に変換できない場合 - 警告が投げられます。この警告は、どのパラメーターが問題であるのか、そしてどのようなデータタイプが予想されるのかを識別します。解決策:示されたパラメーターを正しいデータ型に変更してください。
例えば、このコード:
echo substr(["foo"], 23);
この出力結果:
PHP警告:substr()はパラメータ1が文字列、配列指定であることを期待します
Warning:count():パラメータは、Countableを実装する配列またはオブジェクトでなければなりません...
一目瞭然です。 count()
関数に渡されるパラメータは数えられるものでなければなりません、通常は配列です。
考えられる問題は、文字列や整数などのスカラー値が渡された、またはCountable
インターフェースを実装していないオブジェクトです。問題の変数にvar_dump()
を使用すると、これが当てはまるかどうかがわかります。