特定のファイルをダウンロードさせる

HTML
<a href="download_x.php">ファイルをダウンロード</a><br>

ソースコード【download_x.php】

	<?php 
	$filepath = 'test/xxx2.zip'; // ダウンロードするファイルのパス
	$filename = 'xxx3.zip'; // ダウンロード時のファイル名
	
	header('Content-Type: application/force-download'); // コンテンツタイプを指定する
	header('Content-Length: '.filesize($filepath)); // 進捗を表示
	header('Content-Disposition: attachment; filename="'.$filename.'"'); // ダウンロード時のファイル名をセット
	readfile($filepath); // ファイル読込とダウンロードの実行
	?>
	



submitの挙動

テキストボックスにフォーカスが当てられている時にEnterキーを押すとSubmitされる。
ただし、form要素外のテキストボックスである場合、Enterキーを押してもSubmitは行われない。

デモ:EnterキーによるSubmitの挙動

ソースコード

	<form action="#" method="post">
		
		<?php 
		if(!empty($_POST)){
			echo 'いろは';
		}
		?>
		<br>
		
		<input type="text" name="aaa" value="Form内のテキストボックス"/>← フォーカスしてEnterキーを押すとsubmitが発動する
		<input type="submit" name="submit1" value="TEST1"/>
	</form>
	<input type="text" name="aaa2" value="Form外のテキストボックス"/>← フォーカスしてEnterキーを押してもsubmitは発動しない
	<br>
	

XML用の記号エスケープ関数 | escapeMarkForXML

XML用の記号エスケープ関数のソースコード

	/**
	 * XML用の記号エスケープ関数
	 * 
	 * @note
	 * 記号「 &<>"' 」をXML用にエスケープする
	 * 
	 * @param any $data
	 * @return エスケープ後のデータ
	 */
	function escapeMarkForXML($data){
	
		if(is_array($data)){
			foreach ($data as $key => $v){
				$data[$key] = escapeMarkForXML($v);
			}
			return $data;
		}else{
			if(gettype($data) == 'string'){
				
				$search = array('&','<','>','"',"'");
				$replace = array('&amp;','&lt;','&gt;','&quot;','&apos;');
				
				$data = str_replace($search, $replace, $data);
			}
			return $data;
		}
	}
	



エスケープ前

		array (size=2)
		  'neko' => string '<input />' (length=9)
		  0 => 
		    array (size=3)
		      0 => string '<>&"'' (length=5)
		      1 => int 122
		      2 => 
		        array (size=2)
		          'dog' => string '犬">' (length=5)
		          'pig' => null
	

エスケープ後

	array (size=2)
	  'neko' => string '&lt;input /&gt;' (length=15)
	  0 => 
	    array (size=3)
	      0 => string '&lt;&gt;&amp;&quot;&apos;' (length=25)
	      1 => int 122
	      2 => 
	        array (size=2)
	          'dog' => string '犬&quot;&gt;' (length=13)
	          'pig' => null
	


ファイルおよびディレクトリのパーミッション(属性)を変更する

ディレクトリのパーミッションを777(読込、書込、実行らをすべて許可)
	chmod('animal/cat',0777);

ファイルのパーミッションを777に変更する場合
	chmod('animal/cat/buti-neko.png',0777);

chmodの第2引数は8進数を指定しなければならない。
0777の頭についている0は8進数であることを表している。
0を省略して777にすると10進数になるのでバグになる。

パーミッションについて


ファイル存在チェック(フォルダと日本語名も検証)| is_file,file_exists

検証

ファイル存在チェックはis_file関数、またはfile_exists関数で可能である。
いずれの関数もファイルが存在するなら1を返し、存在しないなら空を返す。

is_fileとfile_existsの違い

file_existsはファイルだけでなくフォルダの存在チェックができる。
is_fileはフォルダ存在チェックはできないが、処理速度はfile_existsより速い。

サンプル

	echo is_file('sample/test1.png'); // → 1
	echo file_exists('sample/test1.png'); // → 1
	echo is_file('sample/test2/'); // → 空
	echo file_exists('sample/test2/'); // → 1
	

日本語のファイル名への対応

is_fileとfile_existsに、そのまま日本語ファイル名(日本語フォルダ名)を渡しても、存在チェックできない。
しかし、mb_convert_encodingで変換すれば存在チェックが可能になる。
	$fp=mb_convert_encoding('sample/日本語.png', 'sjis', 'utf-8');
	echo is_file($fp); // → 1
	
	$dp=mb_convert_encoding('sample/日本語フォルダ/', 'sjis', 'utf-8');
	echo file_exists($dp); // → 1
	
通常は上記の方法で良いが環境によっては、以下の方法で試すことができる。
	$fn=mb_convert_encoding($fn, 'sjis', 'utf-8,sjis,euc_jp,jis');



