2000年2月29日星期二

PHP入門




■ 目次

■ はじめに

PHP について説明します。本書は、C、C++、Perl、Java、JavaScript のいずれかを習得している方を対象に、余分な説明を省いています。

■ インストール

http://www.php.net/ → [downloads]→[Windows Binaries]→[PHP 5.2.6 zip package] をダウンロードし、解凍し、好きなフォルダに置いてください。

■ 基本構文

PHPは通常、Webサーバー経由で呼び出しますが、コマンドラインからも実行可能です。

# php test.php

お決まりの Hello World は下記のようになります。

<?php
  print "Hello World\n";
?>

<?php ~ ?> の個所はいろいろな書き方がありますが、<?php ~ ?> が一般的です。設定によっては他の形式は使用できないことがあります。<?= ~ ?> や <%= ~ %> は、<?php echo ~ ?> と同じ意味を持ちます。

<?php ~ ?>
<? ~ ?>
<?= ~ ?>
<% ~ %>
<%= ~ v>
<script language="php"> ~ </script>

■ コメント

コメントは下記の3種類を使用することができます。// と # は 1行コメント、/* ... */ は複数行のコメントを記述できます。

// コメント

# コメント

/* コメント */

■ 制御構文

言語構造として下記の制御構文をサポートします。

if ($count == 5) {
  :
}
if ($count == 0) {
  :
} elseif ($count == 1) { ←Cの場合は else if、Perlの場合は elsif
  :
} else {
  :
}
switch ($count) {
  case 1:
     :
    break;
  case $oldcount:   ←条件に変数を記述できるところがミソ
     :
    break;
  default:
     :
    break;
}
while ($count < 10) {
   :
  break;          ←Perlのlast文に相当
   :
  continue;       ←Perlのnext文に相当
   :
}
for ($i = 0; $i < 10; $i++) {
  :
}
do {
  :
} while ($count < 10);
foreach ($arglist as $arg) {   ←配列$argの各要素について
  :
}
foreach ($vallist as $key => $val) {  ←連想配列$vallistの各要素について
  :
}

■ 型

PHP は下記の型をサポートしています。

説明
論理型(bool、boolean) TRUE または FALSE を持ちます。
整数(int、integer) -23、0、234 などの整数値を表します。0755 など 0 で始まる数字は8進数と見なされます。0x7fff など 0x で始まる数字は16進数と見なされます。
浮動小数点数(float、double、real) 1.234 などの少数を含む数字を表します。1.2e3 は 1.2×10の3乗、7E-10 は 7×10の-10乗を意味します。
文字列(string) 文字列」を参照してください。
配列(array) 配列」を参照してください。
オブジェクト(object) クラス」を参照してください。
リソース(resource) オープンしたファイル、データベース接続など特別な値を持つリソース値です。
ヌル(NULL) 値無しを意味します。NULL。

■ 文字列

文字列は、ダブルクォート(")またはシングルクォート(')で囲みます。

$msg1 = "This is Japan.";
$msg2 = 'That is America.';

"~" の中では改行(\n)などのエスケープシーケンスや、変数を使用できますが、'~' の中では使用できません。

print "My name is $name\n";  ←展開される
print 'My name is $name\n';  ←展開されない

変数名と後続の文字の境が無い場合は、変数を {...} で囲みます。

$size = 32;
$values = array('size' => 32);
class item { var $size; }
$item = new item();
$item->size = 32;

print "File size is ${size}KB\n";
print "File size is {$size}KB\n";
print "File size is ${values['size']}KB\n";
print "File size is {$values['size']}KB\n";
print "File size is ${item->size}KB\n";      ←これはエラーになる
print "File size is {$item->size}KB\n";

"~" の文字列の中では下記のエスケープシーケンスを用いることができます。

改行(\n) キャリッジリターン(\r) タブ(\t) 垂直タブ(\v) フォームフィード(\f)
バックスラッシュ(\\) ドル記号(\$) ダブルクォート(\")
8進数文字コード(\77) 16進数文字コード(\x1e)

"~" の中では ' を、'~' の中では " を使用することができます。

print "My name is '$name'\n";
print 'My name is "Tanaka"';

文字列を連結するには . を用います。

print "File size is " . $size . "KB\n";

文字列を比較するには、== ではなく、=== や strcmp() を使用します。== でも一見比較できているように見えますが、"3" と "3.0" が同じ文字列と見なされてしまいます。=== は型も含めた厳密な比較を行いますが、"3" と 3 が同じと見なされないなどの問題があります。

× if ($msg1 == $msg2) { ... }
△ if ($msg1 === $msg2) { ... }
○ if (strcmp($msg1, $msg2) == 0) { ... }

下記のように複数行からなる文字列を定義することができます。これをヒアドキュメントと呼びます。EOT や EOT; の前後には空白を入れないようにしましょう。

$msg = <<<EOT
This is a 
pen.
EOT;

■ 配列

配列は次のように定義、参照します。

$item = array("Yamada", "Tanaka", "Suzuki");
print $item[0] . "\n";
print $item[1] . "\n";
print $item[2] . "\n";

配列キーとして文字列も利用できます。

$item = array(
  "name" => "Yamada",
  "age" => 32,
  "country" => "Japan",
);
print $item['name'] . "\n";
print $item['age'] . "\n";
print $item['country'] . "\n";

二重配列を定義することも可能です。

$item = array(
  array("name" => "Yamada", "age" => 32),
  array("name" => "Tanaka", "age" => 26),
  array("name" => "Suzuki", "age" => 43),
);

print $item[1]['name'] . "\n";
print $item[1]['age'] . "\n";

■ クラス

未稿。

■ 関数

関数は下記のように定義します。

function add($x, $y) {
  return $x + $y;
}

引数を省略した場合のデフォルト値を指定することができます。

function conv($msg, $code = "UTF-8") {
  :
}

引数の参照渡しにより、呼び出し元の変数を書き換えることが可能です。

function add($x, $y, &$ans) {
  $ans = $x + $y;
}

■ 入出力

◆ 文字列を表示する(print、echo)

文字列を表示します。print は関数として定義され、戻り値があり、文字列をひとつしか指定できませんが、echo は言語構造(言語仕様のひとつ)として定義され、戻り値は無く、カンマを用いて文字列を複数指定できます。速度は echo の方が若干だけ早いようです。

print "ABC\n";
echo "ABC\n";
◆ フォーマット付き文字列を表示する(printf)

printf() は文字列をフォーマットに従って表示します。

$tm = localtime(time(), 1);
printf("%04d/%02d/%02d %02d:%02d:%02d",
  $tm["tm_year"] + 1900, $tm["tm_mon"] + 1, $tm["tm_mday"],
  $tm["tm_hour"], $tm["tm_min"], $tm["tm_sec"]);
◆ ファイルを読み込む(fopen、fread、fwrite、fclose、filesize)
$f = fopen("data.txt", "r");
$buf = fread($f, filesize($file));
fclose($f);
◆ ファイルを読み込む(file)
foreach (lines("data.txt") as $line) {
  print $line;
}

■ HTTP

◆ HTTPサーバーから読み込む(fopen)

fopen()をHTTPサーバーに対して行うことも可能です。

$fp = fopen("http://www.yahoo.co.jp/", "r");
while ($line = fgets($fp)) {
  print $line;
}
fclose($fp);
◆ HTTPサーバーから読み込む(CURL)

CURLを用いてHTTPリクエストを発行する例です。

$ch = curl_init("http://www.yahoo.co.jp/");
curl_exec($ch);
curl_close($ch);
◆ HTTPサーバーから読み込む(CURL)

CURLを用いてプロキシ経由でPOSTリクエストを発行する例です。

$ch = curl_init("http://www.yahoo.co.jp/");
curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com");
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "param1=value1");
curl_exec($ch);
curl_close($ch);
◆ HTTPサーバーから読み込む(PEAR)

PEARを用いてHTTPリクエストを発行する例です。

require_once 'HTTP/Request.php';
$req =& new HTTP_Request("http://www.yahoo.co.jp/");
$req->sendRequest();
print $req->getResponseBody();

■ データベース

◆ MySQLサーバからデータを読み出して表示する(mysql_xxx)
if (!$link = mysql_connect("localhost")) {
  die("mysql_connect(ERROR)");
}
if (!mysql_select_db("test")) {
  die("mysql_select_db(ERROR)");
}
if (!$result = mysql_query("SELECT * FROM meibo")) {
  die("mysql_query(ERROR)");
}
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
  foreach ($line as $col) {
    print "$col,";
  }
  print "\n";
}
mysql_close($link);
◆ PEAR::DBを用いてデータベースを読み出す(PEAR::DB)
require "DB.php";

$db = DB::connect("mysql://$user:$passwd@$host/$dbname");
if (PEAR::isError($db)) {
  die($db->getMessage() . "\n");
}
$stmt = $db->prepare("SELECT uid, name FROM users WHERE uid = ?;");
if (PEAR::isError($stmt)) {
  die($stmt->getMessage() . "\n");
}
$rs = $db->execute($stmt, array($uid));
if (PEAR::isError($rs)) {
  die($stmt->getMessage() . "\n");
}
while ($row = $rs->fetchRow()) {
  print "$row[0] : $row[1]\n";
}
$db->disconnect();
◆ PDOを用いてデータベースを読み出す(PDO)
try {
  $db = new PDO("mysql:host=$host;dbname=$dbname", $user, $passwd);
} catch (PDOException $e) {
  $err = $e->getMessage();
  die("ERROR: $err");
}
$stmt = $db->prepare("SELECT uid, name FROM users WHERE uid = :uid;");
if ($stmt == FALSE) {
  die("ERROR: prepare()\n");
}
if (!$stmt->bindParam(":uid", $uid)) {  ←変数で渡す必要がある
  die("ERROR: bindParam()\n");
}
if (!$stmt->execute()) {
  die("ERROR: execute()\n");
}
while ($row = $stmt->fetch()) {
  print "$row[0] : $row[1]\n";
}

2000年2月22日星期二

クラスは、変数、メソッドを持ったオブジェクトを定義した物です。
また、コンストラクタを持ちます。
コンストラクタは、オブジェクトが生成された時に、実行されます。
初期化したい処理を書いたりします。


<?php
//クラス
class Common {
        //変数
        var $str;
        
        //コンストラクタ
        function Common(){
            $this->str = "Hellow";
        }
        
        //printメソッド
        function printStr(){
            print $this->str;
        }
    }

//Commonオブジェクト作成
$commonObj = new Common();

//文字出力
$commonObj->printStr();

//Coomonオブジェクトの変数に値を格納
$commonObj->str = ",World";

//文字出力
$commonObj->printStr();
?>

读取文件

まず、fopenにて、ファイルを開きます。その後で、fgetsにて、ファイルの内容を読み込みます。最後に、fcloseにて、ファイルを閉じます。


<?php
//ファイルを読み込み専用で開く
$fileName = "file.cgi";
$file = fopen($fileName,"r");

//fgetsでファイルを読み込み
//1行読み込み
//whileで順次読み込み表示
//feofで、ファイルの終端を判断
while(!feof($file)){
    $str = fgets($file);
    print "$str<BR>";
}

//閉じる
fclose($file);
?>

fopen→fgets→fcloseの他に、file_get_contentsを利用すれば、ファイルの内容を全て文字列にして、取得が可能です。

<?php
//file_get_contentsでファイルを読み込む
//ファイルの内容を全て文字列で読み込みます。
$fileName = "file.cgi";
$str = file_get_contents($fileName);

//print
print "$str";
?>

配列

■配列変数代入
  ・array を使用すると簡単に配列変数に代入できる。
  $a = array('abc', 'def', 'ghi');

  ・個別に代入すると、次のようになる。
  $a[0] = 'abc';
  $a[1] = 'def';
  $a[2] = 'ghi';

  ・添字を省略すると、自動的に最後の配列の次に代入されていく。
  $a[] = 'jkl';
  $a[] = 'mno';

■配列変数分解
  ・list を使用すると簡単に配列変数を分解できる。
  $d = array('abc', 'def', 'ghi');

  list($a, $b, $c) = $d;

  ・個別に代入すると、次のようになる。
  $a = $d[0];
  $b = $d[1];
  $c = $d[2];

■文字列分解
  ・文字列はセット変数を添字でアクセスすると分解参照できる。
    $a[0] = '0'、$a[1] = '1' のように参照可能である。
    但し、逆は、単に Array と返ってくるので結合参照としては使えない。

  $a = '0123';

  print "<P>$a[0]</P>\n";
  print "<P>$a[1]</P>\n";
  print "<P>$a[2]</P>\n";
  print "<P>$a[3]</P>\n";

■配列数取得
  ・count で配列数を取得できる。
    添字上限としては、count($a) - 1 となる。

  $a = array('abc', 'def', 'ghi');
  $ct = count($a);

