php:ZipArchiveクラスでZIPファイルの圧縮と解凍

phpZIPファイルを圧縮解凍する場合のメモします。
下記にZipArchiveクラスを使用し、ZIPファイルの圧縮と解凍の方法を記載します。


ZipArchiveクラスが使用可能か確認

phpinfo()で下記がインストールされているか確認します。

php_zip


ZIPファイルを圧縮

「ZipArchive::CREATE」で新規にZIPファイルを作成します。
「addFile()」で指定したファイルを「./zip/hoge.zip」に圧縮します。
「addFile()」は複数指定することが可能です。

	$zip = new ZipArchive();
	// ZIPファイルをオープン
	$res = $zip->open('./zip/hoge.zip', ZipArchive::CREATE);

	// zipファイルのオープンに成功した場合
	if ($res === true) {

		// 圧縮するファイルを指定する
		$zip->addFile('hoge.txt');
		$zip->addFile('hoge.jpg');

		// ZIPファイルをクローズ
		$zip->close();
	}

ZIPファイルを解凍

解凍するZIPファイルをオープンし、「extractTo()」で指定した場所に展開します。
指定した場所を確認するとZIPファイルが解凍されていることが確認できます。

	// ZIPファイルのパス指定
	$zip_path = './zip/hoge.zip';

	$zip = new ZipArchive();

	// ZIPファイルをオープン
	$res = $zip->open($zip_path);

	// zipファイルのオープンに成功した場合
	if ($res === true) {

		// 圧縮ファイル内の全てのファイルを指定した解凍先に展開する
		$zip->extractTo('./zip/');

		// ZIPファイルをクローズ
		$zip->close();

	}

php:phpのdate関数で日付のフォーマット変更

phpで日付文字列の形式(フォーマット)を変換する場合のメモです。date関数を使用し変換します。
いつも忘れてしまうので。
データベースからdatetime型の値を取得した時に時間を表示せず年月日だけ表示したい場合などがあります。
下記の方法で指定の形式に日付・日時を変更できます。


【PHP】

$date = '2013-01-01 00:00:00';
echo date('Y/m/d', strtotime($date));

【出力結果】

2013/01/01

【PHP】

$date = '2013-01-01 00:00:00';
echo date('Y年n月j日', strtotime($date));

【出力結果】

2013年1月1日

strtotime()でUnixタイムスタンプを取得し、date()で日付のフォーマットを変更します。


date()関数のフォーマット

下記にdate()関数でよく使用するフォーマットをメモします。

※下記以外にもフォーマットはあります。

フォーマット 内容
Y 4桁の年。例:2014
y 2桁の年。例:14
L 閏年。1:閏年 0:閏年ではない

フォーマット 内容
m ゼロ詰めの月。01~12
n ゼロなしの月。1~12
F フルスペルの月。例:January
M 3文字形式の月。例:Jan
t 月の日数。28~31

フォーマット 内容
d ゼロ詰めの日。01~31
j ゼロなしの日。1~31
z 年間の通算日。0~365

フォーマット 内容
g 12時間単位の時(ゼロなし)。1~12
G 24時間単位の時(ゼロなし)。0~23
h 12時間単位の時。01~12
H 24時間単位の時。00~23

フォーマット 内容
i 分。00~59

フォーマット 内容
s 秒。00~59

午前・午後

フォーマット 内容
a 午前:am 午後:pm
A 午前:AM 午後:PM

曜日

フォーマット 内容
D 3文字形式の曜日。例:Mon
l フルスペルの曜日。例:Monday
N ISO-8601形式の曜日。1(月)~7(日)
w 曜日。0(日)~6(土)

php:phpで開発時に使用しているデバック(debug)方法

phpでシステムの開発を行っている時のデバック方法を記載します。
システムを開発している時に変数や配列の値を確認しながら作業すると思います。
変数や配列の値を確認する方法は「var_dump」や「print_r」などの関数を使用すると思いますが、皆さんはどのような方法でデバックしていますか?
「var_dump」や「print_r」をそのまま使用すると、一列に表示されるので複雑な配列や値が多く含む配列だと非常に見にくいです。
変数や配列を見やすくするため、私は下記の方法でデバックしています。


phpで変数や配列の値をデバックする方法

・「var_dump」を使用した場合

【PHP】

$arr = array('aaa', 'bbb', 'ccc');
var_dump($arr);

【出力結果】

array(3) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" [2]=> string(3) "ccc" }

・「print_r」使用した場合

【PHP】

$arr = array('aaa', 'bbb', 'ccc');
print_r($arr);

