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以下に作成)を読みに行くので割と早いかも。

サンプルコード
<?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>&nbsp;</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 よりダウンロードして解凍。

解凍すると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サーバのドキュメントルート直下に以下のファイルを配置してテスト。(エラー処理とかは省略)
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」
と表示されるはず。

クエリ文字列からクラスのインスタンスを自動生成して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で記述すること。
×header("Location: top2.html");
〇header("Location: http://www.hoge.com/top2.html");
最近更新されたページ