■配列列挙参照
  ・次の配列があるとする。

  $a = array('abc', 'def', 'ghi');

  ・PHP3 では、次のように reset、while、each を使用する。
    $tmp[0] は添字、$tmp[1] が実データとなる。

  reset($a);
  while ($tmp = each($a)) {
    print "<P>$tmp[0] - $tmp[1]</P>\n";
  }

  ・PHP4 では、次のように foreach を使用する。
    $tmp が実データとなる。

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■連想配列列挙参照
  ・次の連想配列があるとする。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');

  ・PHP3 では、次のように reset、while、each を使用する。
    $tmp[0] はキー、$tmp[1] が実データとなる。

  reset($a);
  while ($tmp = each($a)) {
    print "<P>$tmp[0] - $tmp[1]</P>\n";
  }

  ・PHP4 では、次のように foreach を使用する。
    $key はキー、$tmp が実データとなる。

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

■配列ソート(昇順)
  ・配列を sort で昇順ソートできる。

  $a = array('abc', 'def', 'ghi');
  sort($a);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列ソート(降順)
  ・配列を rsort で降順ソートできる。

  $a = array('abc', 'def', 'ghi');
  rsort($a);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■連想配列ソート(昇順)
  ・連想配列を asort で昇順ソートできる。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');
  asort($a);

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

■連想配列ソート(降順)
  ・連想配列を arsort で降順ソートできる。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');
  arsort($a);

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

■連想配列キーソート(昇順)
  ・連想配列を ksort でキー昇順ソートできる。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');
  ksort($a);

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

■連想配列キーソート(降順)
  ・連想配列を krsort でキー降順ソートできる。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');
  krsort($a);

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

■配列末尾追加
  ・配列の末尾から array_push でデータを追加できる。
    データは複数指定することもできる。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');

  array_push($a, 'data1', 'data2');

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列末尾削除
  ・配列の末尾から array_pop でデータを削除できる。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');

  array_pop($a);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列先頭追加
  ・配列の先頭から array_unshift でデータを追加できる。
    データは複数指定することもできる。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');

  array_unshift($a, 'data1', 'data2');

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列先頭削除
  ・配列の先頭から array_shift でデータを削除できる。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');

  array_shift($a);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列連結
  ・別の配列を結合するには array_merge を使用する。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');
  $b = array('123', '456', '789');

  $a = array_merge($a, $b);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列一部切り出し
  ・配列の一部分を切り出すには、
      array_slice($a, 1, 1);
                      |  |_ 要素数
                      |_ 切り出し開始添字
    を使用する。
    PHP4 の機能である。

  $a = array('abc', 'def', 'ghi');

  $a = array_slice($a, 1, 1);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■配列要素反転
  ・配列の要素を逆順にするには array_reverse を使用する。

  $a = array('abc', 'def', 'ghi');

  $a = array_reverse($a);

  foreach ($a as $tmp) {
    print "<P>$tmp</P>\n";
  }

■連想配列要素反転
  ・連想配列の要素を逆順にするには array_reverse($a, True) を使用する。

  $a = array('key1' => 'abc', 'key2' => 'def', 'key3' => 'ghi');

  $a = array_reverse($a, True);

  foreach ($a as $key => $tmp) {
    print "<P>$key - $tmp</P>\n";
  }

文件夹下の全文件読込

フォルダ配下の全てのファイルを読み込んで表示します。
フォルダ配下のファイル名を取得。
それぞれのファイルを開いて、加工して表示します。

カテゴリに属する記事を表示みたいなものです。
カテゴリ毎にフォルダを作成し、ファイルを振り分けて置いとけば、
カテゴリに属する記事が表示できます。


<?php
//ディレクトリ
$dirName = "./cat/";

//ディレクトの存在チェック
if (is_dir($dirName)) {

    //ディレクトリハンドル取得
    if ($dir = opendir($dirName)) {
    //ファイル情報読み込み、表示
    while (($file = readdir($dir)) !== false) {
        if(($file != ".") && ($file != "..")) {
        
            //ファイルオープン
            $fileH = fopen($dirName . $file,"r");
        
            //表示
            print "<table border='1' style='width:500px'>";
            print "<tr><td bgcolor='#CCCCCC'>" .$file . "</td></tr>";
            print "<tr><td>";
            while($con = fgets($fileH)){
                print "$con<BR>";
            }
            print "</td></tr></table>";
        
            //ファイルクローズ
            fclose($fileH);
        }
    }
    closedir($dir);
    }
}
?>

常用函数

判断一个编程语言的功能强弱,可以从他的库函数入手。一个较好的编程语言,必然有较强的库函数。
I/O函数
Flush
函数描述:flush();
说明:函数Flush刷新PHP的输出缓存,它尽量将缓和存中的内容输出到用户的浏览器。
返回值:无
Print
函数描述:print(string arg,string[arg],…);
说明:函数print输入所有的参数。
返回值:若输出成功,返回true(1);否则返回false(0)。
Printf
函数描述:printf(string format,mixed[string]);
说明:函数printf根据所给格式format,输出string。格式以一个%开头,以一个字母结尾,该字母决定输出的数据类型。PHP的类型说明符如表所示。
PHP的类型说明符

[attach]33937[/attach]


返回值:无

正规表达式函数
Ereg
函数描述:int ereg (string pattern ,string string ,array[regs]);
说明:函数ereg在参数string中寻找pattern中给出的正规表达式相匹配的项。如果提供了可选reg数组,则每一项匹配将顺序存储在数组regs[1]开始的各项中。在regs[0]中存储整个正规表达式的匹配项。在函数ereg中,匹配的辨别是区分大小写的。请参看以下程序
返回值:若至少有一处匹配则函数ereg返回true(1);否则返回false(0)。
例子:

该程序输出结果:14.5.2000

Ereg_replace
函数描述:string Ereg_replace(string pattern,string replacement,string string);
说明:函数Ereg_replace可用于替换文本,当参数pattern与参数string中的字串匹配时,他就被参数replacement的内容所替换。若参数pattern中包含有圆括号的子表达式,则在参数replacement中可以用包含特定的代码来说明哪个子表达式被替换,最多可以有九个子表达式。其具体形式是用两个反斜杠后跟一个从0~9的单数字,0表示与整个表达式相匹配,1~9表示相应的与前1~9个子表达式相匹配。注意,参数pattern中的圆括号是可以嵌套的,其表达式序号等于该表达式前的圆括号的数目。
返回值:函数ereg_eplace返回替换后的字符串pattern。

Eregi
函数描述:int eregi(string pattern , string string , array[regs]);
说明:函数eregi与ereg相类似,不同之处是函数eregi进行匹配时不区分大小写。
返回值:若至少有一处相匹配,函数eregi返回true(1),否则返回false(0)。

Eregi_replace
函数描述:string Eregi_replace(string pattern,string replacement,string string);
说明:函数eregi_replace与ereg_replace相类似,不同之处就是函数eregi_replace进行匹配时不区分大小写。
返回值:函数eregi_eplace返回替换后的字符串pattern。

Split
函数描述:array split(string pattern,string string , int[limit]);
说明:函数split以参数pattern作为分界符从参数string 中取行一系列子串,并将它们存入一字符串数组。参数limit限定生成数组的大小,数组中的最后一个元素为参数string中还未分组的所有内容。
返回值:函数split返回生成的字符串数组,如果有一个错误,返回false(0)。

Sql_regcase
函数描述:string sql_regcase(string string);
说明:函数sql_regcase生成一个字符串数组,数组中的各个元素依次为参数string中各个字符的大小写;若在参数string中有一个空格,其对应数组元素的内容为一个空格。
返回值:函数sql_regcase返回所生成字符串数组。
例:

此程序结果为:[Hh][Ee][Ll][Ll][Oo][ ][Pp][Hh][Pp]

数学函数
Abs
函数描述:mixed abs(mixed number);
返回值:函数abs返回参数number的绝对值。

Acos
函数描述:double acos(double number);
返回值:函数acos返回参数number的反余弦值。如果参数number大于1或小于1,则其反余弦值无意义 。

Asin
函数描述;double asin(double number);
返回值:函数asin返回参数number的反正弦值。如果参数number大于1或小于1,则其反正弦值无意义 。

Atan
函数描述:double atan(double number);
函数atan返回参数number的反正切值。

Atan2
函数描述:Double atan2(double x , double y);
返回值:函数atan2返回由直角坐标系指定的座标点在极座标系中的角度的弧度值。

BinDec
函数描述:int bindec(string binary_number);
返回值:函数bindec返回一个用二进制数写成的字符串binary_number的整数值。PHP使用32位带符号的整数,其二进制数的第一位是符号位。

Ceil
函数描述:int ceil(double number);
返回值:函数ceil返回大于参数number 的最小整数;若number为整数。,则返回其本身。

Cos
函数描述:double cos(double angle);
返回值:函数cos返回以弧度的大小为参数angle的角的余弦值。

DecBin
与bindec相反,将十进制转为二进制。

DecHex(HexDec)
返回十六进制值

DecOct(OctDec)
返回八进制值

Deg2rad(Rad2reg)
函数描述:double deg2red(double angle);
返回值:函数deg2red返回角度数angle相对应的弧度值。

Exp
函数描述:double exp(double power);
返回值:函数exp返回自然对数的power次幂。

Floor
函数描述:int floor(double number);
返回值:返回参数number的整数部分。

Getrandmax
函数描述:int getrandmax();
返回值;返回由函数rand所能返回的最大值

Log(Log10)
函数描述:Double log(double number);
返回值:返回参数number的自然对数(返回以10为底的对数)

Max (Min)
函数描述:mixed max(mixed arg1, mixed arg2, …,mixed argn);
返回值:返回此数组中的最大值(最小值),若参数中有浮点数,则所有参数转化成浮点数,返回值也为浮点数;否则所有参数转化成整数,返回值为整数。

pi
函数描述:double pi();
返回值:函数pi返回圆周率的近似值。

Pow
函数描述:double pow(double base,double power);
返回值:函数pow返回参数base的power次幂。

Rand
函数描述:int rand(int lowest,int longest);
说明:函数rand使用前要用srand激活。
返回值:函数rand返回可选参数lowest和longest之间的一个数(包含两个参数);若无参数,则返回值的范围从零到getrandmax返回的整数。

Round
函数描述:double round(double number);
返回值:函数round返回最接近参数number的整数。

Sin
函数描述:double sin(double angle);
返回值:函数sin返回一个用弧度表示的角的正弦值。

Sqrt
函数描述:double sqrt(double number);
说明:在函数sqrt中,参数number不能小于0。
返回值:函数sqrt返回参数number的平方根。

Srand
函数描述:srand(int seed);
说明:函数srand激活随机数发生器。参数seed是随机产生的种子,即所得的随机数是由参数经过一系列计算所的。
返回值:无。

Tan
�接标识符默认,则默认为是上一次打开的连接。Query为标准SQL语句。
返回值:成功后返回一个结果标识符,失败时返回false。

Mysql_fetch_row
函数描述:int mysql_fetch_row(int result);
说明:mysql_fetch_row用来查询结果的一行保存至数组,该数组下标从0开始,每一个数组元素对应一个域。通过循环,可以将查询结果全部获得。
返回值:返回下行的所有域值,并将其保存至一个数组中,没有行时返回false。

Mysql_fetch_array
函数描述:array int result);
说明:mysql_fetch_array和mysql_fetch_row功能基本相同,只不过它除了可以用从0开始的偏移量作索引,还可以用域名作索引。
返回值返回下一行的所有域值,并将其保存至一个数组中,没有行时返回false。

Mysql_num_rows
函数描述:int (string result);
说明:mysql_num_rows用于计算查询结果中所得行的数目。
返回值:返回查询结果中所得行的数目。

Mysql_result
函数描述:int mysql_result(int result , int row , mixed field);
说明:mysql_resultet 用于获取结果集中指定域的数据。Field可以是一个偏移量,也可以是列名,如果列有别名,还可以用这外别名。
返回值:返回结果集中指定行、指定偏听偏信移量的数据。

Mysql_close
函数描述:int mysql_close(int [link_identifier]);
说明:mysql_close用于关闭当前与数据库服务器的连接。
返回值:成功后返回true,失败时返回false。

Session函数
Session_start
函数描述:boolean session_start(void);
功能说明:session_start函数的功能是初始化一个新的session,如果已经存在一个为该用户服务的session,则连接原有的session。
参数说明:无。
返回值:逻辑类型变量,且值永远为真。

Session_destroy
函数描述:boolean session_destroy(void);
功能说明session_destroy结束原有的session 。
参数说明:无。
返回值:逻辑类型变量,且值永远为真。

Session¬_register
函数描述:boolean session_register(string name);
功能说明:在session中增加一个变量。
参数说明:“string name”变量名。
返回值:逻辑类型变量。操作成功返回真值。

