PHP:defineで定数の2重定義はエラーになる

phpdefineを使用し、定数定義した時に同じ名前の定数を2重で定義するとエラーになります。

例えば下記のように、処理の中で同じ名前の定数を複数定義します。

define('TEST', 'テスト');

define('TEST', 'test');

echo TEST;

出力結果は1度目に定義した値が出力されます。

テスト

一度定義した定数は再定義することができないのです。

2重定義をすると、下記のようなエラーが返ってきます。

Constant TEST already defined

フレームワークなどを使用している場合、複数のファイルを読み込むことが多いので注意が必要です。
また、requireincludeでファイルをインクルードしている場合も注意した方がいいと思います。

色々な箇所で定数を定義していると、2重定義をする可能性があるかもしれないので
定数を定義するファイルはなるべく一つにまとめた方がいいのかなと思います。

defined()関数を使用すれば、すでに定数が存在するかわかるので、
下記の方法で2重定義を防ぐことが可能です。


2重定義を防ぐ方法

defined()はすでに定数が存在するか調べることができる関数です。
指定した値が定数で定義させている場合は「true」、定義されていない場合は「false」を返します。

なので、定義されていない場合に定数をセットするようにすればOKです。

if (!defined('TEST')) {
	define('TEST', 'テスト');
}

PHP:PHPで明日、昨日、来月、先月などの日付取得

PHP日付取得して処理をすることはよくあります。

現在の日付を取得するのはdate()関数を使用すればいいのですが、
明日」「昨日」「来月」「先月」などの日付を取得する場合は、
strtotime()関数やmktime()関数を使用します。

忘れてしまうことが多いので、下記にメモします。


PHPで日付取得(明日、昨日、来月、先月)

※出力結果は2014年5月9日の場合

今日の場合

date('Y-m-d');

「出力結果」

2014-05-09

明日の場合

// strtotime()を使用した場合
date('Y-m-d', strtotime('+1 day'));

// mktime()を使用した場合
date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') + 1, date('Y')));

「出力結果」

2014-05-10

昨日の場合

// strtotime()を使用した場合
date('Y-m-d', strtotime('-1 day'));

// mktime()を使用した場合
date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));

「出力結果」

2014-05-08

来月の場合

// strtotime()を使用した場合
//date('Y-m', strtotime('+1 month'));
date('Y-m', strtotime(date('Y-m-1') . '+1 month'));

// mktime()を使用した場合
//date('Y-m', mktime(0, 0, 0, date('n') + 1, date('j'), date('Y')));
date('Y-m', mktime(0, 0, 0, date('n') + 1, 1, date('Y')));

「出力結果」

2014-06

先月の場合

// strtotime()を使用した場合
//date('Y-m', strtotime('-1 month'));
date('Y-m', strtotime(date('Y-m-1') . '-1 month'));

// mktime()を使用した場合
//date('Y-m', mktime(0, 0, 0, date('n') - 1, date('j'), date('Y')));
date('Y-m', mktime(0, 0, 0, date('n') - 1, 1, date('Y')));

「出力結果」

2014-04

※来月と先月の月の取得を訂正しました。


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

下記にstrtotime()関数でよく使用するフォーマットをメモします。
※「+1」の数値は取得したい値に変更できます。

フォーマット 内容
now 現在のタイムスタンプを取得
today 今日のタイムスタンプを取得
tomorrow 明日のタイムスタンプを取得
yesterday 昨日のタイムスタンプを取得
+1 day 1日後のタイムスタンプを取得
+1 week 1週間後のタイムスタンプを取得
+1 month 1ヵ月後のタイムスタンプを取得
+1 year 1年後のタイムスタンプを取得
+1 hour 1時間後のタイムスタンプを取得
+1 minute 1分後のタイムスタンプを取得
+1 second 1秒後のタイムスタンプを取得

上記以外にも色々な使い方があります。
フォーマットは複数組み合わせることも可能です。


PHP:モバイル判別するPHPクラスライブラリ「Mobile Detect」

WEBサイトモバイル判別をしてページを表示することは良くあると思います。
PHPで判別する場合、「Mobile Detect」を使用すれば簡単にスマホタブレットなどの判別をすることが可能です。

mobiledetect

mobiledetect

今までユーザエージェントを取得して判別をしていましたが、
とても簡単に使用できるのでおすすめです。

下記にPHPクラスライブラリMobile Detect」を使用して、
スマホタブレットなどのモバイル判別をした時の使用方法をメモします。


「Mobile Detect」の使用方法

下記URLにアクセスし、「Mobile Detect」をダウンロードします。

http://mobiledetect.net/

Mobile_Detect.php」を設置し読み込みます。

require_once './Mobile_Detect.php';
$detect = new Mobile_Detect;

下記のようにすればそれぞれ判別をすることができます。

モバイル判定

if ($detect->isMobile()) {
	// モバイル
}

タブレット判定

if ($detect->isTablet()) {
	// タブレット
}

PC判定

if ($detect->isMobile() || $detect->isTablet()) {
	// モバイル・タブレット
}
else {
	// PC
}

上記以外にもユーザエージェントごとの細かい判別をすることが可能です。

PHP:PostgreSQLで取得した全てのデータを配列で取得「pg_fetch_all」

phpPostgreSQLのデータを取得する時に、取得したデータ全て配列で取得したい場合があります。

pg_fetch_all()」を使用すれば「pg_query()」で実行した全てのデータを配列で取得することができます。

下記にpg_fetch_all()の説明と使用方法を記述します。

PostgreSQLはあまり使用することが少ないので、メモしておきます。


「pg_fetch_all()」の説明

取得した全てのデータを配列で取得します。

pg_fetch_all(クエリ結果)

「pg_fetch_all()」の使用方法

下記にpg_fetch_all()を使用した時の使用例を記述します。

<?php

// PostgreSQLに接続
$conn = pg_connect('host=localhost dbname=dbname user=username password=password');

// SQL文を実行
$result = pg_query('SELECT * FROM sample');

// 全てのデータを配列で取得
$data = pg_fetch_all($result);

// PostgreSQLを切断
$close = pg_close($conn);

?>

pg_fetch_all()で取得した値は下記のように配列で取得します。

Array
(
	[0] => Array
		(
			[id] => 1
			[name] => test1
			[status] => 1
		)

	[1] => Array
		(
			[id] => 2
			[name] => test2
			[status] => 2
		)

		・
		・
		・
)

データの取得方法は他にも色々ありますが、配列で全てのデータを取得する場合は
「pg_fetch_all()」を使用すると、配列で取得することができます。

PHP:配列内の同じ値を一つにまとめる「array_unique」

PHP配列同じ値が複数あった場合に一つまとめたい場合があります。

PHPの関数でarray_unique()を使用すれば、重複した値を削除することができます。

下記にPHParray_unique関数を使用して、配列内同じ値重複値)を取り除いた時の方法をメモします。


配列の重複値を削除「array_unique」

配列に重複した値がある場合、最初に出現した値が保持され、後の値は取り除かれます。

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

配列の値

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

二つ以上、重複した値があった場合でも、後に出現した値は取り除かれます。

$arr = array('aaa', 'aaa', 'aaa', 'bbb', 'bbb');
$res = array_unique($arr);

配列の値

Array
(
    [0] => aaa
    [3] => bbb
)

配列に重複した値がない場合は、何もしないでそのまま出力されます。

$arr = array('aaa', 'bbb', 'ccc', 'ddd', 'eee');
$res = array_unique($arr);

配列の値

Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
    [3] => ddd
    [4] => eee
)

array_unique()は重複するデータなどを集計する場合などに便利です。