mysqlに接続後、データベース領域を指定してそこにあるテーブルからデータを持ってくる流れを見ていく。


ここで扱うデータベース情報
[ホスト名] localhost
[ユーザ名] myuser
[パスワード] mypass
[データベース領域] mydb
[テーブル名] mytab
[テーブルのカラム構成] id(int型)、name(text型)



■ まずは手続き型でベタに書いて流れをつかむ
<?php

// mysqlに接続してデータベースハンドルをもらうと
$dbh= mysql_connect('localhost', 'myuser', 'mypass') or
    die("接続に失敗しました。" . mysql_error());


// 次にデータベース領域を指定する
mysql_select_db('mydb', $dbh) or
    die("mydbを指定できませんでした。" . mysql_error());


// その領域内にあるテーブルに対してクエリ(SQL文による問い合わせ)発行
$result= mysql_query("select * from mytab", $dbh) or
    die("クエリ失敗" . mysql_error());


// 結果を1レコードずつ順に配列にセット
while ($row=mysql_fetch_row($result)){
    echo "{$row[0]}: {$row[1]}<br />\n"; // 画面表示
}


mysql_close($dbh); // 最後に切断


?>



[結果表示]

1: fuji
2: taka
3: nasubi




■接続部分を構造化してみる
<?php
/*
* まとめられる部分を関数化してスッキリさせる
* 既にシンプルですが、「接続」と「データベース領域指定」はまとめられそう
*/
$dbh= mysql_conn() or die("接続に失敗しました。" . mysql_error());

$result= mysql_query("select * from mytab", $dbh); // エラーならfalse


while ($row=mysql_fetch_row($result)){ // データなければfalse
    echo "{$row[0]}: {$row[1]}<br />\n";
}


mysql_close($dbh); // 最後に切断



function mysql_conn()
{
    $dbh= mysql_connect('localhost', 'myuser', 'mypass');
    if ($dbh){
        if (mysql_select_db('mydb', $dbh)) return $dbh;
    }
    return null;
}


?>




■接続部分をオブジェクト指向で書いてみる
<?php

$obj= new mysql_conn;
$obj->dbh or die("接続に失敗しました。" . mysql_error());


$result= mysql_query("select * from mytab", $obj->dbh); // エラーならfalse


while ($row=mysql_fetch_row($result)){ // データなければfalse
    echo "{$row[0]}: {$row[1]}<br />\n";
}


mysql_close($obj->dbh); // 最後に切断



class mysql_conn
{
    var $dbh;
    function mysql_conn() // コンストラクタ
    {
        $this->dbh= mysql_connect('localhost', 'myuser', 'mypass');
        if ($this->dbh){
            if (!mysql_select_db('mydb', $this->dbh)) $this->dbh= null;
        }
    }
}


?>


シンプルな関数化よりもエラーチェックが複雑になってしまった。
これはコンストラクタからは直接「偽」を返せないから仕方ない




■接続部分をオブジェクト指向で書いてみる(パート2)
<?php
/*
* エラーチェックが複雑になる問題があったのでコンストラクタ内でエラーチェックを完結させる
*/
$obj= new mysql_conn;

$result= mysql_query("select * from mytab", $obj->dbh); // エラーならfalse


while ($row=mysql_fetch_row($result)){ // データなければfalse
    echo "{$row[0]}: {$row[1]}<br />\n";
}


mysql_close($obj->dbh); // 最後に切断



class mysql_conn
{
    var $dbh;
    function mysql_conn() // コンストラクタ
    {
        $this->dbh= mysql_connect('localhost', 'myuser', 'mypass');
        if (!($this->dbh && mysql_select_db('mydb', $this->dbh))){
            die("接続に失敗しました。" . mysql_error());
        }
    }
}


?>


接続部分は基本的に固定値なので、これもアリっちゃあアリかな


以上を見てみると、ベタに書いたほうがいちばんわかり易い感じではある。シンプルに記述できるようにと考えられた元々のmysql関数だから当然と言えば当然のこと


この規模ではベタに書いたほうがわかり易いことはわかったが、もしもトランザクション等をからめたもっと大掛かりなものだとオブジェクト指向でよりシンプルに書けそうな気はする。




■接続部分をオブジェクト指向で書いてみる(パート3)
<?php
/*
* 接続時に渡すパラメータは基本変わらないので基本固定値にしておいて、もし渡されてきたらそれを反映させることにする
*/
$obj= new mysql_conn;
//引数指定例
//$obj= new mysql_conn(array('user'=>'myuser', 'pass'=>'mypass'));

$result= mysql_query("select * from mytab", $obj->dbh); // エラーならfalse


while ($row=mysql_fetch_row($result)){ // データなければfalse
    echo "{$row[0]}: {$row[1]}<br />\n";
}


mysql_close($obj->dbh); // 最後に切断



class mysql_conn
{
    var $dbh;
    function mysql_conn($param=array()) // コンストラクタ
    {
        $host= empty($param['host']) ? 'localhost' : $param['host'];
        $user= empty($param['user']) ? 'myuser' : $param['user'];
        $pass= empty($param['pass']) ? 'mypass' : $param['pass'];
        $dbname= empty($param['dbname']) ? 'mydb' : $param['dbname'];


        $this->dbh= mysql_connect($host, $user, $pass);
        if (!($this->dbh && mysql_select_db($dbname, $this->dbh))){
            die("接続に失敗しました。" . mysql_error());
        }
    }
}


?>