Session_unregister
函数说明:boolean session_unregister(string name);
功能说明:在session中删除一个变量。
参数说明:“string name”变量名。
返回值:逻辑类型变量。操作成功返回真值。

Session_is_registered
函数描述:boolean session_is_registered(string name);
功能说明:检查session中是否存在所指定的变量。
参数说明:“string name”变量名。
返回值:逻辑类型变量。

Session_encode
函数描述:boolean session_encode(void);
功能说明:session_encode函数对当前的session资料编码,PHP4采用哈希编码。
参数说明:无。
返回值:逻辑类型变量。编码成功则返回真值。

Session_decode
函数描述:boolean session_decode(string data);
功能说明:session_decode可以编过码的资料解码。
参数说明:“string data”需要解码的资料。
返回值:逻辑类型变量。

ZIPファイル作成

ZIPファイルの作成を行います。
php.iniに「extension=php_zip.dll」を追加します。

ZipArchiveを生成します。
ZIPファイル名を指定して、openします。
以下では、ZipArchive::CREATEモードとしています。

addFromString、addFileにて、ZIPファイルに、文字列やファイルを追加します。

addFromString(ZIP内ファイル名,内容)
addFile(格納するファイル,ZIPファイル内でのファイル名)となります。

格納したらクローズを行います。


<?php
    //ZipArchiveを生成
    $zip = new ZipArchive();

    //ZIPファイル名
    $filename = "test.zip";

    print $filename ."を作成します。" ."<BR>";

    //ファイルオープン
    $flg = $zip->open($filename, ZipArchive::CREATE);

    if ($flg == 0) {
        print "失敗";
        exit;
    }

    //内容をZIPファイルに追加
    $zip->addFromString("string.txt","内容*******");

    //ZIPファイルにファイルを追加
    $zip->addFile("test.xml");

    //ZIPファイルにファイルを追加(ZIPファイル内の名前を指定)
    $zip->addFile("test.xml","newname.xml");

    //クローズ
    $zip->close();

    print "ZIPファイルを作成しました。";
?>

セッション管理

セッション管理です。
セッション変数に値を保持することが可能です。
ユーザ毎のIDをもとに、ユーザとのやり取りを、サーバに記録することが可能です。

ログイン情報をセッションに格納したり、
ユーザが登録した商品情報をセッションに登録したりします。
画面間の遷移における、データのやり取りが管理できます。

第三者にセッション情報を盗まれる危険性があるので、
SSLの利用等をする必要があります。

index.html
商品登録画面です。

<html>
<head>
<title>商品登録</title>
</head>
<body>
<form method="post" action="syo.php">
    <input type="text" name="syoNmTxt">
    <input type="submit" value="登録">
</form>
</body>
</html>

syo.php
商品情報をセッションに格納します。

<?php
//セッションスタート
session_start();
?>
<html>
<head>
<title>商品登録</title>
</head>
<body>
<?php
//syoNmでセッションに値を格納
$syouhin = $_POST["syoNmTxt"];
$_SESSION["syoNm"] = $syouhin;

print $syouhin ."を登録しました。<BR>";
?>
<a href="./chkSyo.php">登録商品の確認</a>
</body>
</html>

chkSyo.php
登録した商品を確認する画面です。
セッションから商品情報を取得します。

<?php
//セッションスタート
session_start();
?>
<html>
<head>
<title>登録商品チェック</title>
</head>
<body>
<?php

print $_SESSION["syoNm"] . "が登録されています。<br>";
?>
<a href="./index.html">戻る</a>
</body>
</html>

文字Code設定

php.ini

①PHPのソースをEUC-JPで保存し、ブラウザへEUC-JPで出力する設定
オプション意味
output_bufferingOff出力バッファリングを指定します
default_charsetEUC-JPデフォルトの文字コードを指定します
extensionphp_mbstring.dllマルチバイト文字列を有効にします。
mbstring.languageJapaneseデフォルトを日本語に設定します。
mbstring.internal_encodingEUC-JP内部文字エンコーディングをEUC-JPに設定します。
mbstring.http_inputautoHTTP入力文字エンコーディング変換をautoに設定します。
mbstring.http_outputEUC-JPHTTP出力文字エンコーディング変換をEUC-JPに設定します。
mbstring.encoding_translationOn内部文字エンコーディングへの変換を有効にします。
mbstring.detect_orderauto文字コード検出をautoに設定します。
mbstring.substitute_characternone無効な文字を出力しない。
 
②PHPのソースをShift_JISで保存し、ブラウザへShift_JISで出力する設定
オプション意味
output_bufferingOff出力バッファリングを指定します
default_charsetShift_JISデフォルトの文字コードを指定します
extensionphp_mbstring.dllマルチバイト文字列を有効にします。
mbstring.languageJapaneseデフォルトを日本語に設定します。
mbstring.internal_encodingSJIS内部文字エンコーディングをSJISに設定します。
mbstring.http_inputautoHTTP入力文字エンコーディング変換をautoに設定します。
mbstring.http_outputSJISHTTP出力文字エンコーディング変換をSJISに設定します。
mbstring.encoding_translationOn内部文字エンコーディングへの変換を有効にします。
mbstring.detect_orderauto文字コード検出をautoに設定します。
mbstring.substitute_characternone無効な文字を出力しない。
 
③PHPのソースをEUC-JPで保存し、ブラウザへShift_JISで出力する設定
オプション意味
output_bufferingOn出力バッファリングを指定します
output_handlermb_output_handler内部コードと出力コードが違うときに変換するように指定します
default_charsetShift_JISデフォルトの文字コードを指定します
extensionphp_mbstring.dllマルチバイト文字列を有効にします。
mbstring.languageJapaneseデフォルトを日本語に設定します。
mbstring.internal_encodingEUC-JP内部文字エンコーディングをEUC-JPに設定します。
mbstring.http_inputautoHTTP入力文字エンコーディング変換をautoに設定します。
mbstring.http_outputSJISHTTP出力文字エンコーディング変換をSJISに設定します。
mbstring.encoding_translationOn内部文字エンコーディングへの変換を有効にします。
mbstring.detect_orderauto文字コード検出をautoに設定します。
mbstring.substitute_characternone無効な文字を出力しない。
 
④PHPのソースをShift_JISで保存し、ブラウザへEUC-JPで出力する設定
オプション意味
output_bufferingOn出力バッファリングを指定します
output_handlermb_output_handler内部コードと出力コードが違うときに変換するように指定します
default_charsetEUC-JPデフォルトの文字コードを指定します
extensionphp_mbstring.dllマルチバイト文字列を有効にします。
mbstring.languageJapaneseデフォルトを日本語に設定します。
mbstring.internal_encodingSJIS内部文字エンコーディングをSJISに設定します。
mbstring.http_inputautoHTTP入力文字エンコーディング変換をautoに設定します。
mbstring.http_outputEUC-JPHTTP出力文字エンコーディング変換をEUC-JPに設定します。
mbstring.encoding_translationOn内部文字エンコーディングへの変換を有効にします。
mbstring.detect_orderauto文字コード検出をautoに設定します。
mbstring.substitute_characternone無効な文字を出力しない。

数値関数

■数値関数
  srand       乱数初期化
  rand        乱数発生
  floor       切り捨て整数化
  ceil        切り上げ整数化
  round       四捨五入
  sqrt        平方根

■srand (乱数初期化)
  srand(time);

  → 現在時間で乱数ジェネレータを初期化する。

■rand (乱数発生)
  $i = rand(0, 99);
            |  |_ 上限値
            |_ 下限値

  → $i には、0 ~ 99 の乱数がセットされる。

■floor (切り捨て整数化)
  $i = floor(1.9);

  → $i には、1 がセットされる。

■ceil (切り上げ整数化)
  $i = ceil(1.1);

  → $i には、2 がセットされる。

■round (四捨五入)
  $i = round(1.5[, 2]);
             |     |_ 求める小数点以下桁数(省略は整数)
             |_ 数値

  $i = round(1.5);

  → $i には、2 がセットされる。

  $i = round(1.123, 2);

  → $i には、1.12 がセットされる。

■sqrt (平方根)
  $i = sqrt(2);

  → $i には、1.14... がセットされる。

■その他関数
  chmod       パーミション設定
  sleep       指定秒ウェイト

■chmod (パーミション設定)
  chmod("path/filename", 0666);

  → パーミッションを設定する。(Perl とパラメタが逆である。)

■sleep (指定秒ウェイト)
    sleep(10);

  → 10 秒間 PHP の実行を休止する。
     (任意の時間実行を停止)

■環境変数
  __LINE__                              // 実行行番号
  PHP_VERSION                           // PHP バージョン
  PHP_OS                                // サーバ OS

  $DOCUMENT_ROOT                        // Web ルートディレクトリ
  $SCRIPT_FILENAME                      // 現 PHP の物理パス情報
  __FILE__                              // 現 PHP の物理パス情報

  $REMOTE_ADDR                          // リモート端末の IP アドレス
  $HTTP_REFERER                         // リモート端末の直前の URL
  $HTTP_USER_AGENT                      // ブラウザ情報
  $SCRIPT_NAME                          // 現 PHP のパス情報
  $PHP_SELF                             // 現 PHP のパス情報

  $SERVER_NAME                          // サーバのホスト名
  $SERVER_SOFTWARE                      // ウェブサーバのソフト名と ver
  $GATEWAY_INTERFACE                    // ウェブサーバの CGI ver

  // サーバが許していれば、IP からホスト名取得
  $host := gethostbyaddr($REMOTE_ADDR);

■画像レスポンス

<?php
  // 準備
  $imgfile = 'sakstreets.gif';
  $imgtype = 'gif';

  // 画像イメージ取得
  if (!($fno = fopen($imgfile, 'rb'))) {
    die;
  }
  $size = filesize($imgfile);
  $img = fread($fno, $size);
  fclose($fno);

  // イメージ表示
  header("Content-type: image/$imgtype");
  print $img;
?>

  → fopen("php://stdout", 'wb') も試してみたが、うまく動作しなかった。

■リダイレクト
  header("Location: path/filename");
                    |_ http://sak-main/test.htm
                       ./w_test/test.php
                       a001.php?p1=a

  → 他の HTML、PHP にリダイレクトする。
     当然、HTML レンポンスの先頭で処理しなければリダイレクトできない。

■セッション管理
  ・ASP のセッション変数と同等の使い方が可能なセッション管理を PHP は持っている。違うページ間での変数共有に利用するとよい。

  session_start();                        // タグの前で開始
  session_register("ses1", "ses2");       // セッション変数登録

  action="sestest2.php?<?= SID ?>"  // セッションID 管理

  → SID については、PHP の環境設定によっては指定しなくても動作する。

<?php

/*
========================================================================
  セッションテスト1
========================================================================
*/
// 準備
  $pgmname = 'sestest1.php';

// セッション設定
  session_start();

// セッション変数
  session_register("ses1", "ses2");

// リクエストデータ取得
  $ses2 = $b;
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>セッションテスト1</TITLE>
</HEAD>
<BODY>
<P align="center">▼ セッションテスト1 ▼</P>
<HR>
<DIV>
<FORM action="sestest2.php?<?= SID ?>" id="FORM1" method="post" NAME="FORM1">
<TABLE border=1 cellPadding=3 cellSpacing=1>
  <TBODY>
    <TR>
      <TD nowrap><FONT size="-1">パラメタ a</FONT></TD>
      <TD nowrap><INPUT id="a" NAME="a" type="text" size="42" maxlength="40" value="<?= $ses1 ?>"></TD>
    </TR>
  </TBODY>
</TABLE>
<BR>
<TABLE border=1 cellPadding=3 cellSpacing=1>
  <TBODY>
    <TR>
      <TD nowrap><INPUT id=submit1 NAME=submit1 type=submit value="  実行  "></TD>
      <TD nowrap><INPUT id=reset1 NAME=reset1 type=reset value="リセット"></TD>
    </TR>
  </TBODY>
</TABLE>
</FORM>
<P>セッション変数<BR>
$ses1 = <?= $ses1 ?><BR>
$ses2 = <?= $ses2 ?><BR>
</P>
</DIV>
<HR>
</BODY>
</HTML>

<?php

/*
========================================================================
  セッションテスト2
========================================================================
*/
// 準備
  $pgmname = 'sestest2.php';

// セッション設定
  session_start();

// セッション変数
  session_register("ses1", "ses2");

// リクエストデータ取得
  $ses1 = $a;
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>セッションテスト2</TITLE>
</HEAD>
<BODY>
<P align="center">▼ セッションテスト2 ▼</P>
<HR>
<DIV>
<FORM action="sestest1.php?<?= SID ?>" id="FORM1" method="post" NAME="FORM1">
<TABLE border=1 cellPadding=3 cellSpacing=1>
  <TBODY>
    <TR>
      <TD nowrap><FONT size="-1">パラメタ b</FONT></TD>
      <TD nowrap><INPUT id="b" NAME="b" type="text" size="42" maxlength="40" value="<?= $ses2 ?>"></TD>
    </TR>
  </TBODY>
