<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>@blog.justoneplanet.info &#187; Webプログラム</title>
	<atom:link href="http://blog.justoneplanet.info/category/computer-language/php/web-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.justoneplanet.info</link>
	<description>日々勉強</description>
	<lastBuildDate>Wed, 08 Feb 2012 02:57:17 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP Sessions（PHPにおけるセッションの基本）</title>
		<link>http://blog.justoneplanet.info/2009/05/02/php-sessions%ef%bc%88php%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e5%9f%ba%e6%9c%ac%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/05/02/php-sessions%ef%bc%88php%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e5%9f%ba%e6%9c%ac%ef%bc%89/#comments</comments>
		<pubDate>Sat, 02 May 2009 09:53:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webプログラム]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=1050</guid>
		<description><![CDATA[HTTPプロトコルはステートレスなプロトコルであるため、状態を維持することができない。従って、サーバは2つの異なったリクエストが同じユーザによるものなのか判別できない。そこで登場したのがセッションである。 ■セッション  [...]]]></description>
			<content:encoded><![CDATA[<p>HTTPプロトコルはステートレスなプロトコルであるため、状態を維持することができない。従って、サーバは2つの異なったリクエストが同じユーザによるものなのか判別できない。そこで登場したのがセッションである。</p>
<h3>■セッション</h3>
<h4>セッションとは</h4>
<ul>
<li>基本的にはクッキーにIDを保存する形で実現される（但し、GETクエリにIDを保持する形式の場合もある）</li>
<li>一般的にはサーバ上にユーザ毎のファイルが生成されて管理される（但し、session_set_save_handler関数でDBなどに変更することもできる）</li>
<li>セッションファイルの有効期限はphp.iniのsession.gc_maxlifetiomeディレクティブで変更する</li>
<li>session_start関数を呼ぶと、デフォルトでキャッシュされないようになる（HTTPヘッダにCache-control: no-cacheが付加される）</li>
<li>DNSラウンドロビンさせると維持できない。（NFSなどで共有する必要がある）</li>
</ul>
<h4>URLにIDを付加する形式にする方法</h4>
<p>php.iniで以下のように記述する。（セキュリティリスクからデフォルトではoff）</p>
<pre class="brush: bash;">
session.use_trans_sid = on
</pre>
<h4>セッションをスタートする方法</h4>
<p>以下のように、session_start関数を使用する。但し、全ての出力よりも先に記述せねばならない。可読性の観点から、スクリプトの先頭部分に記述することをお勧めしたい。また、session_regenerate_id関数を使用することにより、セッションIDの固定化を防ぎ、よりセキュアなアプリケーションになる（セッションフィグゼーション）。</p>
<pre class="brush: php;">
&lt;?php
session_start();
session_regenerate_id(true);
?&gt;
</pre>
<p>また、以下のようにphp.iniのsession.auto_startディレクティブでも変更が可能である（デフォルトは0）。但し、この方法ではスクリプトが実行される前にセッションがスタートするため、セッションデータにユーザ定義オブジェクトのインスタンスを含めることはできない。</p>
<pre class="brush: bash;">
session.auto_start = 1
</pre>
<h4>セッションに保存したデータを取り出す方法</h4>
<p>以下のように、スーパーグローバル変数$_SESSIONを使用する。</p>
<pre class="brush: php;">
&lt;?php
session_start();
session_regenerate_id(true);//setcookie('PHPSESID', 'new_id')のような効果
if(isset($_SESSION['key'])){
    $_SESSION['key']++;//IDと対になったファイルへの変数の記録
}
else{
    $_SESSION['key'] = 1;//IDと対になったファイルへの変数の記録
}
if(isset($_SESSION['key']) &amp;&amp; $_SESSION['key'] % 2 === 0){
    print('偶数' . $_SESSION['key']);
}
else{
    print('奇数' . $_SESSION['key']);
}
?&gt;
</pre>
<p>あらゆるデータ型を保持（代入）できる。イメージとしてはスクリプトが終わっても保持される、ユーザベースの変数といった感じだ。デフォルトで簡単にセッション管理できるのが、個人的にPHPの好きなところだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/05/02/php-sessions%ef%bc%88php%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e5%9f%ba%e6%9c%ac%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP to HTTP Headers（PHPによるHTTPヘッダの操作）</title>
		<link>http://blog.justoneplanet.info/2009/05/02/php-to-http-headers%ef%bc%88php%e3%81%ab%e3%82%88%e3%82%8bhttp%e3%83%98%e3%83%83%e3%83%80%e3%81%ae%e6%93%8d%e4%bd%9c%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/05/02/php-to-http-headers%ef%bc%88php%e3%81%ab%e3%82%88%e3%82%8bhttp%e3%83%98%e3%83%83%e3%83%80%e3%81%ae%e6%93%8d%e4%bd%9c%ef%bc%89/#comments</comments>
		<pubDate>Sat, 02 May 2009 07:39:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webプログラム]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=1038</guid>
		<description><![CDATA[基本的に、PHPではHTTPヘッダが自動的に生成され、クライアントに送信される。ユーザ側で任意のHTTPヘッダを加えるときには、以下のようにheader関数を使う。また、header関数はあらゆる出力の前に記述しなくては [...]]]></description>
			<content:encoded><![CDATA[<p>基本的に、PHPではHTTPヘッダが自動的に生成され、クライアントに送信される。ユーザ側で任意のHTTPヘッダを加えるときには、以下のようにheader関数を使う。また、header関数はあらゆる出力の前に記述しなくてはならない。</p>
<pre class="brush: php;">
&lt;?php
header('Location: http://google.com');//redirect to google
?&gt;
</pre>
<h3>■リダイレクト</h3>
<p>リダイレクトを行いたいときは、header関数の引数に以下のような記述をする。またスクリプトの実行中にユーザが読み込みを中止するなども考えられるので、exit関数を使用してスクリプトの終了を明示したほうが安全である。</p>
<pre class="brush: php;">
&lt;?php
header('Location: http://yahoo.com');
exit;
?&gt;
</pre>
<p>HTTPの仕様では、Locationヘッダには（相対パスや絶対パスでなく）完全な形のURLを指定しなくてはならない。</p>
<h3>■ページのキャッシュと有効期限</h3>
<p>通常プロキシやブラウザはページをキャッシュするが、その有効期限を以下のように明示することができる。</p>
<pre class="brush: php;">
&lt;?php
$date = date(&quot;D, j M Y H:i:s&quot;, time() + (60 * 60 * 24 * 10));//10 days from now
header(&quot;Expires: {$date} UTC&quot;);
header('Cache-Control: Public');
header('Pragma: Public');
?&gt;
</pre>
<p>また、キャッシュさせたくない場合は、以下のようにキャッシュをさせない指定とページの有効期限を過去にする指定の両方を用いるのが一般的である。</p>
<pre class="brush: php;">
&lt;?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Thu, 31 May 1984 04:35:00 GMT');
?&gt;
</pre>
<p>但し、ブラウザ側で無視するような設定にすることもできるため、上述の設定が正しく反映されている事を前提としたプログラムを実装してはならない。</p>
<h3>■圧縮</h3>
<p>HTTPプロトコルはgzipによる圧縮と解凍をサポートしていて、一般的に5KBを超えるようなページに有用であり、ほとんどのブラウザでサポートされている。以下のようにスクリプトの先頭に出力バッファリング（output buffer）を開始する関数、ob_startを使用することで対応する。</p>
<pre class="brush: php;">
&lt;?php
ob_start('ob_gzhandler');
?&gt;
</pre>
<p>ob_gzhandlerはページを圧縮するための組み込み関数である。また、以下のようにphp.iniファイルの記述を変更する方法でも対応できる。</p>
<pre class="brush: bash;">
zlib.output_compression = on
zlib.output_compression_level = 6
</pre>
<h3>■クッキー</h3>
<p>クッキーはWebアプリケーションがブラウザに保存する小さなテキストデータである。</p>
<h4>クッキーは</h4>
<ul>
<li>1つのクッキーは4KB以下とする</li>
<li>1つのドメインで最大20個とする</li>
<li>1つのクライアントで最大300個しか保持できない</li>
</ul>
<h4>クッキーをブラウザにセットする</h4>
<p>クッキーをブラウザにセットするには、以下のようにsetcookie関数を使用する。</p>
<pre class="brush: php;">
&lt;?php
setcookie(name[, value[, expire[, path[, domain[, secure]]]]]]);
?&gt;
</pre>
<h5>引数について</h5>
<dl>
<dt>name</dt>
<dd>クッキーの名前（空白やセミコロンは使用できない）</dd>
<dt>value</dt>
<dd>任意の文字列値</dd>
<dt>expire</dt>
<dd>有効期限。1970年1月1日午前0時から秒数でカウントした値（=time関数）。セットしなかった場合は、ブラウザが閉じられると削除される。</dd>
<dt>path</dt>
<dd>指定の配下のページのみクッキーを送信する。デフォルトは発行ページのディレクトリ以下</dd>
<dt>domain</dt>
<dd>指定のドメインのみクッキーを送信する。発行サイトのサブドメインのみ指定が可能。デフォルトは現在のサーバのホスト名</dd>
<dt>secure（bool値）</dt>
<dd>trueにするとhttps通信時のみ、クッキーを送信する。デフォルトはfalse</dd>
</dl>
<h5>使用例</h5>
<pre class="brush: php;">
&lt;?php
setcookie('key', 'value', time() + (60 * 60 * 24 * 30));
?&gt;
</pre>
<h4>クッキーをブラウザから読み取る</h4>
<p>厳密にはブラウザは対象の全てのリクエストでクッキーを送信しているので、PHP側でのデータの受け取り方ということになる。以下のようにスーパーグローバル変数$_COOKIEを使用するとアクセスできる。</p>
<pre class="brush: php;">
&lt;?php
if($_COOKIE['key'] === 'value'){
    //code
}
?&gt;
</pre>
<p>また、以下のようにクッキーに配列リテラルが含まれる場合</p>
<pre class="brush: php;">
&lt;?php
setcookie('name[nick]', 'value', time() + (60 * 60 * 24 * 30));
setcookie('name[john]', 'value', time() + (60 * 60 * 24 * 30));
setcookie('name[mike]', 'value', time() + (60 * 60 * 24 * 30));
?&gt;
</pre>
<p>以下のように、$_COOKIE['key']の値も配列となる。</p>
<pre class="brush: php;">
&lt;?php
var_dump($_COOKIE['name']);
/*
array(3) {
  [&quot;nick&quot;]=&gt;
  string(5) &quot;value&quot;
  [&quot;john&quot;]=&gt;
  string(5) &quot;value&quot;
  [&quot;mike&quot;]=&gt;
  string(5) &quot;value&quot;
}
*/
?&gt;
</pre>
<p>PHPにおいてクライアントリクエストに含まれる配列リテラルは、PHP内部で配列に変換される。COOKIEの扱い方について個人的には、PHPはPerlよりも簡単で扱いやすいと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/05/02/php-to-http-headers%ef%bc%88php%e3%81%ab%e3%82%88%e3%82%8bhttp%e3%83%98%e3%83%83%e3%83%80%e3%81%ae%e6%93%8d%e4%bd%9c%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Forms and URLs（フォームとURLの処理）</title>
		<link>http://blog.justoneplanet.info/2009/05/01/php-forms-and-urls%ef%bc%88%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%a8url%e3%81%ae%e5%87%a6%e7%90%86%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/05/01/php-forms-and-urls%ef%bc%88%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%a8url%e3%81%ae%e5%87%a6%e7%90%86%ef%bc%89/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 17:19:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webプログラム]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=1015</guid>
		<description><![CDATA[HTTPメソッドにはGETとPOST（の他のあるが今回は触れない）がある。GETメソッドはURLの一部としてデータを送信できるに過ぎず、データの容量やタイプに制限がある。POSTメソッドはプログラムやサーバの設定が許す範 [...]]]></description>
			<content:encoded><![CDATA[<p>HTTPメソッドにはGETとPOST（の他のあるが今回は触れない）がある。GETメソッドはURLの一部としてデータを送信できるに過ぎず、データの容量やタイプに制限がある。POSTメソッドはプログラムやサーバの設定が許す範囲の大きさのデータを扱え、ファイルのアップロードなども行える。</p>
<h3>■GETメソッド</h3>
<p>以下のように、form要素のmethod属性にGETと記述する。</p>
<pre class="brush: xml;">
&lt;form acton=&quot;index.php&quot; method=&quot;get&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;name&quot; /&gt;
&lt;input type=&quot;text&quot; name=&quot;tel&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; /&gt;
&lt;/form&gt;
</pre>
<p>上述のGETメソッドを使用したフォームで送信を行うと、入力が「John Norton」「0120123456」のとき、以下のURLでブラウザはリクエストを行う。</p>
<pre class="brush: xml;">

http://sample.org/index.php?name=John+Norton&#038;tel=0120123456&#038;submit=submit
</pre>
<p>スペースは「+」に、「&#038;」は「%26」に、「=」は「%3d」といった具合に自動でエンコードされる。index.php側でデータを受け取るには以下のようにスーパーグローバル変数$_GETを使用する。</p>
<pre class="brush: php;">
&lt;?php
$name = $_GET['name'];
?&gt;
</pre>
<h4>URLのエンコードとデコードについて</h4>
<p>前述のようにデータを送信するときには、自動でエンコード処理されるが、PHPでデータを受け取るときはインタプリタが自動でデコードしてくれる。従って例えば「John+Norton」でリクエストされた場合でも以下のように、$_GET['name']内には「John Norton」が格納されている。</p>
<pre class="brush: php;">
&lt;?php
print($_GET['name']);//John Norton
?&gt;
</pre>
<p>但し、リンク先のURLを文字列として出力する必要がある場合などは、以下のようにプログラムでエンコードしてあげる必要がある。</p>
<pre class="brush: php;">
&lt;?php
$name = 'John Norton';
?&gt;
&lt;a href=&quot;&lt;?php print('http://sample.org/index.php?name=' . urlencode($name)); ?&gt;&quot;&gt;詳細はこちら&lt;/a&gt;
</pre>
<h3>■POSTメソッド</h3>
<p>以下のように、form要素のmethod属性にPOSTと記述する。</p>
<pre class="brush: xml;">
&lt;form acton=&quot;index.php&quot; method=&quot;post&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;name&quot; /&gt;
&lt;input type=&quot;text&quot; name=&quot;tel&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; /&gt;
&lt;/form&gt;
</pre>
<p>上述のフォームでPOSTメソッドを使いリクエストをした場合、index.php側でデータを受け取るには以下のようにスーパーグローバル変数$_POSTを使用する。</p>
<pre class="brush: php;">
&lt;?php
$name = $_POST['name'];
?&gt;
</pre>
<div class="kakomi">
<h5>通常フォームのデータを受け取る場合</h5>
<p>相当に簡略化しているが、submitボタンが押されたリクエストか判断するために、以下のようにif構文を用いることが多い。</p>
<pre class="brush: php;">
&lt;?php
if(isset($_POST['submit'])){
    //code
}
?&gt;
</pre>
<p>また、以下のようなコードもしばしば見つけるが、「Notice: Undefined index･･･」と注意が表示される原因にもなる。submitキーのデータが無い状態でページをリクエストすると、$_POSTの配列にsubmitのキーが存在しないことに起因するものである。</p>
<pre class="brush: php;">
&lt;?php
if($_POST['submit']){
    //code
}
?&gt;
</pre>
</div>
<h3>■チェックボックスのデータをPHPで受け取る方法</h3>
<p>name属性に重複名がある場合、PHPでは以下のように、任意の名前の後に[]を付加しなければ正しくデータを受信できない。</p>
<pre class="brush: php;">
&lt;?php
if(isset($_POST['submit']) &amp;&amp; isset($_POST['language']) &amp;&amp; $_POST['language']){
	foreach($_POST['language'] as $lang){
		print($lang . PHP_EOL);
	}
}
?&gt;
&lt;form action=&quot;&lt;?php print($_SERVER['SCRIPT_NAME']); ?&gt;&quot; method=&quot;post&quot;&gt;
&lt;p&gt;What languages do you use?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; name=&quot;language[]&quot; value=&quot;javascript&quot; /&gt;JavaScript&lt;/li&gt;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; name=&quot;language[]&quot; value=&quot;php&quot; /&gt;PHP&lt;/li&gt;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; name=&quot;language[]&quot; value=&quot;mysql&quot; /&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; /&gt;
&lt;/form&gt;
</pre>
<p>このコードでは条件文で$_POST['language']をテストしているが、チェックボックスが一つもチェックされていないときに、$_POSTにlanguageキーが存在しなくなるためである。また、$_POST['language']が配列となる仕組みは以下の特性に起因する。</p>
<pre class="brush: php;">
&lt;?php
if(isset($_POST['submit'])){
    print($_POST['dat']['name']);
    print($_POST['dat']['tel']);
}
?&gt;
&lt;form action=&quot;&lt;?php print($_SERVER['SCRIPT_NAME']); ?&gt;&quot; method=&quot;get&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input type=&quot;text&quot; name=&quot;dat[name]&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;input type=&quot;text&quot; name=&quot;dat[tel]&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; /&gt;
&lt;/form&gt;
</pre>
<p>つまりHTTPクエリのキー内の配列リテラルはそのままPHPに引き継がれるということになる。そして同名キーが存在する場合は、データを正しく取得する方法でもある。</p>
<h3>■スーパーグローバル変数$_REQUEST</h3>
<p>スーパーグローバル変数$_REQUEST['key']を使用すると、$_POST、$_GET、$_COOKIEにアクセスが出来るが、データのどういったものなのか分からずセキュリティを下げる要因になる。従って、$_REQUESTは使用しないことをお勧めする。</p>
<h3>■ファイルのアップロード</h3>
<h4>フォームについて</h4>
<p>ファイルのアップロードを行う場合のフォームは、以下のようにenctype属性を記述せねばならない。そして、MAX_FILE_SIZEでは転送できるファイルの最大容量をバイトで指定できるがtype=&#8221;file&#8221;の前に記述しないと効果がない。また、upload_max_filesizeより大きな値を指定した場合は無視される。</p>
<pre class="brush: xml;">
&lt;form enctype=&quot;multipart/form-data&quot; action=&quot;index.php&quot; method=&quot;post&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;50000&quot;&gt;
&lt;input type=&quot;file&quot; name=&quot;file&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; /&gt;
&lt;form&gt;
</pre>
<p>但し、MAX_FILE_SIZEの値はクライアント側で編集可能な値であり、これを信頼したアプリケーションを作ってはならない。但し、ファイルの転送が終わってから容量制限の判断をする、といった無駄な時間をユーザに与えてしまうといった愚行を防ぐには非常に有効である。</p>
<h4>スクリプトについて</h4>
<p>上述のHTMLから送信されたファイルを受け取るには、以下のように$_FILESを用いる。</p>
<pre class="brush: php;">
&lt;?php
$dat = $_FILES['file'];
var_dump($dat);
/*
array(5) {
  [&quot;name&quot;]=&gt;
  string(12) &quot;20090428.txt&quot;
  [&quot;type&quot;]=&gt;
  string(10) &quot;text/plain&quot;
  [&quot;tmp_name&quot;]=&gt;
  string(14) &quot;/tmp/phpGxxRLV&quot;
  [&quot;error&quot;]=&gt;
  int(0)
  [&quot;size&quot;]=&gt;
  int(140)
}
*/
?&gt;
</pre>
<p>以上を見てみると、$_FILESには実際のファイルの情報でなく、以下のような情報が格納されている。</p>
<dl>
<dt>name</dt>
<dd>送信したファイルのクライアント上の名前</dd>
<dt>type</dt>
<dd>ブラウザが判断したMIMEタイプ</dd>
<dt>tmp_name</dt>
<dd>サーバ上に保存された一時的なファイルの名前</dd>
<dt>error</dt>
<dd>エラー番号</dd>
<dt>size</dt>
<dd>ファイルのサイズ（バイト）</dd>
</dl>
<p>アップロードしたファイルをアプリケーションで使用する場合は、以下のようにmove_uploaded_file関数を使う。move_uploaded_file関数では、第一引数にテンポラリーファイル名、第二引数に保存するファイル名を指定する。</p>
<pre class="brush: php;">
&lt;?php
$filename = 'sample.txt';
if(move_uploaded_file($_FILES['file']['tmp_name'], &quot;/www/sample.org/httpdocs/doc/$filename&quot;){
    //code
}
?&gt;
</pre>
<p>move_uploaded_file関数は指定ファイルがユーザーによりアップロードされたものか判定する処理も含まれている。また、アップロードされたファイルをサーバー上に保存する際に、クライアントの送信に依存した$_FILES['file']['name']をそのまま使うのは、セキュリティ上の問題となり得る。ちなみにファイルがアップロードできたか判定するには、以下のようにis_uploaded_file関数を使用する。</p>
<pre class="brush: php;">
&lt;?php
if(is_uploaded_file($_FILES['file']['tmp_name'])){
    //code
}
else{
    print($_FILES['file']['error']);
}
?&gt;
</pre>
<h4>ファイルアップロードに関連するphp.iniの設定</h4>
<dl>
<dt>post_max_size</dt>
<dd>POSTメソッドで許可するデータのサイズ。upload_max_filesizeより大きな値を設定する必要がある。</dd>
<dt>max_input_time</dt>
<dd>POST、GET 、ファイルアップロードなどの入力を パースする最大の時間を設定。秒単位で指定。</dd>
<dt>upload_max_filesize</dt>
<dd>アップロードできる最大ファイル容量。</dd>
</dl>
<h3>■GETとPOSTの性質</h3>
<p>DBを更新するような、サーバに変更を加えるような処理にGETリクエストを使ってはならない。ファイルをはじめとした、大量のデータ送信する場合はPOSTを使わなければならない。</p>
<table>
<tr>
<td></td>
<th>GET</th>
<th>POST</th>
</tr>
<tr>
<th>データの送信</th>
<td>フォームのパラメータをURL形式にエンコードして、クエリ文字列として送信する</td>
<td>フォームのパラメータをHTTPリクエストに直接、書き込む</td>
</tr>
<tr>
<th>ブックマーク</th>
<td>可能</td>
<td>不可能</td>
</tr>
<tr>
<th>仕様上の冪等性</th>
<td>○<br />任意のURLで何回リクエストしても結果が同じというような実装をすべきある。またブラウザは結果をキャッシュする</td>
<td>×<br />リクエストの結果が場合によって異なるなど、結果をキャッシュしないような場面に適している</td>
</tr>
</table>
<h4>冪等性について</h4>
<p>冪等性とは「ある操作を複数回行っても動作が同じである事」である。</p>
<p>また、POSTリクエストでも、実際には一般ユーザーが「戻る」ボタンを押し「リロード（再送信）」する事もある。従って、アプリケーションを制作する際は考慮しなくてはならない。</p>
<h4>フォーム要素について</h4>
<ul>
<li>method属性の属性値は大文字で書いた方が良い（理論上、大文字/小文字の両方を受け付けるが、ブラウザのバグを考慮）</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/05/01/php-forms-and-urls%ef%bc%88%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%a8url%e3%81%ae%e5%87%a6%e7%90%86%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

