PHP

PHP は Web 開発向きのスクリプト言語。

wordpressdokuwiki も PHP で実装されている。

apache モジュールとして手軽に利用できる。

http://delicious.com/nishimotz/php

関連記事

PHPデベロッパがおかしがちな10のMySQL間違い

文献

パーフェクトPHP (PERFECT SERIES 3)
小川 雄大 柄沢 聡太郎 橋口 誠
技術評論社

対話的な実行

Windows の PHP 5.3.1 でインタラクティブシェル。

C:\php53>php -a
Interactive mode enabled
 
<?php echo "a"; ?>
^Z
a
C:\php53>

エラー処理

TODO: 下記を比較する

WARNING を例外処理で扱う:

set_error_handler(
    function($errno, $errstr, $errfile, $errline)
    {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }
);

PHP 5.3

http://php.net/manual/ja/migration53.php

PHP 5.3 から user.ini というディレクトリ単位でのINIファイルが使えるという話

MacOS X で使う

since 2011-06-10

Mac OS X 10.6.5 にて確認。

http://www.php.net/manual/ja/install.macosx.bundled.php に書かれている手順のうち、

sudo nano /private/etc/apache2/httpd.conf

にて

# LoadModule php5_module libexec/httpd/libphp5.so

のコメントアウトを解除。

システム環境設定 → 共有 → Web共有を(onになってるならまずoffして)on にする。

これで拡張子 *.php のファイルで phpinfo() が動いた。PHP Version 5.3.3 だった。

TODO: apachectl graceful がエラーになる(下記):

$ sudo apachectl graceful 
Password:
/usr/sbin/apachectl: line 82: ulimit: open files: cannot modify limit: Invalid argument

ereg 系から preg 系へ

PHP 5.3 で非推奨になった ereg 系を使っているスクリプトの warning

ereg_replace() を preg_replace() に直す。第一引数は / などの文字で囲む。

User Agentの振り分け

since 2010-12-05

http://www.ezinfo.jp/tips/divide 携帯端末の振り分け

iPhone, iPod touch を考慮するとこんな感じ?

<?php 
function get_browser_env() 
{
	if (strstr($_SERVER['HTTP_USER_AGENT'],"DoCoMo")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"Vodafone")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"SoftBank")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"MOT-")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"J-PHONE")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"KDDI")) {
	  	$env = 'ez';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"UP.Browser")) {
	  	$env = 'i';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"WILLCOM")) {
	  	$env = 'ez';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"Mozilla/5.0 (iPod;")) {
	  	$env = 't';
	} elseif (strstr($_SERVER['HTTP_USER_AGENT'],"Mozilla/5.0 (iPhone;")) {
	  	$env = 't';
	} else {
	  	$env = 'pc';
	}
	return $env;
}
 
if (get_browser_env() == 't') {
	$meta = '<meta name="viewport" content="width=device-width" />';
} else {
	$meta = '<link rel="stylesheet" href="css/pc.css" type="text/css" />';
}
?>
<head>
<?php echo $meta ?>
</head>

emacs での作業

ubuntu Linux に emacs 用のパッケージがある:

sudo apt-get install php-elisp

マルチバイトと文字化け

since 2011-01-16

mb_send_mail

EUC-JP でプログラムを書いて mb_send_mail関数でメールを送ると受信側で文字化けしている。

下記を書いておけば解決:

mb_language("Japanese");
mb_internal_encoding("EUC-JP");

参考 http://sb.xrea.com/showthread.php?t=8760

ISO-2022-JP-MS 対応

since 2013-12-16

機種依存文字対応の mb_send_mail っぽい関数の実装。

①②Ⅲⅳなどの文字が化けないで送信できる。

mb_internal_encoding('UTF-8');
mb_language('ja');
 
function my_send_mail(
	$mailto,
	$subject,
	$msg_body,
	$from_addr,
	$cc_addr)
{
	$subj = mb_encode_mimeheader( $subject, 'ISO-2022-JP-MS', 'UTF-8' );
	$body = mb_convert_encoding( $msg_body, 'ISO-2022-JP-MS', 'UTF-8' );
	$add_headers = "Content-Type: text/plain; charset=ISO-2022-JP" . "\r\n"
		. 'From: '
		. mb_encode_mimeheader( $from_addr, 'ISO-2022-JP-MS', 'UTF-8' )
		. "\r\n"
		. 'cc: '
		. mb_encode_mimeheader( $cc_addr, 'ISO-2022-JP-MS', 'UTF-8' )
		. "\r\n";
	return mail( $mailto, $subj, $body, $add_headers );
}

HTML出力の文字化け対策

WebKit 系は EUC-JP を自動認識しないらしい。

プログラムの最初に:

mb_http_output('EUC-JP');

そして HTML meta も書いておく:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>

mb_detect_encoding が怪しい

mb_detect_encoding() を使わない方がよいらしい:

// $enc = mb_detect_encoding($text);
// $text = mb_convert_encoding($text, "EUC-JP", $enc);
 
$text = mb_convert_encoding($text, "EUC-JP", 'auto');

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1013242835

全角と半角の変換

mb_convert_kana は文字エンコードを指定しないとうまくいかない(場合がある):

$ php -a
php > echo '[' . mb_convert_kana('10()abc* ', 'as', 'utf-8') . ']';
[10()abc* ]
php > 

タイムゾーン

サーバの設定にかかわらず JST で時刻をとりたい:

date_default_timezone_set('Asia/Tokyo');
$s = date("Ymd_His"); // 20050801_133035

日付と時刻はこういう方法も。

echo strftime("%Y-%m-%d", time()); # 2011-02-24

型キャスト

(int)$string_value で数字に。

ヒアドキュメント

変数名の埋め込みで、後続する文字と区切る方法。こんな感じでやるらしい。

$year = 2012; $month = 7; $dayofmonth = 2;
$body = <<<EOF
{$year}年{$month}月{$dayofmonth}日 
EOF
;

php.txt · 最終更新: 2013/12/16 22:57 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0