</TABLE>
<BR>
<TABLE border=1 cellPadding=3 cellSpacing=1>
  <TBODY>
    <TR>
      <TD nowrap><INPUT id=submit1 NAME=submit1 type=submit value="  実行  "></TD>
      <TD nowrap><INPUT id=reset1 NAME=reset1 type=reset value="リセット"></TD>
    </TR>
  </TBODY>
</TABLE>
</FORM>
<P>セッション変数<BR>
$ses1 = <?= $ses1 ?><BR>
$ses2 = <?= $ses2 ?><BR>
</P>
</DIV>
<HR>
</BODY>
</HTML>

XML読込

XMLファイル読み込みです。
PHP5から追加されたsimplexml_load_fileを利用します。
xmlの内容が配列に格納されます。
var_dumpなどで確認すると分かりやすいです。

以下は、conf.xmlファイルを読み込んで、値を出力しています。


<?php
$fileName = "conf.xml";
$xml = simplexml_load_file($fileName);

$db = $xml->db;

print $db->id ."<BR>";
print $db->pass ."<BR>";
print $db->host ."<BR>";
print $db->dbname ."<BR>";
?>

conf.xml

<?xml version="1.0"?>
<conf>
<db>
<id>id</id>
<pass>passs</pass>
<host>host</host>
        <dbname>dbname</dbname>
</db>
</conf>

例外処理

例外処理です。PHP5から、利用できます。

例外は、ファイルを読み込んだ時に、ファイルがない場合などに発生します。

tryの中に、例外が発生する可能性がある構文を書きます。
catchにて、発生した例外をキャッチし、例外時の処理を行います。

ただし、PHPでは、例外を自分でスローしなければいけません。
tryの中で、自分で判定を行い例外をスローすることになります。


<?php
try {
    print "ファイルの存在チェック開始<BR>";

    if (!file_exists($filename)) {
        //ファイルが存在しない場合、例外をスローする。
        throw new Exception("File Not Found Exception");
    }
    
    print "ファイルの存在チェック終了<BR>";
} catch (Exception $ex) {
    //例外をキャッチして、メッセージを表示する。
    print $ex->getMessage();
}
?>

文件夹下の文件名取得

ディレクトリは以下のファイル名を取得します。
opendir関数を用いて、ディレクトリハンドルを取得します。
readdirでファイル情報を取得します。


<?php
//ディレクトリ
$dirName = "./";

//ディレクトの存在チェック
if (is_dir($dirName)) {

    //ディレクトリハンドル取得
if ($dir = opendir($dirName)) {

        //ファイル読み込み、表示
while (($file = readdir($dir)) !== false) {
echo $file . "<BR>";
}
closedir($dir);
}
}
?>

表单数据取得

ブラウザから送信されたデータの取得方法です。
下記では、form内に配置されたinputに入力された値を取得しています。

formのmethodを「POST」か「GET」に指定します。
actionは、送信先のurlを記述します。
submitのボタンを配置して、データを送信します。
ボタンを押すと送信先のurlに飛びます。

送信先のurlでは、$_POST、$_GETを利用して値を取得します。
$_POST["コントロールの名前"]、$_GET["コントロールの名前"]となります。
コントロールの名前は、送信先のFORM内の名前です。

POSTとGETの違いですが、GETは、送信するとURLが「?key=送信された値」となります。
ですから、GETの場合はFORMを利用しなくてもデータを取得することができます。

直接URLを叩けばOKです。
「?key=1」→$_GET["key"]な感じで値を取得できます。

POSTは、URLでは取得できないのでFORMを利用してデータの取得を行います。

POSTの場合

<form method="post" action="./form.php">
    <input type="text" name="txt">
    <input type="submit" value="送信">
</form>

<?php
print "送信された値:" . $_POST["txt"];
?>

GETの場合

<form method="get" action="./form.php">
    <input type="text" name="txt">
    <input type="submit" value="送信">
</form>

<?php
print "送信された値:" . $_GET["txt"];
?>

日付の取得

日付を取得します。
getDate関数、date関数を利用します。
getDate関数は、日付を配列として取得します。
date関数は、フォーマットを指定して、日付を取得できます。
フォーマットを指定したい場合に適しています。

//getDateで日付を配列で取得
$systemDate = getDate();
print $systemDate[year];
print $systemDate[mon];
print $systemDate[mday] . "<BR>";

//dateでフォーマットを指定して日付を取得
$systemDate = date("Y/m/d");
print $systemDate;

昨日、明日の日付の取得
現在日付を取得し、mktime関数を利用します。何日後を取得するのにも利用できます。

<?php
//現在日付取得
$systemDate = getDate();
$sysYear = $systemDate[year];
$sysMon = $systemDate[mon];
$sysDay = $systemDate[mday];

//昨日を表示
//日を-1する。
print date("Y/m/d",mktime(0,0,0,$sysMon,$sysDay-1,$sysYear)) ."<BR>";

//明日を表示
//日に+1をする。
print date("Y/m/d",mktime(0,0,0,$sysMon,$sysDay+1,$sysYear)) ."<BR>";
?>

月末の日付の取得
まず、getDate関数で、現在の日付を取得します。

月末の日付は、mktime関数を利用します。
mktimeは、引数を元に日付を作成します。
mktime(時,分,秒,月,日,年,サマータイム)です。

現在日付の月を増やして、日付を0にすると、今月末の取得が行えます。

<?php
//現在日付を取得
$systemDate = getDate();
$sysYear = $systemDate[year];
$sysMon = $systemDate[mon];
$sysDay = $systemDate[mday];

//今月の日付数
$lastDay = date("Y/m/d", mktime(0, 0, 0, $sysMon+1, 0, $sysYear));

//表示
print "今月末:" . $lastDay;
?>

曜日を取得
getDateにて、システム日付を連想配列にて、取得します。
取得した、日付の連想配列から、曜日番号を取得します。

曜日番号は、以下の関係にあります。
0:日
1:月
2:火
3:水
4:木
5:金
6:土

この関係を利用して、曜日の配列を作成して、曜日を取得する、getYoubi関数を作成して、曜日を取得します。

<?
//システム日付を取得
$systemDate = getDate();

//getYoubiに、曜日番号を引数として実行
print getYobi($systemDate[wday]);

//曜日を取得
function getYoubi($wday) {
    $arr = array("日","月","火","水","木","金","土");

    return $arr[$wday];
}
?>

数据库操作

■MySQL 接続

MySQL の接続は、次のようにする。尚、エラー処理は、まったく行っていないので現実的な処理ではない。

<?php
/*
========================================================================
  MySQL 接続テスト phpsql1.php
========================================================================
*/
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>MySQL 接続テスト</TITLE>
</HEAD>
<BODY>
<P align="center">▼ MySQL 接続テスト ▼</P>
<HR>
<DIV>
<?php
// MySQL 接続
  if (!($cn = mysql_connect("localhost", "root", ""))) {
    die;
  }

// MySQL DB 選択
  if (!(mysql_select_db("sak"))) {
    die;
  }

// MySQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = mysql_query($sql))) {
    die;
  }

// MySQL レコード参照
  while ($item = mysql_fetch_array($rs)) {
    print "${item['key1']} ";
    print "${item['data1']} ";
    print "${item['data2']} ";
    print "${item['data3']}<BR>";
  }

// MySQL 切断
  mysql_close($cn);

// 正常終了
  print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

■PostgreSQL 接続

  ・PostgreSQL の接続は、次のようにする。
    尚、エラー処理は、まったく行っていないので現実的な処理ではない。
    また、動作テストは実施していない。

<?php
/*
========================================================================
  PostgreSQL 接続テスト phpsql2.php
========================================================================
*/
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>PostgreSQL 接続テスト</TITLE>
</HEAD>
<BODY>
<P align="center">▼ PostgreSQL 接続テスト ▼</P>
<HR>
<DIV>
<?php
// PostgreSQL 接続
  if (!($cn = pg_connect("host=sak-design port=5432 dbname=sak user=sak password=sak"))) {
    die;
  }

// PostgreSQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = pg_exec($sql))) {
    die;
  }

// PostgreSQL レコード参照
  $ct = pg_numrows($rs);
  for ($i = 0; $i < $ct; $i++) {
    $item = pg_fetch_array($rs, $i);
    print "${item['key1']} ";
    print "${item['data1']} ";
    print "${item['data2']} ";
    print "${item['data3']}<BR>";
  }

// PostgreSQL 切断
  pg_close($cn);

// 正常終了
  print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

■MySQL レコード追加、レコード修正、レコード削除

  ・MySQL のレコード追加、修正、削除は、次のようにする。
    尚、エラー処理は、まったく行っていないので現実的な処理ではない。

  ・変数項目中の「'」を「\'」に、「"」を「\"」にするには、
    $s = addslashes($s); のように addslashes を使用する。

  ・MySQL のバージョンによっては、トランザクションがサポートされていない。
    うちのバージョンでは、begin、commit でエラーにはならないものの
    rollback が使用できない。(^^;
    テーブルロックでは、マルチユーザアクセス時のレスポンスに問題がある
    ように思う。設計仕様でなんとかするしかないかも。

<?php
/*
========================================================================
  MySQL 追加、修正、削除テスト phpsql3.php
========================================================================
*/
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>MySQL 追加、修正、削除テスト</TITLE>
</HEAD>
<BODY>
<P align="center">▼ MySQL 追加、修正、削除テスト ▼</P>
<HR>
<DIV>
<?php
// MySQL 接続
  if (!($cn = mysql_connect("localhost", "root", ""))) {
    die;
  }

// MySQL DB 選択
  if (!(mysql_select_db("sak"))) {
    die;
  }

// MySQL トランザクション開始
  $sql = "begin";
  if (!(mysql_query($sql))) {
    die;
  }

// MySQL レコード削除
  $sql = "delete from test where key1 like 'z%'";
  if (!(mysql_query($sql))) {
    die;
  }
  print '初期削除件数= ' . mysql_affected_rows() . '<BR>';

// MySQL トランザクションコミット
  $sql = "commit";
  if (!(mysql_query($sql))) {
    die;
  }

// MySQL トランザクション開始
  $sql = "begin";
  if (!(mysql_query($sql))) {
    die;
  }

// MySQL レコード追加
  $sql = "insert into test values('z001', 10, 20, 30)";
  if (!(mysql_query($sql))) {
    die;
  }
  print '追加件数= ' . mysql_affected_rows() . '<BR>';
  $sql = "insert into test values('z002', 11, 22, 33)";
  if (!(mysql_query($sql))) {
    die;
  }
  print '追加件数= ' . mysql_affected_rows() . '<BR>';
  $sql = "insert into test values('z003', 111, 222, 333)";
  if (!(mysql_query($sql))) {
    die;
  }
  print '追加件数= ' . mysql_affected_rows() . '<BR>';

// MySQL レコード修正
  $sql = "update test set data2 = 222 where key1 = 'z001'";
  if (!(mysql_query($sql))) {
    die;
  }
  print '修正件数= ' . mysql_affected_rows() . '<BR>';

// MySQL レコード削除
  $sql = "delete from test where key1 = 'z003'";
  if (!(mysql_query($sql))) {
    die;
  }
  print '削除件数= ' . mysql_affected_rows() . '<BR>';

/*
// MySQL トランザクションロールバック
  $sql = "rollback";
  if (!(mysql_query($sql))) {
    die;
  }
*/

// MySQL トランザクションコミット
  $sql = "commit";
  if (!(mysql_query($sql))) {
    die;
  }

// MySQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = mysql_query($sql))) {
    die;
  }
  print '照会件数= ' . mysql_num_rows($rs) . '<BR>';

// MySQL レコード参照
  while ($item = mysql_fetch_array($rs)) {
    print "${item['key1']} ";
    print "${item['data1']} ";
    print "${item['data2']} ";
    print "${item['data3']}<BR>";
  }

// MySQL 切断
  mysql_close($cn);

// 正常終了
  print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

■PostgreSQL レコード追加、レコード修正、レコード削除

  ・PostgreSQL のレコード追加、修正、削除は、次のようにする。
    尚、エラー処理は、まったく行っていないので現実的な処理ではない。
    また、動作テストは実施していない。

  ・変数項目中の「'」を「\'」に、「"」を「\"」にするには、
    $s = addslashes($s); のように addslashes を使用する。

<?php
/*
========================================================================
  PostgreSQL 追加、修正、削除テスト phpsql4.php
========================================================================
*/
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>PostgreSQL 追加、修正、削除テスト</TITLE>
</HEAD>
<BODY>
<P align="center">▼ PostgreSQL 追加、修正、削除テスト ▼</P>
<HR>
<DIV>
<?php
// PostgreSQL 接続
  if (!($cn = pg_connect("host=sak-design port=5432 dbname=sak user=sak password=sak"))) {
    die;
  }

