ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルの一般的な問題の概要

php_PHP チュートリアルの一般的な問題の概要

WBOY
WBOYオリジナル
2016-07-13 10:56:011157ブラウズ

PHP開発でよくある疑問や小さな問題をまとめた記事です。

上記の機能の一部の違い

1.isset()とempty()の違い
どちらも変数のテストに使用されます。ただし、 isset() は変数に値が割り当てられているかどうかをテストし、 empty() は値が割り当てられている変数が空かどうかをテストします。 PHP で値を割り当てずに変数を参照する場合は許可されますが、注意事項が表示されます。変数に null 値、$foo=""、$foo=0、または $foo=false が割り当てられている場合、empty($foo) は true を返し、isset($foo) も true を返します。つまり、null 値を割り当てると、変数をログアウトしないでください。変数の登録を解除するには、unset($foo) または $foo=NULL を使用します。
2.エラーメッセージの表示方法
php.ini で display_errors = On および error_reporting = E_ALL を指定すると、すべてのエラーとプロンプトが表示されます。以前の PHP 記述方法を使用すると、エラー メッセージのほとんどが表示されます。未定義の変数についてです。変数に値が割り当てられる前に、変数が呼び出されるときにプロンプ​​トが表示されます。解決策は、それを検出またはブロックすることです
3. 一重引用符と二重引用符の違いは何ですか?いつ使用しますか?
一重引用符では、変数 ($var) と特殊なエスケープ文字 (「t r n」など) は解析されないため、PHP の解析速度は速くなります。エスケープ文字は単一引用符の「'」と「" のみをサポートします。」引用符とバックスラッシュ自体のエスケープ。二重引用符内では変数 ($var) の値が文字列に置き換えられ、特殊なエスケープ文字も特定の単一文字に解析されます。また、上記の 2 つの特性を特に対象としたものもあります。 "$" や " などの特別な関数エスケープ。プログラミングはより便利ですが、PHP の解析も非常に遅くなります。配列内で添え字が整数ではなく文字列型である場合は、必ず一重引用符を使用してください。添え字を囲みます。 、正しい書き方は、$array[key] ではなく、$array['key'] です。間違った書き方をすると、PHP パーサーは key が定数であると判断し、まず定数が存在するかどうかを判断します。それ以外の場合は、のみを使用します。 "key" を式の添字として使用すると、エラー イベントがトリガーされて通知レベルのエラーが生成されるため、一重引用符が使用できるほとんどの状況では二重引用符を使用しないでください。
4.print、echo、print_rの違いは何ですか?いつ使用する必要がありますか?
Echo と print はどちらも出力を行うことができます。違いは、echo は関数ではなく戻り値がありませんが、print は戻り値のある関数であるため、相対的には echo を出力するだけの方が高速であり、print_r は通常、変数を出力するために使用され、デバッグでよく使用されます
5. PHP でリモート ファイルを開く必要がある場合があります
リモート ファイルを開く関数は次のとおりです: fopen(http://XXX.com/a.php)、fsockopen(http://XXX.com/a.php)、file_get_contents(http://XXX.com/a) .php ) など)
php5 および apache2.2.X 環境では、ファイル ストリームを開けず、http リクエストが失敗したことを示すメッセージが表示されます (ストリームを開けませんでした: HTTP リクエストが失敗しました!)
php.ini には 2 つのオプションがあります:
allow_url_fopen =on (URL を介してリモート ファイルを開くことができることを示します)、
user_agent=”PHP”(ネットワークにアクセスするためにどのスクリプトが使用されるかを示します。デフォルトでは、その前に「;」があります。削除してください。)
Apache サービスを再起動するだけです。

6. auto_increment の値を事前に取得するにはどうすればよいですか?
mysql_connect('localhost','root','root') または die('サーバーに接続できません');
mysql_select_db( ’test’); $sql = “show create table id_user” //id_userd はテーブル名です
$query = mysql_query($sql);
$arr = mysql_fetch_array($query);
$b = strstr($arr[1],’AUTO_INCREMENT=’); // AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 を含む部分文字列を取得します )
$result = intval(substr($b,15)); //substr()は文字列の16番目から文字列を取得し、取得した文字列をint型に変換します
echo ‘value of AUTO_INCREMENT’ .$result; // 出力結果:次回データ挿入時のID値です

7. 顧客情報の取得に使用します

getenv(”REMOTE_ADDR”) は視聴者の IP を取得できます getenv("HTTP_USER_AGENT") はブラウザのオペレーティング システムの種類とブラウザの種類を取得できます
getenv は $_ENV グローバル変数内のすべてを取得できます
print_r($_ENV)は色々な事が見れます
たとえば
echo getenv(ALLUSERSPROFILE); ALLUSERSPROFILE
の値が確認できます。 echo getenv(PATHEXT); PATHEXT
の値が確認できます。
8.mysql_fetch_row() と mysql_fetch_array() の違い

mysql_fetch_array() は mysql_fetch_row() の拡張バージョンです。データを数値インデックスとして配列に保存するだけでなく、フィールド名をキーとして使用して、データを連想インデックスとして保存することもできます。 mysql_fetch_array() を使用することは、mysql_fetch_row() を使用する場合よりも大幅に遅くならず、より多くの値も提供します。 mysql_fetch_array() のオプションの 2 番目のパラメータ result_type は、MYSQL_ASSOC、MYSQL_NUM、MYSQL_BOTH の値を受け入れることができる定数です。この機能は PHP 3.0.7 以降の新機能です。このパラメータのデフォルト値は MYSQL_BOTH です。
9. EODの使用法と効果
一重引用符や二重引用符よりも優れており、改行を含めることができます。 EOD は他の文字に変更できます。
10. gdate() を使用して長い数値文字列を通常の時間に変換するにはどうすればよいですか?
gmdate は GMT 時間を返します。それ以外の場合は、date() 関数とまったく同じです。現地時間が必要な場合は、date() を使用してタイムスタンプをフォーマットします。
11.正規表現の ()// の違いは何ですか?
/ / はパターン区切り文字であり、内部に規則的なルールがあることを意味します。
( ) はサブパターンを表します。 // には、1 2 または $1 $2 を使用して、前のサブパターンの値と一致させることができます。
12.require と require_once の違いは何ですか?
require を繰り返し呼び出すと、読み込むファイルが複数回ロードされます。require_once は、実際に何回呼び出したかに関係なく、1 回だけロードされ、主に複雑なファイルの包含関係に使用されます
たとえば、b には a が含まれ、c には a が含まれますが、同時に c にも b が含まれる場合、require を使用すると、a が 2 回読み込まれる可能性があります
13. 3 つの IP アドレスの取得の違いは何ですか?
$_SERVER['REMOTE_ADDR'];
$_SERVER['HTTP_CLIENT_IP'];
$_SERVER['HTTP_X_FORWARDED_FOR'];
$_SERVER['REMOTE_ADDR']; // アクセス者 (おそらくユーザー、おそらくプロキシ) IP
$_SERVER['HTTP_CLIENT_IP']; //エージェント側 (存在する可能性がありますが、偽造される可能性があります)
$_SERVER['HTTP_X_FORWARDED_FOR'] //ユーザーがプロキシとして使用する IP (存在するか、偽造される可能性があります)
14. $_GET と $_POST の違いは何ですか?
1: get メソッドは渡される値のサイズを制限します。ポストは渡される値のサイズを制限しません。
2: Get はサーバーからデータを取得するために使用され、Post はサーバーへのデータ転送に使用されます。
3: Get は、アクションが指す URL にフォーム内のデータを変数=値の形式で追加し、その 2 つを「?」で接続し、各変数を「&」で接続します。フォーム内のデータをアクションが指す URL に送信します。 データはフォームのデータ本体に配置され、対応する変数と値に従ってアクションが指す URL に渡されます。
4: Get は安全ではありません。送信プロセス中にデータが要求された URL に配置され、多くの既存のサーバー、プロキシ サーバー、またはユーザー エージェントが要求された URL をログ ファイルに記録してどこかに配置するためです。個人情報は第三者に見られる可能性があります。さらに、ユーザーは送信されたデータをブラウザ上で直接見ることもでき、一部の内部システム メッセージがユーザーの目の前に表示されます。すべての Post 操作はユーザーには表示されません。
15. クラス内の関数の前に public と private を追加できますが、関数ライブラリ内の関数の前に追加することはできません。
関数は自由にカスタマイズでき、public はパブリックに使用されるクラス属性オブジェクト、private は独立して使用されるクラス属性オブジェクトです。 クラスのパブリックまたはプライベートとは、メソッド (「メソッド」と呼ばれることに注意してください) がクラスに対してパブリックかプライベートかを指します。参照している関数ライブラリは「関数」のライブラリであり、クラス内のメソッドには属しません。クラスなので、その必要はありません。事前変更はできません。

16. ページの実行時間はどのように計算されますか?

コードは次のとおりですコードをコピー$mtime =explode(’ ‘, microtime());

17. UTF8 エンコーディング スクリプト session_start()、header()、settcookie() およびその他の関数でエラーが発生し、「ヘッダーはすでに送信されました」というメッセージが表示されます。
UTF8 エンコーディング スクリプト。通常、エディターは UTF8 エンコーディング形式を識別するために 3 バイトの BOM エンコーディングを追加し、通常のファイル エディターには表示されず、最初に HTML で出力されます。上記の関数を実行すると、上記のエラーが表示されます。解決策: BOM をクリアできる editplus などのエディタを使用し、BOM をクリアして (BOM をクリアするには utf8 に設定します)、保存します。
18. PHP における一重引用符、二重引用符、バッククォートの違い
PHP の一重引用符 (’)、二重引用符 ("")、およびバックティック (`) は文字列を引用符で囲むことができます。一重引用符で囲まれた変数はエスケープされず、二重引用符で囲まれた変数はエスケープされ、バックティックで囲まれた変数はエスケープされてシェル コマンドとして実行されます。

Xia Cheng がいくつかの一般的な開発上の問題を紹介しました

以下では、小さな問題からいくつかの致命的な間違いまで説明します。 3 つの部分に分かれています。
パート 1、軽微なエラー
1. Printf()、
この関数は主にデータのフォーマットと表示に使用されます。特定のデータの表示形式を変更したい場合にのみ使用してください。
たとえば、PI の値 (3.1415926) をさまざまな精度で表示します。

$starttime = $mtime[1] + $mtime[0];



$mtime =explode('', microtime());
$endtime = $mtime[1] + $mtime[0];
$usedtime = $endtime - $starttime;
printf("
%0.4f s", $usedtime);

しかし、多くのプログラマーは、この関数をいくつかの変数値と関数の戻り値を表示するためにのみ使用します。 Printf() はデータを表示する前にデータを整形するため、速度が遅くなります。そのため、データを表示する場合にのみ print と echo を使用して高速化します。
コードは次のとおりです コードをコピー

printf ("Pi は: %.2fn
n", M_PI); printf ("Pi も: %.3fn
n", M_PI); printf ("Pi も: %.4fn
n", M_PI); ?>



2. セマンティックチェック


PHP は弱い型指定言語であるため、使用する前に変数を定義する必要がありません。これはプログラミングに大きな利便性と柔軟性をもたらしますが、変数は実行時に、どのような型であるべきかを知っておく必要があります。それでも実際には特定の型 (さまざまな型) に対応します
は相互に自由に変換できます)、型のない変数は存在しません。 PHP がセマンティック エラーを検出できない可能性はありますが、変数の型の変更により、潜在的な問題が発生する可能性があります。注目に値するもう 1 つの問題は、変数のスコープです。これも
​​ を引き起こす可能性があります。

いくつかの潜在的な問題が発生する可能性があります。

PHP には次の基本的な変数があります:

ブール値、リソース、整数、倍精度浮動小数点数、文字列、配列、オブジェクト。


3. 一時変数の使用

一時変数の乱用はプログラムの動作効率の低下につながります。一時変数をいつ使用するかは、次の 2 つの点に基づいて検討できます。 1. 変数が少なくとも 2 回使用されているかどうか。 2. この変数を使用すると、プログラムの可読性が大幅に向上するかどうか。
上記のいずれも満たされない場合、この変数の使用は省略されます。例:



コードは次のとおりです

コードをコピー $tmp = 日付 ("F d, h:i a"); $tmp を印刷します。 ?> 次のように変更する必要があります:
日付を印刷 ("F d, h:i a"); ?>

別の例:


// 文字列 reverse_characters(string str)
// 文字列内のすべての文字を反転します
関数 reverse_characters ($str)
{

return implode ("", array_reverse (preg_split("//", $str))); }


?>



はあまり読みにくいので、次のように変更できます:

コードは次のとおりです コードをコピー

// 文字列 reverse_characters(string str)
// 文字列内のすべての文字を反転します
関数 reverse_characters ($str)
{
$characters = preg_split ("//", $str); $characters = array_reverse ($characters);
内破を返します ("", $characters); }

?>



インターネットで見つかったいくつかの問題


phpのよくある質問集 2009-09-10 11:07 [1] ページ間で変数の受け渡しができない
最新の PHP バージョンでは、get、post、session の自動グローバル変数がオフになっているため、前のページから送信された変数を取得するには、$_GET['foo']、$_POST['foo']、$_SESSION を使用します。 [ 'foo']
を取得します もちろん、自動グローバル変数を on に変更することもできます (php.ini を register_globals = On に変更します)。互換性を考慮して、新しい記述方法に慣れることをお勧めします。

【2】Win32環境でgetメソッドを使用してapache2に中国語パラメータを渡すとエラーが発生します
test.php?a=こんにちは&b=こんにちは
パラメータを渡すと内部エラーが発生します
解決策: "test.php?a=".urlencode(Hello)."&b=".urlencode(Hello)

【3】win32でのセッションが正常に動作しない
php.ini のデフォルトの session.save_path = /tmp
これは明らかに Linux での設定です。win32 の PHP ではセッション ファイルの読み書きができないため、セッションが使用できなくなります
これを絶対パスに変更するだけです (例: session.save_path = c:windowstemp

)

【4】エラーメッセージを表示する
php.ini で display_errors = On および error_reporting = E_ALL を指定すると、すべてのエラーとプロンプトが表示されます。以前の PHP 記述方法を使用すると、エラー メッセージのほとんどが表示されます。未定義変数について。変数に値が割り当てられる前に、変数が呼び出されるときにプロンプ​​トが表示されます。解決策は、変数を検出またはブロックすることです
たとえば、$foo を表示するには、if(isset($foo)) echo $foo または echo @$foo

を実行できます。

【5】mail()はWin32環境ではメール送信できません
Linux で設定された Sendmail は送信できますが、win32 ではメールを送信するために SMTP サーバーを呼び出す必要があります
php.ini = ip の SMTP を変更します //ip は検証機能のない SMTP サーバーです (オンラインで見つけるのは困難です)
PHPでメールを送信するための最良の解決策は、サーバーを転送せずにソケットを使用して相手のメールサーバーに直接送信することです
非常に優れたクラスがありますが、メッセージの送信を高速化するために修正する必要があります。修正されたバージョンは近い将来リリースされる予定です

【6】HEADER を使用すると、通常、ヘッダーが送信済みのエラーが発生します。これにはいくつかの理由が考えられます。 1. HEADER を使用する前に PRING または ECHO を実行します
2. 現在のファイルの前に空白行があります
3. ファイルを INCLUDE しており、ファイルの末尾に空白行があると、出力にこのエラーが表示されます。 !
session_register() も使用してください

【7】mysqlの初期インストール時にパスワードを設定しない場合は、

を使用してください。 mysql.user を更新して、password=password("yourpassword") where user="root" を設定します

【8】php.iniを変更しても変化なし

IIS、ApacheなどのWebサーバーを再起動すると、最新の設定が適用されます

【9】2003年にインストールしたphp(ISAPIインストール方法)

PHP4のphp4isapi.dllは2003と競合するようでCGIモードでしかインストールできないようです

ステップ 1、まずインストール プログラムに移動します。php-4.2.3-installer.exe をインストールしました。最新バージョンも見つかります。php-4.2.3-installer.exe をインストールする前に、IIS6.0 であることを確認してください。が開始され、アクセスできるようになりました。 インストール後、デフォルトの Web サイトに移動します -->アプリケーション構成

ステップ 2: [Web サービス拡張機能] --> [新しい Web サービス拡張機能] をクリックします。 ステップ 3: 拡張子 -->php を追加し、
を追加します ステップ 4: php.exe へのパスを見つけて追加します。
ステップ 5: 確認して完了です。
ステップ 6: PHP サービス拡張機能を選択し、「許可」をクリックします。

【10】SQL文が機​​能せず、データベース操作が失敗する場合があります

デバッグする最も簡単な方法は、SQL ステートメントをエコーし​​て変数の値を取得できるかどうかを確認することです


【11】

コードは次のとおりです

// PHP 3 以降で利用可能

print $HTTP_POST_VARS['ユーザー名'];


// PHP 4.1.0 以降で利用可能

$_POST['ユーザー名'] を印刷します

print $_REQUEST['ユーザー名'];

import_request_variables('p', 'p_'); $p_ユーザー名を印刷します;


// PHP ディレクティブ register_globals = on の場合に使用可能です。ただし、PHP 4.2.0 以降、デフォルト値は register_globals = off になっており、この方法は推奨されません。

$ユーザー名を印刷します

?>


GET フォームの使用も似ていますが、適切な GET 事前定義変数を使用する必要があります。 GET は QUERY_STRING (URL の「?」以降の情報) でも機能します。したがって、たとえば、http://www.example.com/test.php?id=3 には、$_GET['id'] でアクセスできる GET データが含まれています。 $_REQUEST および import_request_variables() を参照してください。
PHP 4.2.0 より前では、 register_globals のデフォルト値は on でした。 PHP 3 では、その値は常に on です。このディレクティブに依存しないことをお勧めします。また、ディレクティブがオフであると想定してコーディングすることをお勧めします。

[12] 変数を一時ファイルに一時的に保存します:

コードをコピー
コードは次のとおりです コードをコピー

if(file_exists('temp.php'))
{
$x=r('temp.php'); @eval("$a = $x;"); }
if(!is_array($a)){
#配列 A を再構築する
$a=array(array("af"=>"fsdf"),"f"=>"df"); }
w('temp.php',var_export($a,true));

var_dump($a); ドキュメントデータの読み取りと書き込み
関数 r($file_name)

{

$filenum=@fopen($file_name,"r"); @flock($filenum,LOCK_SH); $file_data=@fread($filenum,filesize($file_name)); @fclose($filenum); $file_data を返す
}
関数 w($file_name,$data,$method="w")
{
$filenum=@fopen($ファイル名,$メソッド); 群れ($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); $file_data を返す
}



【13】includeとrequireの違い
私のテストによると、インクルードするファイルが存在しない場合、 include プロンプトが表示され、次のステートメントの実行が続行され、致命的なエラーが発生して終了します。これらは最初にインクルードされてから実行されるため、ディレクトリの混乱を引き起こすため、インクルードされたファイルに include ステートメントや require ステートメントを含めないことをお勧めします。 Linux では状況が異なる可能性があります。まだテストしていませんが、ファイルを複数回インクルードしたくない場合は、 include_once または require_once を使用できます。

【14】関数とメソッドへのセッションの適用: セッションに登録する予定の変数はグローバルである必要があります。

その理由は次のとおりです:

PHP の session_register 関数は変数の名前のみを記憶し、変数の値は記憶しません。
サーバー側でこの変数の値を実際に記憶する必要があるのは、スクリプト全体の実行が終了した後です。つまり、スクリプトが実行されるまで、変数の値は読み取られず、サーバー側の一時ディレクトリに保存されません。このようにして、すべての関数でメソッドの外部の変数、または関数またはメソッド内でグローバル変数として定義された変数のみが正常に登録され、その他の変数はスクリプトの最後に設定解除されます。

【15】PHPのセッションはCookieに基づいて実装されているため、すべてのセッションウィンドウを閉じてもすぐには消えません。これは他のスクリプト言語と異なり、憂鬱な気分にもなります。

答え: いいえ、いいえ、上記の友人は PHP のセッションを徹底的に研究していません。PHP のセッションが Cookie に関連していると言わなければならない場合、それはクライアントに session_id が記録されていることを意味します。 サーバー側の一時ディレクトリに、session_id とほぼ同じ名前のファイルが生成されます。このファイルは、正常に登録された変数とその値の実際の記録です。同様に、クライアントが Cookie の使用を禁止している場合、PHP は session_id の値が失われないように get メソッドで自動的に session_id の値を渡します。したがって、Cookie とセッションの関係はそれほど切り離せないものではありません。さらに、PHP のセッションは Cookie に基づいているとは言えません。


【16】isset()とempty()の違い

PHP で値を割り当てずに変数を参照する場合は許可されますが、警告が表示されます

; どちらも変数をテストするために使用されますが、 isset() は変数に値が割り当てられているかどうかをテストし、empty() は値が割り当てられている変数が空かどうかをテストします
変数に null 値、$foo=""、$foo=0、または $foo=false が割り当てられている場合、empty($foo) は true を返し、isset($foo) も true を返します。つまり、null 値を割り当てると、変数をログアウトしないでください。変数の登録を解除するには、unset($foo) または $foo=NULL を使用できます

【17】HTTPプロトコルで複数のファイルを一度にアップロードする方法

同じメソッドの 2 つのアイデアと 2 つの実装があります。

1. 次のように、フォームに複数のファイル入力ボックスを設定し、配列で名前を付けます:

コードは次のとおりです<フォームアクション=""メソッド=post enctype="multipart/form-data"> <入力タイプ=ファイル名=使用ファイル[]> <入力タイプ=ファイル名=使用ファイル[]> <入力タイプ=ファイル名=使用ファイル[]> このようにして、サーバー側で以下のテストを行います
コードをコピー
エコー "
";
print_r($_FILES);
echo "
";


2. フォームに複数のファイル入力ボックスを設定しますが、次のように名前が異なります。 <フォームアクション=""メソッド=post enctype="multipart/form-data"> <入力タイプ=ファイル名=usefile_a> <入力タイプ=ファイル名=usefile_b> <入力タイプ=ファイル名=usefile_c> サーバー側でも同じテストを実行します:
エコー "

";
print_r($_FILES);
echo "
";



【18】一時的な PHP 形式ファイルを作成し、必要な場所に含めることができます。これにより、一時的な PHP ファイルで定義された変数が利用可能になり、セッションを置き換えることができます。

【19】上でも述べたように、getメソッドやpostメソッドで送信したものは直接使えないので、自分でコードを書いてグローバル変数に変換して使うと便利です。同じやり方で。
GET または POST を通じて送信された変数をグローバル変数に変換します:

コードは次のとおりです コードをコピー
foreach($_GET as $key=>$value){
$$キー=$値
}
foreach($_POST as $key=>$value){
$$キー=$値
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632206.html技術記事この記事ではPHP開発でよくある疑問や小さな問題をまとめていますので参考にしてください。 上記のいくつかの関数の違い、 1. isset() と empty() の違い 両方とも...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。