【出力結果】

Array ( [0] => aaa [1] => bbb [2] => ccc )

・使用しているデバック方法

debug_backtrace」を使用し、ファンクションが呼びだしたファイルのパスと行数を出力するようにしています。
pre」タグを使用することによって出力内容が見やすくなります。後はCSSでより見やすくなるように調整してます。
func_get_args」を使用し、関数に引数リストを取得してます。

【PHP】

独自でデバック関数

function dp() {
    $arr = debug_backtrace();
    echo '<div>' . $arr[0]['file'] . '  ' . $arr[0]['line'] . '</div>';

    $args = func_get_args();
    echo '<pre style="border:1px solid #CCC; padding: 5px; font-family: monospace; font-size: 12px;">';
    foreach ($args as $val) {
        print_r($val);
    }
    echo '</pre>';
}

上記の関数を呼び出します。

$arr = array('aaa', 'bbb', 'ccc');
dp($arr);

【出力結果】

/var/www/html/[パス]/test.php 28

Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
)

出力した内容に改行がそのまま表示されるので、見やすく開発効率も上がると思います。


debug_backtrace()とは

関数を呼び出したバックトレースを連想配列で返します。
下記のように出力されます。

Array
(
    [file] => [関数を呼び出したファイルの絶対パス]
    [line] => 28
    [function] => dp
(省略)
)

PHP:phpで数値をチェックする方法

phpでシステムを実装する際に数値かどうかをチェックすることはよくあると思います。
phpでは数値文字列かを判定するis_numeric関数がありますが、is_numeric関数は小数点や16進数なども数値として判定します。
完全に数値だけを判定したい場合に下記の正規表現を使うことで数値かどうか判定することができます。
正規表現を使うことによって判定する内容を編集することができるので応用が効くと思います。


is_numeric()関数

変数または指定した値が数値、数値文字列かどうか判定します。
数値の場合はtrueを返し、数値ではない場合はfalseを返します。


■ 使用方法(is_numeric)

・数値の場合

	$num = 000;
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・小数点の場合

	$num = 100.1;
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・数値文字列の場合

	$num = '100';
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・「+」、「-」付きの場合

	$num = '-100';
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・16進数の場合

	$num = '0xFF';
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・上記以外の場合(数値ではない場合)

	$num = 'aaa';
	if (is_numeric($num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値ではありません

■ 使用方法(正規表現)

正規表現を使用し、0~9の連続した文字のみtrueを返します。

preg_match("/^[0-9]+$/", '判定したい文字列')

・数値の場合

	$num = 000;
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・小数点の場合

	$num = 100.1;
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値ではありません

・数値文字列の場合

	$num = '100';
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値です

・「+」、「-」付きの場合

	$num = -100;
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値ではありません

・16進数の場合

	$num = '0xFF';
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値ではありません

・上記以外の場合(数値ではない場合)

	$num = 'aaa';
	if (preg_match("/^[0-9]+$/", $num)) {
		echo '数値です';
	}
	else {
		echo '数値ではありません';
	}
数値ではありません

php:phpでmysqlデータベースに接続する

phpでmysqlデータベースに接続する基本的な方法を記載します。
また、簡単なSQLの実行とデータ取得の方法を記載します。

■ 使用する関数
「mysql_connect」
接続先の情報を設定し、mysqlに接続する。
phpとmysqlが同じサーバにある場合は、’localhost’または’127.0.0.1’で設定することができる。

接続ID = mysql_connect([ホスト名], [ユーザー名], [パスワード])

「mysql_select_db」
接続するデータベースを選択する。

mysql_select_db([データベース名], 接続ID)

「mysql_query」
SQLを実行する。

SQL結果ID = mysql_query(SQL文, 接続ID)

「mysql_fetch_array」
検索結果レコードを取得する。

連想配列 = mysql_fetch_array(SQL結果ID)

「mysql_close」
mysqlデータベースを切断する。

mysql_close(接続ID)

■ 使用例

// mysqlに接続
$conn = mysql_connect('localhost', 'root', 'password');

// データベースを選択
$db = mysql_select_db('database_name', $conn);

// 接続に失敗した場合
if(!$conn || !$db){
	die('データベースの接続に失敗しました。');
}

// SQLを実行
$sql = " SELECT * FROM table_name WHERE 1 = 1 ";
$res = mysql_query($sql, $conn);

// レコードを取得
while ($row = mysql_fetch_array($res)) {
	$data[] = $row;
}

// DB切断
mysql_close($conn);