// PostgreSQL トランザクション開始
  $sql = "begin";
  if (!(rcd = pg_exec($sql))) {
    die;
  }

// PostgreSQL レコード削除
  $sql = "delete from test where key1 like 'z%'";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '初期削除件数= ' . pg_cmdtuples($rcd) . '<BR>';

// PostgreSQL トランザクションコミット
  $sql = "commit";
  if (!(rcd = pg_exec($sql))) {
    die;
  }

// PostgreSQL トランザクション開始
  $sql = "begin";
  if (!(rcd = pg_exec($sql))) {
    die;
  }

// PostgreSQL レコード追加
  $sql = "insert into test values('z001', 10, 20, 30)";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '追加件数= ' . pg_cmdtuples($rcd) . '<BR>';
  $sql = "insert into test values('z002', 11, 22, 33)";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '追加件数= ' . pg_cmdtuples($rcd) . '<BR>';
  $sql = "insert into test values('z003', 111, 222, 333)";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '追加件数= ' . pg_cmdtuples($rcd) . '<BR>';

// PostgreSQL レコード修正
  $sql = "update test set data2 = 222 where key1 = 'z001'";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '修正件数= ' . pg_cmdtuples($rcd) . '<BR>';

// PostgreSQL レコード削除
  $sql = "delete from test where key1 = 'z003'";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
  print '削除件数= ' . pg_cmdtuples($rcd) . '<BR>';

/*
// PostgreSQL トランザクションロールバック
  $sql = "rollback";
  if (!(rcd = pg_exec($sql))) {
    die;
  }
*/

// PostgreSQL トランザクションコミット
  $sql = "commit";
  if (!(rcd = pg_exec($sql))) {
    die;
  }

// PostgreSQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = pg_exec($sql))) {
    die;
  }
  print '照会件数= ' . pg_numrows($rs) . '<BR>';

// PostgreSQL レコード参照
  $ct = pg_numrows($rs);
  for ($i = 0; $i < $ct; $i++) {
    $item = pg_fetch_array($rs, $i);
    print "${item['key1']} ";
    print "${item['data1']} ";
    print "${item['data2']} ";
    print "${item['data3']}<BR>";
  }

// PostgreSQL 切断
  pg_close($cn);

// 正常終了
  print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

■MySQL 問い合わせ、レコード参照

  ・MySQL の問い合わせ、レコード照会は、次のようにする。
    尚、エラー処理は、まったく行っていないので現実的な処理ではない。

  ・見出しを項目名から取得し、項目数も可変で照会表示するロジックになって
    いる。PHP3、PHP4 どちらでも動作する。

  ・PostgreSQL でも似たようにできると思う。疲れたので、PostgreSQL 版の
    問い合わせ、レコード参照はパス。(^◇^;)

  ・尚、単純なレコード参照方法は、MySQL、PostgreSQL 共に
    PHP + MySQL 編2 - RDBMS 接続、ログイン、mysql_connect、mysql_select_db
    に掲載してあります。

<?php
/*
========================================================================
  MySQL 問い合わせ、レコード参照テスト phpsql5.php
========================================================================
*/
?>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>MySQL 問い合わせ、レコード参照テスト</TITLE>
</HEAD>
<BODY>
<P align="center">▼ MySQL 問い合わせ、レコード参照テスト ▼</P>
<HR>
<DIV>
<?php
// MySQL 接続
  if (!($cn = mysql_connect("localhost", "root", ""))) {
    die;
  }

// MySQL DB 選択
  if (!(mysql_select_db("sak"))) {
    die;
  }

// MySQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = mysql_query($sql))) {
    die;
  }
  print '照会件数= ' . mysql_num_rows($rs) . '<BR>';

// MySQL レコード参照開始
  $init = True;
  while ($item = mysql_fetch_array($rs)) {

  // MySQL 見出処理開始
    if ($init) {

    // MySQL レコード項目数参照
      $clct = count($item) >> 1;
      print "レコード項目数= $clct<BR>";

    // MySQL 項目名参照
      print '=================================<BR>';
      print '|';
      reset($item);
      for ($i = 0; $i < $clct; $i++) {
        $tmp = each($item);  // 添字キー読み飛ばしダミー
        $tmp = each($item);
        list($mds, $dmy) = $tmp;
        print " $mds |";
      }
      print '<BR>';
      print '=================================<BR>';

  // MySQL 見出処理終了
      $init = False;
    }

  // MySQL 項目データ参照
    print '|';
    for ($i = 0; $i < $clct; $i++) {
      print " $item[$i] |";
    }
    print '<BR>';

// MySQL レコード参照終了
    print '=================================<BR>';
  }

// MySQL 切断
  mysql_close($cn);

// 正常終了
  print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

DomでXML作成

DomDocumentを用いて、XMLファイルを作成します。


<?php
//DomDocumentを生成
$dom = new DomDocument('1.0');

//要素「usr」を追加
$usr = $dom->appendChild($dom->createElement('usr'));

// 「usr」に要素「ID」を追加
$id = $usr->appendChild($dom->createElement('id'));

//idにテキストノードを追加
$id->appendChild($dom->createTextNode('ID123456'));

//出力のフォーマット
$dom->formatOutput = true;

//セーブ
$dom->save('usr.xml');
?>

作成されたXMLファイル

<?xml version="1.0"?>
<usr>
<id>ID123456</id>
</usr>

開発環境構築

Apacheをインストールhttp://www.phppro.jp/phpmanual/install_win32_1.php#apache
PHPのインストールhttp://www.phppro.jp/phpmanual/install_win32_2.php
MySQLのインストールhttp://www.phppro.jp/phpmanual/install_win32_3.php

PHP@文字列関数

■文字列演算子
  .文字列の結合
  $a = 'abc';
  $b = 'def';
  $c = $a . $b;

  → $c には、'abcdef' がセットされます。

  $a = 'abc';
  $a .= 'def';

  → $a には、'abcdef' がセットされます。

■文字列関数
  strtolower         小文字に変換
  strtoupper         大文字に変換
  substr             n 番目から n バイトの文字列を切り出し
  strlen             何バイトあるか数える
  strpos             指定文字列が何番目から存在するか調べる
  strrpos            指定文字列が最後から何番目に存在するか調べる
  sprintf            書式指定変換をする
  ltrim              左側空白除去 (\n、\r、\t も除去)
  rtrim              右側空白除去 (\n、\r、\t も除去)
  trim               左右空白除去 (\n、\r、\t も除去)
  htmlspecialchars  「<」、「>」、「&」、「"」を記号文字に変換
  stripslashes      「\」を除去
  split              セパレータによる文字列分割
  list               配列要素代入
  time               ローカル時間
  date               日付時間書式変換
  crypt              文字列暗号化

■PHP3 日本語文字列関数(i18n オプション)
  mbsubstr           n 番目から n バイトの文字列を切り出し
  mbstrlen           何バイトあるか数える
  mbstrpos           指定文字列が何番目から存在するか調べる
  mbstrrpos          指定文字列が最後から何番目に存在するか調べる

  mbsplit            セパレータによる文字列分割

  $jis = i18n_convert($var, "JIS", "SJIS");
  $euc = i18n_convert($var, "EUC", "SJIS");

  $str = i18n_ja_jp_hantozan($var, 'AKHV');
                                    |_ r 全角英字を半角に
                                       R 半角英字を全角に
                                       n 全角数字を半角に
                                       N 半角数字を全角に
                                       a 全角英数字記号を半角に
                                       A 半角英数字記号を全角に
                                       s 全角空白を半角に
                                       S 半角空白を全角に
                                       k 全角カタカナを半角に
                                       K 半角カタカナを全角に
                                       h 全角ひらがなを半角に
                                       H 半角ひらがなを全角に
                                       c 全角カタカナを全角ひらがなに
                                       C 全角ひらがなを全角カタカナに
                                       V 濁点を 1 文字全角に(K、H と一緒に使用)

■PHP4 日本語文字列関数(mbstring オプション)
  mb_substr   n 番目から n バイトの文字列を切り出し
  mb_strlen   何バイトあるか数える
  mb_strpos   指定文字列が何番目から存在するか調べる
  mb_strrpos  指定文字列が最後から何番目に存在するか調べる

  mbsplit     セパレータによる文字列分割

  $jis = mb_convert_encoding($var, "JIS", "SJIS");
  $euc = mb_convert_encoding($var, "EUC", "SJIS");

  $str = mb_convert_kana($var, 'AKHV');
                                |_ r 全角英字を半角に
                                   R 半角英字を全角に
                                   n 全角数字を半角に
                                   N 半角数字を全角に
                                   a 全角英数字記号を半角に
                                   A 半角英数字記号を全角に
                                   s 全角空白を半角に
                                   S 半角空白を全角に
                                   k 全角カタカナを半角に
                                   K 半角カタカナを全角に
                                   h 全角ひらがなを半角に
                                   H 半角ひらがなを全角に
                                   c 全角カタカナを全角ひらがなに
                                   C 全角ひらがなを全角カタカナに
                                   V 濁点を 1 文字全角に(K、H と一緒に使用)

■strtolower (小文字に変換)
  $a = strtolower('ABC');

  → $a には、'abc' がセットされます。

■strtoupper (大文字に変換)
  $a = strtoupper('abc');

  → $a には、'ABC' がセットされます。

■substr (文字列切り出し)
  $a = substr('abcdef', 1, 3);

  → $a には、'bcd' がセットされます。
  → 位置は先頭が 0、文字数はバイト単位です。

■strlen (文字列バイト長)
  $i = strlen('abcdef');

  → $i には、6 がセットされます。
  → 長さはバイト単位です。

■strpos (文字列検索)
  $i = strpos('abcdef', 'bcd'[, 0]);
                             |_ 検索開始位置は省略すると 0

  → $i には、1 がセットされます。
  → 検索結果位置は先頭が 0 です。

■strrpos (文字列後方検索)
  $i = strrpos('abcdab', 'ab');

  → $i には、4 がセットされます。
  → 検索結果位置は先頭が 0 です。

■sprintf (文字列書式フォーマット)
  $a = sprintf('a = %06d  b = %04d', 10, 20);

  → $a には、'a = 000010  b = 0020' がセットされます。
  → 書式記号は C 言語と同じみたいです。

  %b 2進
  %c 文字
  %d 整数
  %u 符号なし整数
  %f 浮動小数点
  %o 8進
  %s 文字列
  %x 16進小文字
  %X 16進大文字

■ltrim (左側空白除去)
  $a = ltrim("    abc");

  → $a には、'abc' がセットされます。
  → 全角空白は除去できないので注意すること。
  → \n、\r、\t も除去される。

■rtrim (右側空白除去)
  $a = rtrim("abc    \n");

  → $a には、'abc' がセットされます。
  → 全角空白は除去できないので注意すること。
  → chop とも書けるが、Perl の chop とは違う
  → \n、\r、\t も除去される。

■trim (左右空白除去)
  $a = trim("    abc    \n");

  → $a には、'abc' がセットされます。
  → 全角空白は除去できないので注意すること。
  → \n、\r、\t も除去される。

