ユーザ用ツール

サイト用ツール


php:tips

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 ]]] )
  • message
    ログに記録されるエラーメッセージ。
  • message_type
    • 0
      message は、オペレーティング・システム のシステムログのメカニズムまたはファイルのいずれかを使って PHP のシステム・ロガーに送られます。どちらが使われるかは、 設定ディレクティブ error_log の内容により決定されます。これはデフォルトのオプションです。
    • 1
      message は、destination パラメータで指定されたアドレスに、電子メール により送られます。このメッセージタイプの場合にのみ、 4 番目のパラメータである extra_headers が使われます。
    • 2
      このオプションは存在しません。
    • 3
      message は destination で指定されたファイルに追加されます。 明示的に指定しない限り、message の 最後には改行文字は追加されません。
    • 4
      message は、直接 SAPI のログ出力ハンドラに送信されます。
  • destination
    メッセージの送信先。その設定は、上で説明している message_type パラメータの値によります。
  • extra_headers
    追加のヘッダ。message_type パラメータが 1 に設定される場合に利用されます。 このメッセージタイプは、 mail() と同様に 内部関数を利用します。
<?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
php/tips.txt · 最終更新: 2015/10/15 09:13 by clownclown

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki