[PHP]ZipArchiveクラスを使ったファイルのZip圧縮と展開(解凍)

PHP5.2 以上で、zip Extension が利用可能な環境であればZIPファイル圧縮や展開は次の方法で簡単にできます。

圧縮

<?php
// 圧縮するファイルの配列
$files = array('file1.txt', 'file2.txt');

$zip = new ZipArchive();
$res = $zip->open('./test2.zip', ZipArchive::CREATE);

if($res === true){
	foreach($files as $file){
		$zip->addFile($file);
	}
	$zip->close();
} else {
	echo 'Error Code: ' . $res;
}

展開

<?php
// 圧縮ファイルのパス
$file = './test.zip';

// 展開先ディレクトリ
$to = './test/';

$zip = new ZipArchive();
$res = $zip->open($file);

if($res === true){
	$zip->extractTo($to);
	$zip->close();
} else {
	echo 'Error Code: ' . $res;
}

ZipArchive オブジェクトにファイルを追加するには addFile() を使います。
ファイルではなく文字列からファイルを作成して追加する場合は addFromString(ファイル名, 内容) で行います。

$zip->addFromString("sample.txt", "Hello, World!");

作成した ZIP ファイルをダウンロードさせる場合は次のようにします。

<?php
$file = './test.zip';
header('Content-Type: application/octet-stream'); 
header(sprintf('Content-Disposition: attachment; filename="%s"', basename($file)) ); 
header(sprintf('Content-Length: %d', filesize($file)) );
readfile($file);

今回はファイルのみを圧縮しましたが、フォルダーをディレクトリ構造を維持したまま圧縮する方法についてはこちらの記事にまとめてあります。

[PHP, JS]jQuery UI autocompleteを使った自動補完(候補予測)

キーワード検索を行う際、入力欄に文字の一部を入力すると当てはまる単語をリストアップしてくれるオートコンプリート(自動補完)機能は便利です。
jQuery UI には Autocomplete というウィジェットが用意されており、それを使えば簡単に実現できます。
あらかじめ単語が決まっていて、数が少ないのであればそのまま Javascript 内に単語一覧を書いてしまえばいいのですが、MySQL などのデータベースに登録されている情報を元に候補一覧を表示したい場合、Ajax を利用して PHP などから動的に取得する必要があります。

form.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Auto Complete</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/jquery-ui.min.js"></script>
<script>
$(function() {
	$("#sample").autocomplete({
		source: "./autocomplete.php"
	});
});
</script>
</head>
<body>

<form>
<input type="text" id="sample" />
</form>

</body>
</html>

autocomplete.php

<?php
// 単語のリスト
$list = array(
	'Apple',
	'Orange',
	'Grape',
	'Banana',
	'Pear',
	'Melon',
	'Peach',
	'Lemon'
);

$words = array();

// 現在入力中の文字を取得
$term = (isset($_GET['term']) && is_string($_GET['term'])) ? $_GET['term'] : '';

// 部分一致で検索
foreach($list as $word){
	if(mb_stripos( $word, $term) !== FALSE){
		$words[] = $word;
	}	
}

header("Content-Type: application/json; charset=utf-8");
echo json_encode($words);

必要となるのはフォームの記述されたファイルと Ajax 処理を行う PHP ファイルです。
データの受け渡しは JSON で行われ、テキストボックスに現在入力中の文字は通常 term に格納されて渡されます。
サンプルでは単純に固定の単語一覧を JSON に変換して表示していますが、データベースから取得する場合は WHERE ~ LIKE で絞り込んだ単語一覧を JSON に変換します。データベースへの負荷を減らすためにセッション等にキャッシュするのも良いと思います。
デフォルトでは一文字入力していれば候補を表示しますが、オプションで minLength を指定すれば最小文字数を変更できます。

$( "#sample" ).autocomplete({
    source: "./autocomplete.php",
    minLength: 3
});

参考: Autocomplete Widget
http://api.jqueryui.com/autocomplete/

[PHP]GDで作った画像をファイル化せずに直接<img>タグで表示する

html の <img> タグは src 属性にファイル名を指定するのが通常ですが、
Data URI スキームを利用することで画像データを html そのものに埋め込むことが出来ます。

書式は「data:MIMEタイプ;base64,データの内容」です。
画像そのものを html ソースに記述するためソース内には大量の文字の羅列がうめつくされることになります。
また、Safari, Chrome, FireFox などの主要ブラウザでは正しく表示されますが、IE に関しては IE8 以上でないと表示されない上、IE8 ではファイルサイズの上限が 32KB までとなっているため注意が必要です。

<?php
$img = imagecreatetruecolor(100, 100);

$color1 = imagecolorallocate($img, 30, 50, 170);
$color2 = imagecolorallocate($img, 255, 255, 255);
$color3 = imagecolorallocate($img, 230, 0, 0);

imagefill($img, 0, 0, $color2);

imagefilledellipse($img, 50, 50, 90, 90, $color1);
imagefilledellipse($img, 50, 50, 60, 60, $color2);
imagefilledellipse($img, 50, 50, 30, 30, $color3);

ob_start();
imagejpeg($img, null, 90);
$content = base64_encode(ob_get_contents());
ob_end_clean();
imagedestroy($img);
?><!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>

<img src="data:image/jpeg;base64,<?php echo $content;?>" alt="sample" />

</body>
</html>

roundel

HTML ソース


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRg(中略)AKKKKAP/Z" alt="sample" />

</body>
</html>

参考
http://ja.wikipedia.org/wiki/Data_URI_scheme