■htmlspecialchars (「<」、「>」、「&」、「"」を記号文字に変換)
  $a = htmlspecialchars('abc

"def"&'); → $a には、'abc&lt;P&gt;&quot;def&quot;&amp;' がセットされます。(実際は小文字である) ■stripslashes (「\」を除去) $a = stripslashes('\abc\def'); → $a には、'abcdef' がセットされます。 ■split (セパレータによる文字列分割、文字分割) $a = split(",", "abc,defg,hi"); → $a[0] = 'abc'、$a[1] = 'defg'、$a[2] = 'hi' とセットされます。 ■list (配列要素代入) $d[0] = 'abc'; $d[1] = 'defg'; $d[2] = 'hi'; list($a, $b, $c) = $d; → $a = 'abc'、$b = 'defg'、$c = 'hi' とセットされます。 ■time (ローカル時間) ■date (日付時間書式変換) $dttm = date('Y.m.d H:i:s', time()); → $dttm には、'2002.06.01 15:00:00' がセットされます。(システム日付、システム時間、現在日付取得、現在時刻取得) ■crypt (文字列暗号化) $s = crypt("abc012", "sk"); | | |_ 英数字 2 文字の暗号化キー | |_ 通常文字列 |_ 暗号化文字列 → 暗号化を復元する関数はない。従って、パスワードの比較などは、入力パスワードを同暗号化キーで暗号化し、暗号化状態で比較する。

FPDFでPDF作成

PHPでPDFファイル作成を行います。
FPDFのフリーのツールを使用します。

http://www.fpdf.org/から入手できます。

また、日本語対応を行うため、
http://www.fpdf.org/download/からjapanese.zipを入手します。

それそぞれを解凍します。
同一のフォルダに置きます。
php.iniでincludeでフォルダを指定します。
もしくは、すでにincludeされているPearの配下に置いてもいいでしょう。

PDF_Japaneseを生成します。
AddSJISFontにてSJISを追加します。

PDFをオープンし、ページを追加して、書き込みます。
以下では、書き込みの際に、mb_convert_encodingにてUTF-8とSJISを変換しています。

Outputにて出力を行います。
引数に何も指定しない場合は、そのまま画面に出力されます。


<?php
require("fpdf/japanese.php");

//PDF_Japanese生成
$pdf=new PDF_Japanese();

//SJISのフォント追加
$pdf->AddSJISFont();

//オープン
$pdf->Open();

//ページ追加
$pdf->AddPage();

//フォント設定
$pdf->SetFont("SJIS","",18);

//書き込み
$str = "あいうえお";
$pdf->Write(8,mb_convert_encoding($str,"SHIFT-JIS","UTF-8"));

//出力
//$pdf->Output("test.pdf");
$pdf->Output();
?>

フレームワーク

「CakePHP」「symfony」「Zend Framework」の比較
「参照サイト」 → http://www.phppro.jp/article/framework/comparison.php




CSV読込

CSVファイルの読み込みには、explodeかfgetcsvを利用します。
explodeの場合は、""で囲まれてなく、中途半端な所で区切られてない、場合に利用します。
「1,2」みたいな物を処理することができます。

それ以外のケースは、fgetcsvを利用します。
fgetcsvは、デリミタや囲み文字を指定することが可能です。
また、改行が途中であっても扱えます。
「"1"
,"2"」
な物を扱えます。


<?php
//explodeの場合 csvファイルが中途半端な所で改行されていない場合
$fileName = "file.cgi";
$file = fopen($fileName,"r");

while(!feof($file)){
    $csv = fgets($file);

    //csvファイルを配列に格納します。
    //カンマ区切り(「,])の場合です。    
    $str = explode(",", $csv);
    print "$str[0]";
    print "$str[1]<BR>";
}

fclose($file);
?>

<?php
//fgetcsvの場合 fgetcsv(handle,length,delimiter,enclosure,escape)
$fileName = "file.cgi";
$file = fopen($fileName,"r");

while(!feof($file)){
    $str = fgetcsv($file);

    print "$str[0]";
    print "$str[1]<BR>";
}

fclose($file);
?>

MySQL文字化け

Web+DBプログラミング入門 Apache + PHP + MySQL編のPHPサンプルプログラムを実行した結果、MySQLのテーブルに格納し、PHPプログラムでブラウザ上に表示した日本語(漢字・倍角の文字)が正しく表示されない場合はDBへ接続しているプログラムソース


//DBへ接続開始
$dbHandle = mysql_connect("localhost","root","");

//DBの接続に失敗した場合はエラー表示をおこない処理中断
if ($dbHandle == False) {
print ("can not connect db\n");
exit;
}

の下の行にMySQLのクライアントの文字コードをsjisに設定する次のソースを


//MySQLのクライアントの文字コードをsjisに設定
mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis");

を追加してください。

*注:プログラムファイルの文字コードはsjisを指定して保存してください。サクラエディタなど文字コードを指定できるエディタを使うと便利です。

2000年2月17日星期四

PHP4.3+Apache2.0環境構築

環境構築(Linux)
①LinuxにApacheをインストールする
②LinuxにPHPをインストールする


環境構築(Windows)
①WindowsにApacheをインストールする
②WindowsにPHPをインストールする

PHP5+mysql5.0+apache2.2

一、系统环境及软件版本
OSwindowsXP sp3
Apacheapache_2.2.4-win32-x86-no_ssl.msi
PHPphp-5.2.0-Win32_extract.zip
MySQLmysql-noinstall-5.0.45-win32.zip
ZendOptimizerZendOptimizer-3.2.2-Windows-i386.exe
phpMyAdminphpMyAdmin-2.11.0-all-languages-utf-8-only.7z
ZendFrameworkZendFramework-1.0.1.zip

二、注意
如果可以的话,安装前关闭电脑的防火牆或杀毒软件,由于防火牆的拦截可能会造成个别程序不可预知的错误。当然并不是一定要关。本例的相关目录设置如下,读者可在安装时根据个人情况自行修改相关路径设置。
php相关软件路径 D:\PHPPGEXT
apache路径D:\PHPPGEXT\APACHE
php程序路径D:\PHPPGEXT\PHP5
MYSQL路径D:\PHPPGEXT\MYSQL
PHP的session缓存路径D:\PHPPGEXT\TMP
PHP服务器的根目录E:\wwwroot\phproot\

三、安装
1.安装apache
建文件夹路径D:\PHPPGEXT\APACHE
双击apache_2.2.4-win32-x86-no_ssl.msi开始安装apache,一路NEXT。
出现安装方式界面选择「custom」方式,
出现设置安装路径的界面时选择D:\PHPPGEXT\APACHE,继续NEXT,
在选择端口界面选择第二项「only for the current user, on Port 8080, when started manually.」,即将apache的默认服务端口设置为8080。第一个选项的大概意思是设置apache使用80端口,但通常windows的IIS默认使用80端口,如果选择了第一个选项,会造成端口冲突,apache可能会安装失败,将来apache运行时会产生错误。
继续NEXT,弹出几个 CMD 窗口安装 Windows 服务以后…… 安装就完成了……
右下角将出现 Apache 粉红色的羽毛 Icon,不出意外图标上应该显示绿灯(表示 HTTP 伺服已经正常启动),否则说明安装有问题。至于安装可能的问题,我们将在后面的常见问题中专门介绍,这裡暂且不论。打开浏览器,在地址栏输入:http://localhost:8080,如果屏幕出现 「It Works」 就表示安装成功。我们暂且不去修改apache的配置,在后面的配置部分我们会专门的介绍。

2.安装PHP
将php-5.2.0-Win32_extract.zip解压到D:\PHPPGEXT\PHP5\

3.安装MySQL
将mysql-noinstall-5.0.45-win32.zip解压到D:\PHPPGEXT\MYSQL\

4.建立index.php
在E:\wwwroot\phproot\目录下建立index.php,该文件代码如下
<?php
echo phpinfo();
?>

四、配置及设置
注意,如果说上述安装次序可以不按次序进行的话,配置次序好最按如下顺序进行。
1.配置PHP
打开D:\PHPPGEXT\PHP5,找到php.ini-recommended,重命名为php.ini,用记事本打开php.ini文件。
搜索:extension_dir = "./",修改为extension_dir = "D:/PHPPGEXT/PHP5/ext"。
搜索;session.save_path ="/tmp",修改为session.save_path = "D:/PHPPGEXT/TMP"。
去掉;extension=PHP_MySQL.dll前面的分号后另起一行插入 extension=PHP_mysqli.dll。

去掉下面代码前面的分号
;extension=PHP_gd2.dll
;extension=PHP_mbstring.dll
;extension=PHP_curl.dll
;extension=PHP_sockets.dll
;extension=PHP_xmlrpc.dll。
保存并关闭php.ini文件。

按照通常的做法应该Copy一些文件到C盘的系统目录下,但笔者不习惯这种做法,理由还是免去重装系统的麻烦。笔者的做法是通过下面步骤实现的。
我的电脑→属性→高级→环境变量,在Path变量值一栏末尾加入;D:\PHPPGEXT\PHP5,(注意前面带分号,且不要删掉原有的任何字符),点确定,继续确定,直到关闭系统属性标签页。

2.配置MySQL
打开D:\PHPPGEXT\MYSQL,看到一大堆.ini文件,找到my-medium.ini,重命名为my.ini(实际上改哪个都可以,只不过是默认配置不一样),用记事本打开my.ini文件,在最后加入以下代码:
[WinMySQLAdmin]
# 指定mysql服务启动启动的文件
Server=D:/PHPPGEXT/MYSQL/bin/mysqld-nt.exe
找到[mysqld],加入以下代码。
#MySQL 安装目录
basedir=D:/PHPPGEXT/MYSQL
#MySQL 默认数据目录
datadir=D:/PHPPGEXT/MYSQL/data
# 默认字符集
default-character-set=utf8
# 默认储存引擎…… 还是回到 MyISAM 时代吧…… InnoDB 被甲骨文买了…… 虽然开源…… 但……
default-storage-engine=MyISAM
找到[client],加入以下代码。
# 设置mysql客户端的字符集
default-character-set=utf8
保存并关闭my.ini文件。
安装MySQL服务,点任务栏的开始菜单,运行,输入cmd回车,在弹出的窗口中输入d:,回车。看到提示符:D:\>。输入 cd phppgext\mysql\bin,输入mysqld-nt –-install,回车。看到successful之类的提示,表示您的mysql安装成功。关闭cmd窗口。
我的电脑→属性→高级→环境变量,在Path变量值一栏内末尾加入;D:\PHPPGEXT\MYSQL,(注意前面带分号,且不要删掉原有的任何字符),点确定,继续确定,直到关闭系统属性标签页。

3.配置Apache
点任务栏的开始菜单,程序,apache http server 2.2.4,configure pache server,Edit the Apache httpd.conf configuration file。打开并编辑该文件。
搜索DocumentRoot 正行改为 DocumentRoot "E:/wwwroot/phproot"。
应该可以搜索到 <Directory "D:/PHPPGEXT/APACHE/htdocs"> 改为 <Directory "E:/wwwroot/phproot">,
将<Directory "E:/wwwroot/phproot"> </Directory> 之间的 AllowOverride None 改为 AllowOverride All。
搜索 DirectoryIndex ,在其后面加入 index.php index.htm
搜索 #LoadModule ssl_module modules/mod_ssl.so ,在其下一行,插入 LoadModule php5_module D:/PHPPGEXT/PHP5/php5apache2_2.dll ,
(注意php5.2以上版本是php5apache2_2.dll,以下版本是php5apache2.dll,忽略这个问题容易导致apache启动失败)
搜索AddType application/x-gzip .gz .tgz 在其下一行插入 这样几行代码(两种方式任选其一),
如果PHP 以模块方式安装到 Apache(我们使用该方式,因为前面已经设置过LoadModule php5_module D:/PHPPGEXT/PHP5/php5apache2_2.dll )
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

如果PHP 以 CGI 方式安装到 Apache
ScriptAlias /php/ "D:/PHPPGEXT/PHP5"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php-cgi.exe"
保存并关闭该文件,重新启动apache,如无异常,此时apache已经正确配置并生效。

五、重新启动计算机
因为刚才php和mysql的配置需要重启才能生效。重启后如果apache正常,在地址栏输入http://localhost:8080,如果看到一个关于PHP相关信息的网页,说明PHP配置成功。
如何判断MySQL是否正确配置并生效?
开始→设置→控制面板→管理工具→计算机管理→服务和应用程序→服务,在右侧窗口名称一列如果看到MYSQL,并且状态显示已启动,说明MYSQL配置成功。
此时,说明你的PHP + MySQL + apache 环境配置基本成功。

六、安装常用软件
通常一个好的PHP环境需要安装一些常用的工具软件或搭档软件。当然不装也可。
1.安装ZendOptimizer
双击ZendOptimizer-3.2.2-Windows-i386.exe,按提示进行,基本不会出问题。

2.安装phpMyAdmin
phpMyAdmin是基于界面的形式管理MySQL数据库的一个工具。
用apache基于端口开设虚拟主机(也可基于域名或基于IP),本例开设phpMyAdmin端口为900,路径为E:\wwwroot\phproot\phpMyAdmin\ 。至于怎 开设虚拟主机,将在常见问题中作出说明。
将phpMyAdmin-2.11.0-all-languages-utf-8-only.7z解压至E:\wwwroot\phproot\phpMyAdmin\ ,打开libraries文件夹下 config.default.php 。
设置$cfg['Servers'][$i]['auth_type'] = 'http';
设置$cfg['Servers'][$i]['user'] = 'root';
在浏览器地址栏输入http://localhost:900/,看到提示输入用户名和密码的对话框,输入用户名root,密码保留为空,回车即可登录成功。(因为我们的MySQL数据库还没有设置密码,默认的用户名是root,密码空)
3.安装zend framework
将ZendFramework-1.0.1.zip解压至E:\wwwroot\phproot\ZendFramwork\ 。
启用Apache的mod_rewrite模块。打开apache的httpd.conf文件,去掉#LoadModule rewrite_module modules/mod_rewrite.so前面的「#」号。找到<Directory "E:/wwwroot/phproot">和</Directory>之间的AllowOverride 行,改成AllowOverride All。找到Options Indexes FollowSymLinks行,改成Options FollowSymLinks。
在E:\wwwroot\phproot\ZendFramwork\ 下建立 .htaccess 和index.php文件,分别写入如下内容。
index.php写入代码<?php echo phpinfo(); ?>
.htaccess写入代码
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css|swf)$ index.php
php_value include_path "./library"
注意: 这裡的.htaccess在windows无法直接建立,我个人是使用FTP工具软件建立。例如先建立33.htaccess然后把FlashFXP打开,找到本地的33.htaccess,重命名位.htaccess。
注意:ZendFramwork目录下有如下的结构。
E:\wwwroot\phproot\ZendFramework\index.php
E:\wwwroot\phproot\ZendFramework\.htaccess
E:\wwwroot\phproot\ZendFramework\library\Zend\,(这个路径是解压后直接得到的。注意不要把zend下的文件直接拷贝到library目录下,如果那样做的话,笔者不确定是否能成功,因为笔者没有试过。)

用apache基于端口开设虚拟主机(也可基于域名或基于IP),本例开设phpMyAdmin端口为904,路径为E:/wwwroot/phproot/ZendFramework/。至于怎 开设虚拟主机,将在常见问题中作出说明。
重新启动Apache,测试下.htaccess是否可以用 打开本地的http://localhost:904/ 随便打入http://localhost:904/33 看会不会转到http://localhost:904/,此时你应该可以看到一个关于PHP信息的网页, 如果不会说明你的.htaccess没有生效.

七、常见问题
(一)关于Apache的问题
1.安装完成后,提示「no service installed」 。
首先,请确认,您安装apache所使用的端口并没有被其他程序佔用(如果被佔用,自然安装不会成功)。
确认端口没有问题的话,尝试以下步骤:
开始菜单,运行,cmd,回车,在弹出的窗口中输入d:,回车,cd D:\PHPPGEXT\APACHE\bin,回车,输入apache.exe -k install -n apache2 。这样就安装了这个服务。继续键入net start apache2 回车,这样apache服务就启动了,以后的启动关闭服务,直接点击Apache小羽毛标志,按菜单操作即可。
2.为什么要基于端口开设apache虚拟主机
开设虚拟主机通常可以基于域名、IP地址、端口三种。因为笔者是在本机配置环境,不用于真正的服务器,所以笔者没有真正的域名或IP地址资源,无法在本地机器上实现基于IP地址或基于域名开设虚拟主机并访问。
3.怎样开设虚拟主机
以本例的Apache2.2.4为例,找到#Include conf/extra/httpd-vhosts.conf,去掉前面的「#」号。然后找到D:\PHPPGEXT\APACHE\conf\extra\httpd-vhosts.conf,打开这个文件加入如下代码(已开设ZendFramework使用904端口为例,根据具体情况修改):
Listen 904
<VirtualHost *:904>
ServerAdmin webmaster@zf.yourdomain
DocumentRoot E:/wwwroot/phproot/ZendFramework
ServerName zf.yourdomain
ErrorLog logs/zf.yourdomain-error_log
CustomLog logs/zf.yourdomain-access_log common
</VirtualHost>
重新启动Apache,配置就生效了。

(二)关于ZendFramwork问题
注意: .htaccess裡面的php_value include_path 在linux下有的无法使用的。可以通过set_include_path()函数来设置(放在require_once()之前)。
如:index.php裡面要这样:
set_include_path('./library');
include 'Zend';
或者你也可以直接在php.ini裡面设置.

PHP.INI里参数相关中文说明

;;;;;;;;;;;;;;;;;;;
; PHP.INI中文说明 ;
;;;;;;;;;;;;;;;;;;;
; 这个文件是PHP安装的默认配置文件.
; 默认设置下, PHP是以程序开发为目的,而不是为了其它目的!
; 由于PHP在应用在您的站点之前必须考虑一些安全问题,
; 所以请您参考php.ini-recommended(被推荐的)中相关参数的设置,
; 另外,您也可以在以下站点获得帮助:http://php.net/manual/en/security.php.

;;;;;;;;;;;;;;;;
; 关于这个文件 ;
;;;;;;;;;;;;;;;;
; 这个文件控制着PHP的许多方面,为了能让PHP正常读取它,这个文件必须被命名为”php.ini”.
; PHP运行时依次在以下路径中寻找这个文件:当前工作目录,环境变量PHPPRC指定路径,编译时
; 指定的路径.
; 在Windows下,编译时指定路径就是Windows的安装目录,
; 在命令提示符下,可以用-c的参数来替代php.ini�D�的扩展库(模块)目录的路径.
extension_dir = ./

; 是否启用dl()函数.在多线程的服务上(如IIS和Zeus)dl()函数不能很好的工作,
; 在多线程服务上该指令默认被禁止.
enable_dl = On

; 在很多服务器上,以CGI形式运行PHP来提高安全性能.默认设置下,PHP设其为On.
; 您可以在这里关掉它,但关掉以后是有风险的.但在IIS下您则可以毫无风险的关掉它,
; 事实上,在IIS下您必须关掉它.
; cgi.force_redirect = 1

; 如果cgi.force_redirect功能打开,并且您不是在Apache或Netscape(iPlanet)服务器下运行,
您可能须要设定一个环境变量名,PHP将寻找此变量来确定可以继续执行,设定此变量可能会引起
安全问题,避免的方法是先弄清楚您在作什么~~~
; cgi.redirect_status_env = ;

; 此选项提供了在IIS服务器下的智能化安全解决方案,如果在IIS下请设为On,目前不支持Apache
; 服务器(2002年3月17日),默认值是0.
; fastcgi.impersonate = 1;

; 在发送HTTP响应时cgi.rfc2616_headers告诉PHP使用哪种headers.
; 如果设为0,PHP的发送情况是被Apache所支持的,如果设为1,PHP将发送自适应的RFC2616headers.
; 在IIS下,请设其值为1,默认值是0.
;cgi.rfc2616_headers = 0

;;;;;;;;;;;;
; 文件上传 ;
;;;;;;;;;;;;

; 是否允许以HTTP方式上传文件.
file_uploads = On

; 以HTTP方式上传文件的临时目录 (未指定时使用系统默认).
;upload_tmp_dir =

; 允许上传文件的最大值.
upload_max_filesize = 2M

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Fopen wrappers(这个俺不会译5555~) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 是否允许把URLs(如http://和ftp://)当作文件处理.
allow_url_fopen = On

; 指定一个匿名FTP访问密码(例如您的邮件地址)
;from=”Neter@Neter.CN”

; 指定User-Agent字符串(User-Agent是啥呀?用户代理?55555555~)
; user_agent=”PHP”

; 默认连接超时时间(以秒计).
default_socket_timeout = 60

; 如果您的脚本程序不是在苹果机等操作系统下,而只是运行在unix或者win32系统下,
; 打开这个变量将使PHP自动地检查已终止的那些字符变量以便fgets()函数和file()函数
; 不受限制的表达.
; auto_detect_line_endings = Off

;;;;;;;;;;;;
; 动态扩展 ;
;;;;;;;;;;;;
;
; 如果您想让动态扩展库能够自动的被加载,请使用下面的语法.
;
; extension=modulename.extension
;
; 例如在Windows下:
;
; extension=msql.dll
;
; 在UNIX下:
;
; extension=msql.so
;
; 注意后面的值只是模块的名字,并不包含该模块所在的目录,您应该用上面的extension_dir
; 来指示指定扩展库的路径.

;Windows扩展
;注意:PHP已经内建了对MySQL和ODBC支持,所以不必再为其配置任何dll扩展.
;
;extension=php_bz2.dll
;extension=php_cpdf.dll
;extension=php_crack.dll
;extension=php_curl.dll
;extension=php_db.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_dbx.dll
;extension=php_domxml.dll
;extension=php_exif.dll
;extension=php_fbsql.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_hyperwave.dll
;extension=php_iconv.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_java.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pdf.dll
;extension=php_pgsql.dll
;extension=php_printer.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_sockets.dll
;extension=php_sybase_ct.dll
;extension=php_w32api.dll
;extension=php_xmlrpc.dll
;extension=php_xslt.dll
;extension=php_yaz.dll
;extension=php_zip.dll

;;;;;;;;;;;;
; 模块设定 ;
;;;;;;;;;;;;

[系统日志]
; 是否定义各种系统日志变量(如$LOG_PID,$LOG_CRON等).关掉这个指令将会提高效率.
; 您可以在运行时使用define_syslog_variables()函数来定义这些变量.
define_syslog_variables = Off

[邮件功能]
; 仅在Windows下.
SMTP = localhost

; 仅在Windows下.
sendmail_from = Administrator@localhost.com

; 仅在Unix下.您也可以指定参数(默认值是: “sendmail -t -i”).
;sendmail_path =

[Java]
;java.class.path = .\php_java.jar
;java.home = c:\jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path = .\

[SQL]
sql.safe_mode = Off

[ODBC]
;odbc.default_db = Not yet implemented
;odbc.default_user = Not yet implemented
;odbc.default_pw = Not yet implemented

; 是否允许持续连接.
odbc.allow_persistent = On

; 是否在重用前检查连接可用性.
odbc.check_persistent = On

; 允许持续连接的最大值.-1代表无限制.
odbc.max_persistent = -1

; 允许连接的最大值(持续连接和非持续连接的和).-1代表无限制.
odbc.max_links = -1

; 控制LONG类型的字段.返回变量的大小(比特).0代表不控制.
odbc.defaultlrl = 4096

; 控制二进制数据.0不控制,1保持,2转换成字符.
; 可参见有关odbc_binmode和odbc_longreadlen的文档
; 以得到uodbc.defaultlrl和uodbc.defaultbinmode的解释.
odbc.defaultbinmode = 1

[MySQL]
; 是否允许持续连接.
mysql.allow_persistent = On

; 允许持续连接的最大值.-1代表无限制.
mysql.max_persistent = -1

; 允许连接的最大值(持续连接和非持续连接的和).-1代表无限制.
mysql.max_links = -1

; mysql_connect()函数的默认端口.如不设置,mysql_connect()将使用$MYSQL_TCP_PORT或者
; 在/etc/services下的mysql-tcp或者编译定义的MYSQL_PORT(nuix)依次搜索,而在Win32下,将
; 仅检查MYSQL_PORT.
mysql.default_port = 3306

; 用于本地MySql连接的默认socket,为空时,使用内建值.
mysql.default_socket = MySql

; mysql_connect()连接的默认主机(安全模式下无效).
mysql.default_host = localhost

; mysql_connect()连接时的默认用户名(安全模式下无效).
mysql.default_user = root

; mysql_connect()连接时的默认密码(安全模式下无效).
; 注意,在这里使用密码十分危险,因为任何有PHP权限的用户都可以通过运行’echo get_cfg_var(”mysql.default_password”)’
; 的方法来获得该密码,当然,任何有访问权限的用户也可以得到此密码.
mysql.default_password =

; 连接超时的最大值(以秒计).-1代表无限制.
mysql.connect_timeout = -1

; 鉴定报告模式.如果此模式被激活(即设为On),关于table/index和MYSQL错误将会被列出.
mysql.trace_mode = Off

[mSQL]
; 是否允许持续连接.
msql.allow_persistent = On

; 允许持续连接的最大值.-1代表无限制.
msql.max_persistent = -1

; 允许连接最大值(持续连接与非持续连接的和).-1代表无限制.
msql.max_links = -1

[PostgresSQL]
; 是否允许持续连接.
pgsql.allow_persistent = On

; 是否使用pg_pconnect()函数检查中断的持续连接.Need a little overhead(55555俺又不懂了).
pgsql.auto_reset_persistent = Off

; 允许持续连接的最大值. -1代表无限制.
pgsql.max_persistent = -1

; 允许连接的最大值(持续连接与非持续连接的和).-1代表无限制.
pgsql.max_links = -1

; 是否忽略PostgreSQL的返回信息.
pgsql.ignore_notice = 0

; 是否记录PostgreSQL的返回信息.
; 仅当pgsql.ignore_notice=0时,模块才能记录该信息.
pgsql.log_notice = 0

[Sybase]
; 是否允许持续连接.
sybase.allow_persistent = On

; 允许持续连接的最大值.-1代表无限制.
sybase.max_persistent = -1

; 允许连接的最大值(持续连接与非持续连接的和).-1代表无限制.
sybase.max_links = -1

;sybase.interface_file = “/usr/sybase/interfaces”

; 显示错误的最低严重性.
sybase.min_error_severity = 10

; 显示信息的最低严重性.
sybase.min_message_severity = 10

; 与旧的版本(PHP3.0)兼容.如果设为On,PHP将根据它们的Sybase类型自动地赋值到结果中,
; 而不是把它们全当作字符串处理,此模式在将来不再被支持,所以尽量对代码进行修改,并
; 关掉这项.
sybase.compatability_mode = Off

[Sybase-CT]
; 是否允许持续的连接.
sybct.allow_persistent = On

; 允许持续连接的最大值.-1代表无限制.
sybct.max_persistent = -1

; 允许连接的最大值(持续连接与非持续连接的和).-1代表无限制.
sybct.max_links = -1

; 服务器信息最小显示量.
sybct.min_server_severity = 10

; 客户信息最小显示量.
sybct.min_client_severity = 10

[dbx]
; 通过对dbx.colnames_case的设置,返回的数组名能够转换成兼容的值.
; “unchanged” (在不设置时的默认值)
; “lowercase” (小写)
; “uppercase” (大写)
; 推荐不区分大小写字母,但是由于兼容性的限制我们不得不把大小写区分开.
dbx.colnames_case = “unchanged”

[bcmath]
; 用于所有bcmath函数的10十进制数小数的个数.
bcmath.scale = 0

[browscap]
;browscap = extra/browscap.ini

[Informix]
; ifx_connect()的默认主机(安全模式下无效).
ifx.default_host =

; ifx_connect()的默认用户(安全模式下无效).
ifx.default_user =

; ifx_connect()的默认密码(安全模式下无效).
ifx.default_password =

; 是否允许持续连接.
ifx.allow_persistent = On

; 允许持续连接的最大值.-1代表无限制.
ifx.max_persistent = -1

; 允许连接的最大值(持续连接与非持续连接的和).-1代表无限制.
ifx.max_links = -1

; 若打开,select状态符将返回一个byte blobs而不是它的ID.
ifx.textasvarchar = 0

; 若打开,select状态符将返回一个text content而不是它的ID.
ifx.byteasvarchar = 0

; 从固定长度的字符列里分离出空格.可能对Informix SE用户有效.
ifx.charasvarchar = 0

; 若打开, text和byte blobs的内容被导出到一个文件,而不是保存在内存中.
ifx.blobinfile = 0

; NULL(空)被作为空字段返回,除非,这里被设为1,这种情况下(为1)NULL作为字串NULL返回.
ifx.nullformat = 0

[Session]
; 用于保存/获取取数据的控制方式.
session.save_handler = files

; session的保存路径.
; 说明1: PHP不会建立这个文件夹,您必须自行建立.
;
; 说明2: 如果您使用子文件夹进行存储,请检查下面的路径.
session.save_path = /tmp

; 是否使用cookies.
session.use_cookies = 1

; 这个选项能够使用户避免由于session名被作为URLs的一部分显示而受到的攻击.
; 默认值是0.
; session.use_only_cookies = 1

; session的名称(同时作为cookie的名称).
session.name = PHPSESSID

; 是否在请求开始时初始化session.
session.auto_start = 0

; cookie的保存时间(以秒计),设为0时,浏览器关闭时不再保存.
session.cookie_lifetime = 0

; cookie的有效路径.
session.cookie_path = /

; cookie的有效域.
session.cookie_domain =

; 控制连续的数据.PHP是PHP数据的标准控制器.
session.serialize_handler = php

; 定义’garbage collection’(碎片整理)进程的初始化比率
; 这个比率是通过gc_probability/gc_dividend算出的.
; e.g. 1/100 means 1%.

session.gc_probability = 1
session.gc_dividend = 100

; 在指定的秒数后,存储的数据将会被看作’碎片’并且被碎片整理进程清理掉.
; 警告: 您的文件系统会定期的存储数据,FAT系统除外.所以应该使用特别的方法来删除sessions.
session.gc_maxlifetime = 1440

; 说明: 如果您使用文件夹来存储session文件(查看session.save_path中的设置),
; 碎片整理不会自动的运行,您必须通过其它方法整理这些碎片.
; 例如下面的方法和把session.gc_maxlifetime设成1440(1440秒=24分)是等效的.
; cd /path/to/sessions; find -cmin +24 | xargs rm

; 在PHP4.2及更早的版本中没有正式的文件允许您初始一个处于全局的session变量,即使是在
; register_globals被禁用的情况下.PHP4.3及以后版本中,如果此功能被使用,PHP提醒您.
; 您可以对此功能和警告信息单独禁用,此时,如果bug_compat_42是激活的,仅会显示警告信息.

session.bug_compat_42 = 1
session.bug_compat_warn = 1

; 检查HTTP引用使额外包含于URLs中的ids无效.
; HTTP_REFERER应该包含有效的session字段作为子链.
session.referer_check =

; 从文件中读取字节的大小.
session.entropy_length = 0

; 在这里指定session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; 设定为{nocache,private,public,}来决定HTTP的缓存问题,
; 或者不进行设置来避免发送明显的headers.
session.cache_limiter = nocache

; 文档在指定时间(以分计)后过期.
session.cache_expire = 180

; 默认情况下不支持过渡sid.使用此功能时您会收到警告信息.
; 使用过渡sid是有风险的.因为:
;
; - 用户可以发送包含处于激活状态的session ID的URL给其它人.
;
; - 包含处于激活状态的session ID的URL会存在于容易接近的公共计算机里.
;
; - 用户可以通过使用存储于浏览器历史记录或书签中相同的session ID来访问您的站点.
;
session.use_trans_sid = 0

; 重写URL时将从定义的HTML标签中寻找form/fieldset是特殊的,如果您在这里使用它们,
; 就会附;加一个隐藏的,其信息不同与其它的对URLs的附加.如果您想符合XHTML,
; 删除form记录.注意:所有有效的命令必须包含一个”=”号,即使命令后面没有具体值.
url_rewriter.tags = “a=href,area=href,frame=src,input=src,form=,fieldset=”

[MSSQL]
; 是否允许持续连接.
mssql.allow_persistent = On

; 允许持续连接的最大值.-1表示无限制.
mssql.max_persistent = -1

; 允许连接的最大值(持续连接与非持续连接的和).-1表示无限制.
mssql.max_links = -1

; 显示最小错误严重性.
mssql.min_error_severity = 10

; 显示最小信息重要性.
mssql.min_message_severity = 10

; 是否打开与旧的PHP 3.0兼容的模式.
mssql.compatability_mode = Off

; 有效范围0 - 2147483647.默认值是4096.
;mssql.textlimit = 4096

; 有效范围0 - 2147483647.默认值是4096.
;mssql.textsize = 4096

; 限制每一批中的记录数量.设为0时表示所有记录记录在一批中.
;mssql.batchsize = 0

; 当连接到服务器时使用NT验证.
mssql.secure_connection = Off

; 指定最大进程数.默认是25
;mssql.max_procs = 25

[Assertion]
; Assert(expr);默认值是激活的.(俺不行了,这组指令译不过来了55555)
;assert.active = On

; Issue a PHP warning for each failed assertion.
;assert.warning = On

; Don’t bail out by default.
;assert.bail = Off

; User-function to be called if an assertion fails.
;assert.callback = 0

; Eval the expression with current error_reporting(). Set to true if you want
; error_reporting(0) around the eval().
;assert.quiet_eval = 0

[Ingres II]
; 是否允许持续连接.
ingres.allow_persistent = On

; 允许持续连接在最大值. -1代表无限制.
ingres.max_persistent = -1

; 允许连接的最大值.-1代表无限制.
ingres.max_links = -1

; 默认的database(格式是: [node_id::]dbname[/srv_class]).
ingres.default_database =

; 默认用户.
ingres.default_user =

; 默认密码.
ingres.default_password =

[Verisign Payflow Pro]
; 默认的Payflow Pro服务器.
pfpro.defaulthost = “test-payflow.verisign.com”

; 服务器的默认端口.
pfpro.defaultport = 443

; 默认的超时时间(以秒计).
pfpro.defaulttimeout = 30

; 默认代理服务器IP地址(如果须要).
;pfpro.proxyaddress =

; 默认代理服务器端口.
;pfpro.proxyport =

; 默认的登陆名.
;pfpro.proxylogon =

; 默认的登陆密码.
;pfpro.proxypassword =

[Sockets]
; 是否使用系统的read()功能来替代php_read().
sockets.use_system_read = On

[com]
; 指向包含GUIDs,IIDs或典型静态库文件的文件名的文件的路径.
;com.typelib_file =
; 是否允许调用分布式的COM文件
;com.allow_dcom = true
; 是否自动把组成典型静态库文件的常量注册到com_load()函数.
;com.autoregister_typelib = true
; 是否区分常量的大小写
;com.autoregister_casesensitive = false
; 是否在有重复的常量出现时显示错误
;com.autoregister_verbose = true

[Printer]
;printer.default_printer = “”

[mbstring]
; 语言选择.
;mbstring.language = Chinese

; 语言/脚本的编码.
; 某些编码不能作为本地的语言编码,例如SJIS, BIG5, ISO-2022-.
;mbstring.internal_encoding = GB2312

; http输入编码.
;mbstring.http_input = auto

; http输出编码.mb_output_handler必须注册为函数的输出缓存.
;mbstring.http_output = SJIS

; 是否根据mbstring.internal_encoding的设置自动翻译编码. 把这项设为On可以把输入字符
; 转换为设定的编码语言.
; 说明: 一定不要使用这项功能编译静态库文件和某些软件.
;
;mbstring.encoding_translation = Off

; 编码检查顺序.
;mbstring.detect_order = auto

; 当字符不能够被转换时,是否使用substitute_character.
;mbstring.substitute_character = none;

; 是否用加密的字符覆盖没有加密的字符.例如用mb_send_mail(), mb_ereg()覆盖
; mail(), ereg()等.有效的值是0,1,2,4或者它们的组合.例如,7代表覆盖全部.
; 0: 不覆盖
; 1: 覆盖mail()函数
; 2: 覆盖str*()函数
; 4: 覆盖ereg*()函数
;mbstring.func_overload = 0

[FrontBase]
;fbsql.allow_persistent = On
;fbsql.autocommit = On
;fbsql.default_database =
;fbsql.default_database_password =
;fbsql.default_host =
;fbsql.default_password =
;fbsql.default_user = “_SYSTEM”
;fbsql.generate_warnings = Off
;fbsql.max_connections = 128
;fbsql.max_links = 128
;fbsql.max_persistent = -1
;fbsql.max_results = 128
;fbsql.batchSize = 1000

[Crack]
; 修改下面的设置,使这与cracklib文件夹的本地路径相符合,只可以使用基本的文件名,
; 不包含扩展名.
; crack.default_dictionary = “c:\php\lib\cracklib_dict”

[exif]
; 这组就不用译了吧
; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS.
; With mbstring support this will automatically be converted into the encoding
; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty.
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS

; Local Variables:
; tab-width: 4
; End:

2000年2月13日星期日

MVCサンプル

最小限のMVCのサンプル

Java/Servletではforwardというのがあるが、PHPではforwardはできないので、controller.phpがview.phpをインクルードすることによってビューにデータを渡す。

---------------------------------------------------------------------------------------------------------------------------------------------------------

controller.php

<?php
// コントローラ
// ユーザが最初にアクセスするphp。
// index.phpという名前にしてもよい。
require_once("model.php");

session_start();

function redirect($pagename) { 
    if (headers_sent()) {
        exit("Error: redirect: Already header has sent!");
    }

    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    header("Location: http://$host$uri/$pagename");
    exit;
}

// action は必ず GET で渡す。
// POST を一切使いたくない画面もあるから。
if (array_key_exists("action", $_GET))
    $action = $_GET["action"];
else
    $action = "";

switch ($action) {
case "":
    require_once("view.php");       // 初期表示表示
    break;

case "dbaccess":
    $result   = dbaccess();

    $nextpage = $result[0];
    $_SESSION["data"] = $result[1]; // ビューに渡すデータ

    switch ($nextpage) {
    case "success":
        redirect("success.php");    // 成功画面表示
        break;

    case "failure":
        redirect("failure.php");    // 失敗画面表示
        break;
    }
    break;

default:
    echo "action の値が変です: [{$action}]";
    break;
}
?>
---------------------------------------------------------------------------------------------------------------------------------------------------------

model.php

<?php
function dbaccess() {
    // コントローラに返すデータを初期化
    $result = array("", array());

    // パラメータの取得はコントローラでなくモデルの中でやった方がいいと思う。
    $t1 = $_POST["t1"]; 

    if ($t1 == "hoge") {
        $result[0] = "success";
    }
    else {
        $result[1]["msg"] = "よくわからないエラー";  // ビューに渡すデータ
        $result[0] = "failure";
    }
    return $result;
}
?>
---------------------------------------------------------------------------------------------------------------------------------------------------------

view.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>view.php</h1>

下のテキストボックスに「hoge」と入力した場合だけ成功します。<br>
<form name="f1" action="controller.php?action=dbaccess" method="POST">
<input type="text" id="t1" name="t1" maxlength=10><br>
<input type="submit" value="送信">
</form>

</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------

success.php

成功画面。
実際は成功した場合の遷移先もこんな単純ではないだろうから、MVCにしてsuccess.phpをコントローラにするとよい。

<html>
<head>
<meta content="text/html"; charset="utf-8">
</head>
<body>
成功です!
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------

failure.php

失敗画面

<?php
    if (!isset($msg))
        $msg = "";
?>
<html>
<body>
失敗です!<br>
原因:<?php echo $msg;?><br>
<input type="button" value="戻る" onclick="history.back();"><br>
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------