tomimemo
その他メモ
最終更新:
匿名ユーザー
-
view
mb_send_mailでwindowsマシンからメール送信
php.iniのmail functionのセクションで設定すれば使える??
[mail function] ; For Win32 only. SMTP = 127.0.0.1 smtp_port = 25 ; For Win32 only. sendmail_from = hogehoge@hogehoge.com
画像生成テスト(for windows)
php.iniの extension=php_gd2.dll を有効にする。
javascriptをPHP5で動かす(For PHP5)
PHP5で書かれた JavaScriptのインタプリタ。
JavaScriptのソースをPHP5で動かすことができるようです。
初回は起動が遅いけど、2回目以降はキャッシュ(winだと WINNT/TEMP以下、unix系だと/tmp以下に作成)を読みに行くので割と早いかも。
JavaScriptのソースをPHP5で動かすことができるようです。
初回は起動が遅いけど、2回目以降はキャッシュ(winだと WINNT/TEMP以下、unix系だと/tmp以下に作成)を読みに行くので割と早いかも。
サンプルコード
<?php // モジュールの読み込み include "js.php"; // Javascriptのコード記述し$codeに代入 $code = <<<EOD function color() { var s=Math.floor(Math.random()*256*256*256).toString(16); return "#" + ("00000"+s).substr(-6); } String.prototype.colorize = function() { var o=''; for (var i=0;i<this.length;i++) { o += '<span style="color:'+color()+'">'+this.charAt(i)+'</span>'; } return o; }; String.prototype.big = function() { return "<span style='font-size:6em'>"+this+"</span>"; }; print("Hello, World!".colorize().big()); EOD; // Javascript実行 js::run($code); ?>
カレンダーを作る
pearのカレンダークラスを用いてカレンダーを作るテスト。
<?php require_once 'Calendar/Month/Weekdays.php'; print(dispCalendar("2005","12")); /** * 引数で指定されたカレンダーのテーブルを返す * @param string $year 年 2005等で指定 * @param string $month 月 2,12等で指定 * @return string $returnString 指定した日のカレンダー */ function dispCalendar($year, $month) { // 曜日の設定 $week_day = array("日","月","火","水","木","金","土"); // 現在の日付を取得 $Month = new Calendar_Month_Weekdays($year,$month,0); $Month->build(); $returnString = "<table border='1'>\n"; $returnString .= "<tr>"; foreach($week_day as $val) $returnString .= "<td>$val</td>\n"; $returnString .= "</tr>\n"; while ($Day = $Month->fetch()) { if ($Day->isFirst()) $returnString .= "<tr>\n"; if ($Day->isEmpty()) $returnString .= "<td> </td>\n"; else $returnString .= '<td>'.$Day->thisDay()."</td>\n"; if ($Day->isLast()) $returnString .= "</tr>\n"; } $returnString .= "</table>\n"; return $returnString; } ?>
windowsにphp-5.1.1をインストール(インストーラーを使わない版)
インストーラ使うと楽にインストールできるけど、過去のバージョンのphpを残しておきたい場合などはインストーラー使わないほうがいいのかもしれない(あとで元に戻せるので)。ということで、windowsにインストーラー使わずにphp5.1.1をインストールする手順をメモ。インストールする環境は以下。
- windows 2000
- Apache2.0.54インストール済み
- php5.0.4→これを5.1.1にする
まず、php5.1.1のwin32版zipファイル(php-5.1.1-Win32.zip
)を http://www.php.net/downloads.php よりダウンロードして解凍。
)を http://www.php.net/downloads.php よりダウンロードして解凍。
解凍するとphp-5.1.1-Win32というディレクトリが作成されるので、こいつをphp-5.1.1にリネームして D:\直下に配置。
次に環境変数を設定。
- マイコンピュータを右クリックしてプロパティ開く
- 詳細タブ開く
- 環境変数クリック
- システム環境変数内の「Path」を選択して「編集ボタン」をクリック
- 変数値の最後に「;D:\php-5.1.1」を入力してOK
Apacheのhttpd.confを以下のように修正。
LoadModule php5_module "D:/php-5.1.1/php5apache2.dll" AddType application/x-httpd-php .php PHPIniDir "D:/php-5.1.1"
D:\php-5.1.1にあるphp.ini-recommendedをphp.iniにリネーム。既存のphp.iniがある場合はD:\php-5.1.1にコピー。php.iniの以下の部分を修正。
extension_dir = "D:/php-5.1.1/ext"
パソコン再起動。
Apacheを起動。起動時にエラーが出るようであれば、php.iniのextension_dirとかinclude_pathとか見直す。
あとは定番のphpinfo()作成して表示させて「PHP Version 5.1.1」とか出ればOK。
if文を短く
$hoge = ""; if (empty($str)) { $hoge = "空"; } else { $hoge = "not 空"; }
上記と同じことを1行で書くと以下のようになる。
$hoge = (empty($str))? "空" : "not 空";
クラスの生成は文字列でもOK
クエリ文字列からクラスを生成したりできる。
例として、WEBサーバのドキュメントルート直下に以下のファイルを配置してテスト。(エラー処理とかは省略)
例として、WEBサーバのドキュメントルート直下に以下のファイルを配置してテスト。(エラー処理とかは省略)
index.php class/ | +---Top.php(トップページ用クラス) | +---Hoge.php(Hogeクラス) | +---Hogehoge.php(Hogehogeクラス)
まず、index.phpを作成。
[index.php] <?php // GET値のact名を取得 // act名がない場合は既定の文字列をセット $act = $_GET["act"]; if (strlen($act) <= 0) { $act = "top"; } // クラス名は先頭大文字にしておくというルールで。 $act = ucfirst($act); // act名のクラスのインスタンスを作成 $instance = new $act; // 生成されたインスタンスのrun()メソッドを実行 $instance->run(); // クラスのオートロード // classディレクトリ以下の$classname.phpファイルをrequire_onceする function __autoload($classname) { require_once("class/".$classname.".php"); } ?>
次に単純なクラスを3つほど作成
[Top.php] <?php /* * Topページ用 * GET値のact名が定義されていない場合に表示させるページ */ class Top { public function run() { print "top page"; } } ?>
[Hoge.php] <?php /* * Hogeクラス */ class Hoge { public function run() { print "hoge page"; } } ?>
[Hogehoge.php] <?php /* * Hogehogeクラス */ class Hogehoge { public function run() { print "hogehoge page"; } } ?>
以下URLにアクセス。
http://localhost/index.php では「top page」、
http://localhost/index.php?act=top では「top page」、
http://localhost/index.php?act=hoge では「hoge page」、
http://localhost/index.php?act=hogehoge では「hogehoge page」
と表示されるはず。
http://localhost/index.php では「top page」、
http://localhost/index.php?act=top では「top page」、
http://localhost/index.php?act=hoge では「hoge page」、
http://localhost/index.php?act=hogehoge では「hogehoge page」
と表示されるはず。
クエリ文字列からクラスのインスタンスを自動生成してrunメソッドを実行するということができる。
PHPでバッチ処理(linux)
2~3年前まではPHPでバッチ処理を行う場合は結構コツがいるようだったが、現在はすんなりできる。たとえば、画面に hoge と表示するバッチは以下のようにすればOK。
test.phpの作成
<?php print("hoge\n"); ?>
で、SSHかなんかで接続して以下コマンド。
# /usr/local/bin/php test.php
全てのHTTPリクエストヘッダを取得する
getallheaders() または apache_request_headers()
リクエストヘッダを表示するには以下。
test.php <?php print_r(getallheaders()); ?>
ミリ秒単位の時間を取得
microtime関数を使う。返却されるのは文字列"msec sec"のフォーマット。
print(microtime()); 結果:0.89670100 1130307859 print((float)microtime()); 結果:0.896716
コンストラクタとデストラクタ
php5からコンストラクタとデストラクタの記述が厳密になった。(過去バージョンとの互換性から、クラス名と同名のfunctionもコンストラクタに使える。)
MyClass.php(厳密な書き方) <?php class MyClass { //コンストラクタ public function __construct() { } //デストラクタ public function __destruct() { } } ?>
MyClass.php(過去のバージョン) <?php class MyClass { //コンストラクタ function MyClass() { } } ?>
全角ハイフンを半角ハイフンに変換関数
public function toHankakuHaifun($str) { return mb_ereg_replace("[-ーー―-‐]","-",$str); }
キャスト
<?php //整数へのキャスト $foo = (int)$bar; $foo = (integer)$bar; //論理値へのキャスト $foo = (bool)$bar; $foo = (boolean)$bar; //floatへのキャスト $foo = (float)$bar; $foo = (double)$bar; $foo = (real)$bar; //文字列へのキャスト $foo = (string)$bar; //配列へのキャスト $foo = (array)$bar; //オブジェクトへのキャスト $foo = (object)$bar; >
型チェック
$hoge = "aaa"; //$boolはfalse $bool = is_array($hoge);
半角カナでPOSTデータが文字化け
PHP内部のエンコーディング自動判定がミスっているらしい。短い入力文字だとたまにミスる。ダミーで日本語文字が書かれたhiddenタグを入れておくといいらしい。
<form>~</form>の中に <input type="hidden" name="hidden" value="日本語判定用文字列">
ケータイでアクセス時に「無効なデータを受信」
header関数でリダイレクトしている場合、リダイレクト先を相対URIで書いてると、たまに「無効なデータを受信しました」と出る。
リダイレクト先は、絶対URIで記述すること。
リダイレクト先は、絶対URIで記述すること。
×header("Location: top2.html"); 〇header("Location: http://www.hoge.com/top2.html");