2016-08-31 8 views
0

私はちょうどPHPを使い始めていますが、私がオンラインで見ても、$ _POSTのスーパーグローバルがどのように実際に動作するかについて詳しくは解りません。

$ _POSTのスーパーグローバルは、スクリプト内のどこにでもアクセスできる連想配列であり、ポストリクエストで受け取った値を保持するという基本を理解しています。私の質問は、ウェブサイト上のすべてのPHPファイルに共通するのでしょうか?そうでない場合は、データを投稿したいウェブサイトのファイルを指定する方法と、$ _POSTが受け取ったファイルを別のファイルに転送する方法はありますか?そのデータで何かをする前に$ _POST(すなわち$ _POST ["name"])のあるインデックスにデータが送られるのを待つコードを作ると、あなたのコードは変数をすぐには設定しませんリクエストを受け取る前にnullである前述のポストインデックスに?

私は、フォーム処理に関しては、$ _POSTを使用しても問題はありませんが、投稿リクエストを外部に送信すると、$ _POSTで作業することはできませんフィドラーのようなプログラムから。私は "application/x-www-form-urlencoded"形式の投稿データを、無料のウェブサイトホスティングサービスでホストされているテスト用ウェブサイトに送信しようとしました。何があっても$ _POST ["name" ](はい、私が送信しているデータは、 "name = test"であると正しく書かれています)が、サイトのすべてのファイルにNULL型であるため、SQLデータベースにこの送信データを格納することはできません。

+1

$ _POSTがどのように内部的に動作するのか知りたくありません。 POSTリクエストで何が問題なのかを知りたいので、コードを共有していないかどうかは分かりません。 –

+0

リダイレクトルールの.htaccessファイルを作成しましたか? –

答えて

1

は、ウェブサイト上のすべてのPHPファイルに共通ですか?

もちろんです。そうでなければ、それほど良いことはないでしょう。どのようにあなたはそれが要求が

または転送で受信したものになることURLを扱う持つことにより

にデータをポストするWebサイト上のファイルを指定します

他のファイルへの$ _POST?

一般的には、includeというファイルです。あなたは、データが

一般的にそのデータを使って何かを行う前に、$ _POST(すなわち、$ _POST [「名前」])内の特定のインデックスに送信されるのを待ち、コードを作るにはどうすればよい

あなたは言いません。

PHPを使用するWebサイトでは、Webサーバー全体がPHPで記述されません。

WebサーバーにPHPスクリプトを置いてURLを付けます。クライアントはそのURLに対してHTTP要求を行います。 Webサーバーは、その要求に応じてPHPプログラムを開始します。 PHPプログラムが終了すると、PHPプログラムの出力がクライアントに返されます。

フォーム処理に関しては、$ _POSTを使用しても問題はありません。外部からの投稿リクエスト(Fiddlerなどのプログラムなど)を送信すると、$ _POSTで動作するものはありません。

2つのケースには全く違いはありません。いずれにしても、HTTPリクエストがサーバーに送信され、PHPが応答します。

手動で作成しようとすると、不正なリクエストが行われている可能性があります。

-2
In form declaration should use method post. 
<form name="form_name" action="your file path to post" method="post"> 
<input type="text" name="name" value=""> 
<input type="submit" name="submit" value="submit"> 
</form> 

Code for post file 

$sql = "insert into table set col = '.$_POST['name'].'"; 
mysql_query($sql); 
+0

**危険**:[削除済み](http://php.net/ [廃番**データベースAPI](http://stackoverflow.com/q/12859942/19068))を使用しています。 manual/en/mysql.php)をPHPから入手してください。 [現代的な代替品](http://php.net/manual/en/mysqlinfo.api.choosing.php)を選択する必要があります。あなたは** [SQLインジェクション攻撃](http://bobby-tables.com/)**に対して脆弱です**現代のAPIは、[防御]を容易にします(http://stackoverflow.com/questions/60174/最良の方法からSQLへのPHPインジェクション)をあなた自身から守ってください。 – Quentin

1

HTTPリクエストに戻るレイヤーを1つ戻します。 *サーバー側のPHPと対話するときは、HTTPリクエストのコンテキストになります。*「リンクをクリック」すると、サーバーにHTTP GET要求が発生します。これはPHPスクリプトによって処理される可能性があります。フォームを送信すると、HTTP POST要求がサーバーに送信されます。この要求は、PHPスクリプトによって処理される可能性があります。

*そうでない場合を除き、私たちはあまり一般的なケースを無視するよ... PHPスクリプトによって処理され

各要求を実行する一つのPHPインスタンスが発生します。それはどんな.phpファイルが要求されているかで始まり、このファイルは処理中のinclude/require個の.phpファイルになります。これらはすべて同じHTTPリクエストのコンテキスト内で実行されています。どんな場合でもechoまたはそれ以外の場合はHTTP応答として出力されます。スクリプトが完了し、すべての出力が応答として返されると、PHPインスタンスがシャットダウンし、スクリプトの実行が終了します。次の着信HTTPリクエスト... HTTPリクエストで送信され

任意本体データまで(典型的にはPOST HTTPリクエストで)application/x-www-form-urlencoded形式でエンコードされ、自動的にPHPによって解析され、解析されたデータは、で利用可能となりますグローバル変数$_POSTこの変数/データは、PHPインスタンス全体で使用可能です。 HTTPボディデータにアクセスするための便利なAPIです。 PHPインスタンスが終了すると、HTTPリクエストが終了すると、このデータは破棄されます。データは各リクエスト、各PHPインスタンスに固有のものです。

ボディデータがapplication/x-www-form-urlencodedでない場合は、代わりにJSONエンコードされているとします.PHPは解析できず、$_POSTが入力されません。この場合、あなたは例えば、手動で身体を読み、解析する必要があります。:

$body = file_get_contents('php://input'); 
$data = json_decode($body); 

$_GETグローバル変数は非常に似ていますが、それは解析されたURLのクエリパラメータ(例えばhttp://…/example.php?foo=bar&baz=42)が含まれています。いいえ、GET HTTP要求に対してのみ機能しません。すべてのHTTP要求に対して機能します。これは、この変数の率直な悪い命名のためによくある誤解です。

+0

ありがとう!それは多くをクリアしました。ほんのわずかなこと - ウェブサイトに2つのファイル、index.php、extra.phpがあり、そのリクエストに投稿リクエストが送信された場合、そのリクエストはindex.phpだけで受信されるのでしょうか?このリクエストが実際に受信されたとき、PHPコードは、実際には$ _POST ["なにか"の値を持っていることを除いて、誰かが実際にウェブサイトでそれを表示しようとしていた場合と同じように動作しますか? – staple

+0

これらのファイルの1つだけがWebサーバーによって実行されます。両方をWebサーバーで実行することはできません。 「そのURL」は、これらのファイルの1つを指します。 HTTPリクエストに応答して実行されるファイルは、リクエストのコンテキストを持ちます。つまり、 '$ _POST'のHTTPボディデータにアクセスできます。 - 再度、index.php 'include 'extra.php''を実行すると、extra.phpは同じHTTPリクエストのコンテキストで実行され、同じ' $ _POST'データにアクセスできます。しかし、POSTデータなしで '.../extra.php'に別のリクエストを行うと、明らかにそうではありません。 – deceze

+0

index.phpではなくextra.phpにリクエストを送信するには、URLにファイルの場所がどのように表示されるかを考慮して、リクエストを "http://www.examplesite.com/extra.php"に向けなければなりません? – staple

関連する問題