アットウィキロゴ
Software Design Practice 2@ ウィキ
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

Software Design Practice 2@ ウィキ

Column

最終更新:

Bot(ページ名リンク)

- view
だれでも歓迎! 編集


コラム

テーブルの中身を表示する


 PHPを使ってMySQLのあるテーブルの内容を出力するというプログラムを書いてみたいと思います。
 データベースの仕様として、テーブル名はmember、キーは、id(主キー), name, passの3つとします。

 まず最初にデータベースにテーブルを作成します。以下のようなSQL文を入力します。
CREATE  TABLE IF NOT EXISTS `test`.`member` (
  `id` INT NOT NULL ,
  `name` VARCHAR(45) NOT NULL ,
  `pass` TEXT NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB

 次に、作成したテーブルにデータを挿入していくのですが、今回は試用ですので、直にSQL文で打ち込みます。
insert into member value(1, 'tester1', 'hogehoge1');
insert into member value(2, 'tester2', 'hogehoge2');
insert into member value(3, 'tester3', 'hogehoge3');
insert into member value(4, 'tester4', 'hogehoge4');
insert into member value(5, 'tester5', 'hogehoge5');

 テーブルにデータが挿入されているか確認をします。
mysql> select * from member;
+----+---------+-----------+
| id | name    | pass      |
+----+---------+-----------+
|  1 | tester1 | hogehoge1 |
|  2 | tester2 | hogehoge2 |
|  3 | tester3 | hogehoge3 |
|  4 | tester4 | hogehoge4 |
|  5 | tester5 | hogehoge5 |
+----+---------+-----------+
5 rows in set (0.00 sec) 

 これでMySQL側の作業は終了です。
 さて、今度はPHPでプログラムを書いていきたいと思います。
 内容の表示であるView部分はSmartyテンプレートを使用します。
 今回使用したテンプレート(ShowSqlInfo.tpl)の中身は以下になります。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<META http-equiv="Content-Style-Type" content="text/css">
<title>データベースの内容</title>
</head>
<body>

<h2>データベースの詳細</h2>
<table border="1">
	<tr>
		<td>id</td>
		<td>user</td>
		<td>pass</td>
	</tr>
	{* データの挿入 *}
	{foreach from=$data key="key" item="value" name="list"}
	<tr>
		<td>{$value->GetId()}</td>
		<td>{$value->GetUserName()}</td>
		<td>{$value->GetPass()}</td>
	</tr>
	{foreachelse} {/foreach}
	
</table>
</body>
</html>

 最後に、PHPにおける処理部分ですが、データベースの内容を示すクラスを一つ定義しました。
 あとは、PHPでやった内容と変わらず、while文ですべての内容を取得しています。
<?php
// MySqlの内容を表示するphp

require_once "MDB2.php" ;
require_once "DBInfo.php";
require_once "Smarty/smarty.class.php";

// Smartyオブジェクトの生成
function CreateSmartyObj()
{
	$smarty = new Smarty();

	// パスの設定
	$smarty->template_dir = "template"; // テンプレートディレクトリのパス
	$smarty->compile_dir = "compile"; 	// コンパイルディレクトリのパス

	return $smarty;
}

// データベースへ接続
$mdb2 = MDB2::connect( "mysqli://ユーザ名:パスワード@ホスト/member" );

// エラー処理
if(PEAR::isError($mdb2))
{
   die($mdb2->getMessage());
}

// クエリ実行
$sql = "select * from member";
$res =& $mdb2->query($sql);

// エラー処理
if(PEAR::isError($res))
{
   die($res->getMessage());
}

$ary = array();

while( ( $row = $res->fetchRow() ) )
{
	$tmp = new CDBInfo();
	
	$tmp->SetId($row->id);
	$tmp->SetUserName($row->name);
	$tmp->SetPass($row->pass);
	
	array_push($ary, $tmp);
}
// データベースへの接続を切る
$mdb2->disconnect(); 

$smarty = CreateSmartyObj();
$smarty->assign("data", $ary);
$smarty->display("ShowSqlInfo.tpl");

?>

 DBInfo.php
<?php

class CDBInfo
{
	protected $m_Id;		// ユーザid
	protected $m_Name;		// ユーザ名
	protected $m_Pass;		// パスワード
	
	function __construct()
	{
		$m_Id = 0;
		$m_Name = NULL;
		$m_Pass = NULL;
	}	
	
	public function SetId($id)
	{
		$this->m_Id = $id;
	}
	
	public function GetId()
	{
		return $this->m_Id;
	}
	
	public function SetUserName($name)
	{
		$this->m_Name = $name;
	}
	
	public function GetUserName()
	{
		return $this->m_Name;
	}

	public function SetPass($pass)
	{
		$this->m_Pass = $pass;
	}
	
	public function GetPass()
	{
		return $this->m_Pass;
	}
}
?>

データベースクラスを作ってみる


 PEARのMDB2ライブラリを用いたデータベースを扱う簡易クラスを作ってみたいと思います。
 いちいち、エラーチェックや決まった変数を毎度作成するのは面倒というものです。
 こういった使用するものが決まったものの集まりをクラスにしてしまいましょう。

 毎回出てくる変数としては、データベースに接続する変数($mdb2、$db等)と、クエリの結果を受け取る変数($res等)をクラス内に定義してしまいましょう。
class DBAccess
{
	protected $m_Db;	// データベース接続変数
	protected $m_Result;	// クエリ用変数
}

 protectedすることでクラスのメンバ変数は外部からアクセスできないようになっています。(継承先は除く)

接続の手間を省く


 まず、ログインする関数を作りましょう。
 定数として以下のものを用意します。
const m_Sql 	= "mysqli";	// 使用するSQL
const m_User 	= "ユーザ名";	// ユーザ名
const m_Pass 	= "パスワード";	// パスワード
const m_Host 	= "localhost";	// ホスト名
const m_DbName 	= "DB名";	// データベース名
const m_TblName	= "テーブル名";	// テーブル名

 クラス内の定数にはself::m_Sqlのようにself::を用いアクセスします。
 では、コネクト関数を実装します。
// データベース接続
public function Connect()
{
	// 接続文字列を作成
	$str = sprintf("%s://%s:%s@%s/%s", 
		self::m_Sql, self::m_User, self::m_Pass, self::m_Host,  self::m_DbName);

	// 接続処理
	$this->m_Db =& MDB2::connect($str);
	
	// エラー処理
	if( PEAR::isError( $this->m_Db ) ) 
	{
		exit("以下の接続が失敗しました<br>" .$str);	
	}
}

 このコネクト関数をコンストラクタで呼び出してやれば、クラスを生成するだけで接続でき便利です。
// コンストラクタ
function __construct()
{
	// メンバ変数の初期化
	$this->m_Db = NULL;
	$this->m_Result = NULL;
	
	// 接続
	$this->Connect();
}

切断の処理も省く


 上記の接続と同様ですので、プログラムのみ示します。
// データベース切断
public function DisConnect()
{
	$this->m_Db->disconnect();
}

// デストラクタ
function __destruct()
{
	if($this->m_Db != NULL)
	{
		$this->DisConnect();
	}
}

使用する処理を実装する


 最低限ということで、クエリを実行する関数(Query)、レコードを取得する関数(FetchRow)、クエリ結果のレコード数を取得する関数(numRow)を用意しました。
 実装は非常に簡単です。今までやってきたことをクラス内に内包しているだけです。
// レコードを取得し返す
public function FetchRow()
{
	$this->Error();
	return $this->m_Result->fetchRow(MDB2_FETCHMODE_OBJECT);
}
// クエリ結果のレコード数を返す
public function numRows()
{
	$this->Error();
	return $this->m_Result->numRows();
}
// クエリ実行
public function Query($sql)
{
	// クエリの実行し結果を取得
	$this->m_Result =& $this->m_Db->query($sql);
	
	// エラー処理
	if( PEAR::isError($this->m_Result) )
	{
		exit("以下のクエリが失敗しました<br>" .$sql);
	}
}

 今回作成したプログラムは以下になります。
 DBAccess.php

タグ:

+ タグ編集
  • タグ:
添付ファイル
記事メニュー
最近更新されたスレッド
ウィキ募集バナー