显示标签为“0002 PHP”的博文。显示所有博文
显示标签为“0002 PHP”的博文。显示所有博文

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();
?>