目次

Tips

カンマ区切りを配列に格納したいのに、最後に不要なカンマがあるとき

<?php
$str = "111,222,333,";
$str = rtrim($str, ",");
$ary = explode("," $str);

error_log

bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
<?php
// データベースに接続できない場合、
// サーバーログを通してエラーを通知する。
if (!Ora_Logon($username, $password)) {
    error_log("オラクルのデータベースが使用できません!", 0);
}

// FOO に失敗したら、管理者に email で通知する
if (!($foo = allocate_new_foo())) {
    error_log("大変です。FOO に失敗しました!", 1,
               "operator@example.com");
}

// これ以外の error_log() のコール方法:
// ※ファイルに出力する場合は、そのファイルが存在していてアクセス権があること
error_log("大変だ!"."\n", 3, "/var/tmp/my-errors.log");

2次元配列を1次元配列に

$array = array_map('array_shift', $array);

e.g. mysqlから条件に一致するレコードのnameカラムを取得。1次元配列に変換する。

test.php

<?php
// mysqlから取得した結果サンプル
$array[0]["name"]="taro";
$array[1]["name"]="jiro";
$array[2]["name"]="hanako";
print_r($array);

// 1次元配列に
$array=array_map('array_shift',$array);
print_r($array);
# php -f test.php 
Array
(
    [0] => Array
        (
            [name] => taro
        )

    [1] => Array
        (
            [name] => jiro
        )

    [2] => Array
        (
            [name] => hanako
        )

)
Array
(
    [0] => taro
    [1] => jiro
    [2] => hanako
)

指定したスクリプトをメインスクリプトの実行前、実行後に動作させる

メインスクリプト実行前にタイマースタート、実行後にタイマーストップで時間計測、とか、
スパム対策のフィルタをメインスクリプト実行前に仕掛けてスパムをはじく、とか

e.g. php.iniの場合

; Automatically add files before PHP document.
; http://php.net/auto-prepend-file
auto_prepend_file = /home/user/www/start_script.php

; Automatically add files after PHP document.
; http://php.net/auto-append-file
auto_append_file = /home/user/www/end_script.php

e.g. .htaccessの場合

php_value auto_prepend_file "/home/user/www/start_script.php"
php_value auto_append_file "/home/user/www/end_script.php"

配列をCSVに出力

<?php
$fileName = 'test.csv';
$fileName =  mb_convert_encoding($fileName, 'SJIS-WIN');

header('Content-Type: application/x-csv');
header("Content-Disposition: attachment; filename=$fileName");

$fp = fopen('php://output', 'w');

$users=array();
$users[1]['name'] = 'suzuki';
$users[1]['mail'] = 'suzuki@mail.com';
$users[2]['name'] = 'saitou';
$users[2]['mail'] = 'saitou@mail.com';
$users[3]['name'] = 'tanaka';
$users[3]['mail'] = 'tanaka@mail.com';

foreach ($users as $row) {
    mb_convert_variables('SJIS-WIN', mb_internal_encoding(), $row);
    fputcsv($fp, $row);
}

fclose($fp);

PHPからMySQLへデータをインポート

<?php
$file = '"C:/temp/hoge.txt"';

//DB接続
$sv = "localhost";
$dbname = "userID_dbName";
$user = "userid";
$pass = "hogehoge";
$conn = mysql_connect($sv, $user, $pass) or die("connエラー");
mysql_select_db($dbname) or die("db_selectエラー");

mysql_query("SET NAMES utf8");

//CSVデータの取り込み
$sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE userID_dbName.tableName";
$sql .= " LINES ";
$sql .= " TERMINATED BY '\r\n' ";
$sql .= " IGNORE 1 LINES";
$result = mysql_query($sql, $conn);

if (!$result) {
$message = 'Invalid query: ' . mysql_error() . "\n";
$message .= 'Whole query: ' . $sql;
die($message);
}

ファイルを読み込んで末尾から表示する

<?php
$file = file('log.txt');
rsort($file);
foreach($file as $row){
    echo $row;
}

file : http://php.net/manual/ja/function.file.php
rsort : http://php.net/manual/ja/function.rsort.php

標準出力制御(バッファリング)

<?php
	// ログの取得有無		'1,2,3,4,5,6,7,8,9,10
	define("LOG_BIT",		'0,
							 0,0,0,0,0,0,0,0,0,1'
	);
	
	// 処理タイプ
	$byType = htmlspecialchars($_REQUEST['type']);
	
	// ログの取得有無
	$LogBit = explode(',',LOG_BIT);
	
	// 処理タイプがLOG_BITの範囲内で、且つ「1」であれば処理する
	if ( array_key_exists($byType,$LogBit) && $LogBit[$byType] == 1 ) {
		// 出力制御開始
		ob_start();

		// 標準出力(echoされるべき内容)取得
		$result = ob_get_contents();
		
		// 出力制御終了
		ob_end_clean();
		
		// ログ出力
		~処理内容、echoの内容などをDBなりファイルなりに出力する処理~
		
		// Output
		echo $result;
	}

cliで環境変数セットしたい

たとえば、メール受信時にPHPプログラムを実行しようとして、任意の環境変数を設定したい。
⇒コマンドラインで -d の引数で auto_prepend_file に環境変数を記述したファイルを指定する。

/var/www/env.php

<?php
putenv("APP_ENV=production");

/var/www/regist

"| /usr/bin/php -d auto_prepend_file=/var/www/env.php -f /var/www/regist.php >> /tmp/postfix 2>&1"

/etc/aliases

~省略~
regist:         :include:/var/www/regist

/etc/postfix/main.cf

# Allowed to run :include: method in /etc/aliases
allow_mail_to_commands = alias, forward, include