データのグループ化


	<?php 
	$data = array(
			array('id'=>1,'kind_no'=>1,'name'=>'シリケンイモリ'),
			array('id'=>2,'kind_no'=>2,'name'=>'イシカワガエル'),
			array('id'=>3,'kind_no'=>3,'name'=>'タイワンカブト'),
			array('id'=>4,'kind_no'=>2,'name'=>'フロストガエル'),
			array('id'=>5,'kind_no'=>2,'name'=>'リュウキュウアカガエル'),
			array('id'=>6,'kind_no'=>4,'name'=>'リュウキュウアオバト'),
			array('id'=>7,'kind_no'=>4,'name'=>'ノグチゲラ'),
			array('id'=>8,'kind_no'=>3,'name'=>'ヤンバルテナガコガネ'),
	);
	
	// データのグループ化
	$data = dataGrouping($data,'kind_no');
	
	var_dump($data);
	
	
	/**
	 * データのグループ化
	 *
	 * @note
	 * データをグループフィールドでグループ分けする。
	 * グループ分けすることにより最初の2次元構造から3次元構造に変換される。
	 *
	 * @param array $data データ(2次元構造、エンティティの配列)
	 * @param array $group_field グループフィールド
	 * @return グループ化したデータ(3次元構造)
	 */
	function dataGrouping($data,$group_field){
	
		$data2 = array();
	
		foreach($data as $ent){
			$group_value = $ent[$group_field];
			if(empty($data2[$group_value])){
				$data2[$group_value] = array();
			}
			$data2[$group_value][] = $ent;
		}
	
		return $data2;
	}
	
	?>
	

ダンプ出力

	array (size=4)
	  1 => 
	    array (size=1)
	      0 => 
	        array (size=3)
	          'id' => int 1
	          'kind_no' => int 1
	          'name' => string 'シリケンイモリ' (length=21)
	  2 => 
	    array (size=3)
	      0 => 
	        array (size=3)
	          'id' => int 2
	          'kind_no' => int 2
	          'name' => string 'イシカワガエル' (length=21)
	      1 => 
	        array (size=3)
	          'id' => int 4
	          'kind_no' => int 2
	          'name' => string 'フロストガエル' (length=21)
	      2 => 
	        array (size=3)
	          'id' => int 5
	          'kind_no' => int 2
	          'name' => string 'リュウキュウアカガエル' (length=33)
	  3 => 
	    array (size=2)
	      0 => 
	        array (size=3)
	          'id' => int 3
	          'kind_no' => int 3
	          'name' => string 'タイワンカブト' (length=21)
	      1 => 
	        array (size=3)
	          'id' => int 8
	          'kind_no' => int 3
	          'name' => string 'ヤンバルテナガコガネ' (length=30)
	  4 => 
	    array (size=2)
	      0 => 
	        array (size=3)
	          'id' => int 6
	          'kind_no' => int 4
	          'name' => string 'リュウキュウアオバト' (length=30)
	      1 => 
	        array (size=3)
	          'id' => int 7
	          'kind_no' => int 4
	          'name' => string 'ノグチゲラ' (length=15)
	


ループにおける関数処理を高速化する

ループ回数が多い状態で関数を呼び出すとき、注意しないとかなり低速になる。
高速にするには関数の引数を参照渡し(ポインタ)にし、returnしないようにしなければならない。

ループ回数が少ないのであれば気にすることはない。
ループ回数が多くなるほど違いは顕著にでてくる。

低速

	$list = array();
	for($i=0;$i<2000;$i++){
		$list = func1($list,$i);
	}
	
	function func1($list,$n){
		$list[] = $n;
		return $list;
	}
	
処理にかかった時間(ミリ秒)
0.11400699615479

高速

	$list = array();
	for($i=0;$i<2000;$i++){
		func2($list,$i);
	}
	
	function func2(&$list,$n){
		$list[] = $n;
	}
	
処理にかかった時間(ミリ秒)
0.007000207901001


最大実行時間が30秒の制限を解除する

初期の設定で30秒を超える処理を実行すると以下のエラーになる。
「Maximum execution time of 30 seconds exceeded」
php.iniで処理制限を解除する方法があるが、PHPソースコード中で制限を解除する方法も存在する。
解除方法は簡単で以下の命令文を実行するだけである。
	set_time_limit(0);


ファイルパスやディレクトリパスからパスセパレータ(パス区切り)を取得する


	$sep = getPathSeparator("C:\xampp\htdocs\hello-world");
	var_dump($sep);// → 「\」
	

	/**
	 * ファイルパスやディレクトリパスからパスセパレータを取得する
	 * @param string $path パス(ファイルパス、またはディレクトリパス)
	 * @return パスセパレータ。   「/」か「\」
	 */
	function getPathSeparator($path){
		if(empty($path)){
			return DIRECTORY_SEPARATOR;
		}
		if(strpos($path,"/")!==false){
			return "/";
		}
		if(strpos($path,"\\")!==false){
			return "\\";
		}
		return DIRECTORY_SEPARATOR;
		
	}
	


自作テンプレートエンジン | コンテンツを文字列として取得

ファイル構成

demo.php


	<?php
	$param['neko'] = 'cat';
	$param['inu'] = 'dog';
	echo render($param);
	
	function render($params){
		extract($params);
		ob_start();
	
		include "template.php";
		$html = ob_get_contents();
		ob_end_clean();
	
		return $html;
	}
	

template.php


	<h1>テンプレート1</h1>
	いろはにほへとちりぬるをわかよたれそつねならむ<br>
	<?php echo $neko;?><br>
	<?php echo $inu;?><br>
	<br>
	
	<?php
	echo "echo test";
	?>
	
	<script>
	console.log('script test');
	</script>