Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
PHP レッスン

1. PHP の基礎
2. PHPの文法、条件式
3. PHPの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. 関数について
7. 関数について - 続き
8. 文字列操作関数
9. 配列操作関数
10. ファイル操作
11. ファイル操作 - 続き
12. パラメータの受け渡し
13. クッキーとセッション
14. 総合練習
15. メール送信
16. ファイルアップロード
17. クラスについて
18. クラスについて - 続き
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



19. MySQL

今日からいよいよデータベースの解説に入りたいと思います。

■データベースについて
顧客情報や商品データなど、WEBのシステムプログラムが扱うデータが膨大にある
場合、テキストのファイルに保存していると、開発も大変ですし、パフォーマンスも
落ち、何より保管状態に不安が残ります。

そこで、データベースという技術を使用します。データベースの基本機能は、
テーブルにデータを保管し、高速な検索ができることでしょう。

データベースの詳しい説明は省きますが、現在、よく使われているデータペースの
種類は、以下のものがあります。

・Oracle
  ライセンス費用が高いが、保証されている分、信頼性がある
・MS-SQL
  WINDOWS系のサーバでよく使用される
・PostgreSQL
  オープンソースなので、無料。高機能な検索ができる
・MySQL
  オープンソースなので、無料。処理が高速

OracleやMS-SQLなどは無料ではないので、大企業が相手でないとあまり使う機会が
ないと思います。ですので、レッスンではPostgreSQLとMySQLを取り扱おうと
思います。

■MySQLについて
先に扱いやすいMySQLから取り上げたいと思います。
MySQLは、複雑なSQL文は扱えませんが、処理が速く、PostgreSQLよりも扱いやすい
ので、初心者に向いています。

MySQLは、以下のページからダウンロードできます。
http://www.softagency.co.jp/MySQL/downloads/index.html

このレッスンは、Perlのレッスンですので、インストールや設定については、
ご紹介しません。マニュアル等を参照してください。

また、レンタルサーバを使用していて、レンタルサーバの方でMySQLがインストール
されていれば、それを使用することができます。

■MySQLへの接続
データベースを扱うには、まずデータベースへ接続するという作業が必要に
なります。

-----------------------------------------------------------------
//ホスト名
$db_host = "localhost";

//データベースユーザ
$db_user = "test_user";

//パスワード
$db_pass = "test_pass";

//データベース名
$db_name = "db_test";

//データベース接続
$dbh = mysql_connect($db_host, $db_user, $db_pass);

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

//データベース選択
if (!(mysql_select_db($db_name, $dbh)))
{
print("faild to select db");
exit;
}
-----------------------------------------------------------------

PHPの場合は、MySQLに接続するための関数が用意されているので、これを
利用します。

データベースに接続するには、必ずデータベース名、サーバ名、ユーザ名、
パスワードが必要になります。WEBサーバ内にデータベースがある場合は、
"localhost"を指定します。

サンプルの場合、"db_test"というデータベース名に、ユーザ名"test_user"、
パスワード "test_pass"で接続しています。

mysql_connect関数を使用して接続すると、データベースコネクションという
ハンドラが返ってきますので、これを使用してSQL文を渡して実行します。
失敗した場合は、Falseが返ってきます。

接続に成功した後、データベースを選択します。これには、mysql_select_db
関数を使用して、データベース名とデータベースコネクションを渡すだけ
です。

■テーブルの抽出
SQL文には、大きく分けて抽出と更新があります。

まずは、テーブルの内容を抽出するサンプルを記述します。

-----------------------------------------------------------------
// データベース読み込み
$sql = "select name, price from drink";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

//結果の取得
while ($arr = mysql_fetch_array($rs)) {
print $arr["name"] . ",";
print $arr["price"] . "\n";
}
-----------------------------------------------------------------

DRINKというテーブルに、例えば以下のようなレコードがあったとします。

NAME PRICE
Tea 250
Coffee 200

これを取り出したい場合は、SELECT文を書きます。
上記のサンプルのようにすると、中身が全て表示されます。

mysql_query()関数を使用して、SQL文を実行します。第二引数は、データベース
コネクションを渡します。mysql_queryの戻り値は、失敗するとFalseが返って
きます。

結果を取得するには、mysql_fetch_array関数を使用します。他にも取得する
関数はありますが、ここでは省略します。

mysql_fetch_arrayに、mysql_queryの結果を渡すと、SELECT文で取得できた
データがハッシュ配列で取得できます。1行ずつ取得し、全て取得すると、
nullが返りますますので、ループを抜けます。

■レコードの更新
新しくレコードを追加したり、既存のレコードを変更したり、削除することが
できます。

-----------------------------------------------------------------
// レコード追加
$sql = "insert into drink (name, price) values ('Beer', '500')";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

// レコード変更
$sql = "update drink set price = '230' where name = 'Coffee'";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

// レコード削除
$sql = "delete from drink where name = 'Tea'";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}
-----------------------------------------------------------------

テーブルに新しい行を追加するには、INSERT文を使用します。

サンプルの場合、DRINKテーブルに

NAME PRICE
Beer 500

を追加しています。

抽出の時と同様に、mysql_query関数を使用しています。
抽出と違うのは、更新処理なので、データの取得がないことです。

既存のデータを変更する場合は、UPDATE文を使用します。
処理方法は、INSERT文の時とまった同じです。

サンプルを実行すると、以下のようなテーブルになります。

NAME PRICE
Tea 250
Coffee 230
Beer 500

レコードの削除も同様の方法で行えます。

サンプルを実行すると、以下のようになります。

NAME PRICE
Coffee 230
Beer 500

■データベースの切断
データベースに接続したら、終わった時に必ずクローズするようにします。

PHPの場合は、クローズを忘れても、レスポンスがクライアントに返った時に
自動的にクローズされますが、安全のため、データベースクローズは行うように
してください。

-----------------------------------------------------------------
//データベース切断
mysql_close($dbh);
-----------------------------------------------------------------

mysql_close関数を読んで、データベースコネクションを渡すだけで、切断
されます。クローズ後は、データベースコネクションは使用できませんので、
注意してください。

 

★今日のまとめサンプルプログラム
-----------------------------------------------------------------
<HTML>
<BODY>

<?

//ホスト名
$db_host = "localhost";

//データベースユーザ
$db_user = "test_user";

//パスワード
$db_pass = "test_pass";

//データベース名
$db_name = "db_test";

//データベース接続
$dbh = mysql_connect($db_host, $db_user, $db_pass);

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

//データベース選択
if (!(mysql_select_db($db_name, $dbh)))
{
print("faild to select db");
exit;
}

// データベース読み込み
$sql = "select name, price from drink";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

//結果の取得
while ($arr = mysql_fetch_array($rs)) {
print $arr["name"] . ",";
print $arr["price"] . "<br>\n";
}

// レコード追加
$sql = "insert into drink (name, price) values ('Beer', '500')";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

// レコード変更
$sql = "update drink set price = '230' where name = 'Coffee'";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

// レコード削除
$sql = "delete from drink where name = 'Tea'";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

// 再度取得
$sql = "select name, price from drink";

if (!($rs = mysql_query($sql, $dbh)))
{
print("SQL Failed " . $sql);
exit;
}

//結果の取得
while ($arr = mysql_fetch_array($rs)) {
print $arr["name"] . ",";
print $arr["price"] . "<br>\n";
}

//データベース切断
mysql_close($dbh);

?>

</BODY>
</HTML>
-----------------------------------------------------------------

■解説
レッスンの中で使用したテーブルをそのまま使っています。

NAME PRICE
Tea 250
Coffee 200

サンプルを動かす場合は、上のテーブルを作成してください。
実行後は、

NAME PRICE
Coffee 230
Beer 500

というテーブルに更新されるはずです。

 

★課題
1. MySQLにて、以下のSQL文を実行してテーブルを作成した後、各処理を行う
プログラムを作成してください。

----------------------------------------------
create table product (
id int4 primary key,
name varchar(50),
stock int2,
comment varchar(255)
);

insert into product (
id,
name,
stock,
comment
) values (
1,
'ヘッドホン DK-A01',
52,
'高音質ヘッドホン'
);

insert into product (
id,
name,
stock,
comment
) values (
2,
'ヘッドホン CL-E22',
34,
'コードレスヘッドホン'
);

insert into product (
id,
name,
stock,
comment
) values (
3,
'ヘッドホンケーブル R03',
88,
'DK-A01用ケーブル'
);
----------------------------------------------

(1) 全てのレコードを抽出し、HTMLに表示してください。
(2) PHPプログラムにて、以下のデータを挿入してください。

ID NAME STOCK COMMENT
4 'ヘッドホン DKA-B02' 25 '小型ヘッドホン'

(3) ID = 2 のレコードのSTOCKを 31 に変更するプログラムを作成してください。
(4) ID = 3 のレコードを削除するプログラムを作成してください。

 

★前回の課題の解答
1. まとめサンプルを、以下の条件で改変してください。

(1) member_cというメンバ変数をparentクラスに追加し、初期値に現在日時
(yyyy/mm/dd hh:mm:ss)を格納してください。
(2) member_cを出力するprint_cを子クラスのchildクラスに追加してください。
(3) member_cに値を設定するset_cというメンバ関数を、親クラスparnetに追加して
ください。
(4) 現在日時(yyyy/mm/dd hh:mm:ss)をmember_cに設定するupdate_cという関数を、
子クラスchildに追加してください。

→下のサンプルを参照してください。
common.php
-----------------------------------------------------------------
<?

// 子クラス
class child extends parent {
// メンバ変数
var $member_b;

//--------------------------------------------------------
// 関数 : child
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function child() {
$this->parent();
$this->member_b = "Child member_b";
}

//------------------------------------------------------------------
// 関数 : print_a
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_a() {
print $this->member_a;
}

//------------------------------------------------------------------
// 関数 : print_b
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_b() {
print $this->member_b;
}

//------------------------------------------------------------------
// 関数 : print_c
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_c() {
print $this->member_c;
}

//------------------------------------------------------------------
// 関数 : update_c
// 概要 : メンバ変数の更新
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function update_c() {
$this->member_c = date("Y/m/d H:i:s");
}
}

//親クラス
class parent {
// メンバ変数
var $member_a;
var $member_c;

//--------------------------------------------------------
// 関数 : parent
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : なし
// 戻値 : なし
//--------------------------------------------------------
function parent() {
$this->member_a = "Parent member_a";
$this->member_c = date("Y/m/d H:i:s");
}

//------------------------------------------------------------------
// 関数 : set_a
// 概要 : メンバ変数の設定
// 引数 : member_aに設定する値
// 戻値 : なし
//------------------------------------------------------------------
function set_a($a) {
$this->member_a = $a;
}

//------------------------------------------------------------------
// 関数 : set_c
// 概要 : メンバ変数の設定
// 引数 : member_cに設定する値
// 戻値 : なし
//------------------------------------------------------------------
function set_c($c) {
$this->member_c = $c;
}

//------------------------------------------------------------------
// 関数 : get_a
// 概要 : メンバ変数の取得
// 引数 : なし
// 戻値 : member_a
//------------------------------------------------------------------
function get_a() {
return $this->member_a;
}
}

?>
-----------------------------------------------------------------

index.php
-----------------------------------------------------------------
<HTML>
<BODY>

<?

// クラスファイルの読み込み
require "common.php";

// クラスのオブジェクト化
$cmn =& new child();

// (1) member_cというメンバ変数をparentクラスに追加し、初期値に現在日時
// (yyyy/mm/dd hh:mm:ss)を格納してください。
print $cmn->member_c . "<br>\n";

// (2) member_cを出力するprint_cを子クラスのchildクラスに追加してください。
$cmn->print_c();
print "<br>\n";

// (3) member_cに値を設定するset_cというメンバ関数を、親クラスparnetに追加して
// ください。
$cmn->set_c("2005/3/1 00:00:00");
print $cmn->member_c . "<br>\n";

// (4) 現在日時(yyyy/mm/dd hh:mm:ss)をmember_cに設定するupdate_cという関数を、
// 子クラスchildに追加してください。
$cmn->update_c();
print $cmn->member_c . "<br>\n";

?>

</BODY>
</HTML>
-----------------------------------------------------------------

■解説
サンプルを使用して、問題をよく読んで、きちんとクラスに追加していって
ください。

最後のupdate_cは、現在時刻をそのままmember_cに格納すればOKです。

 




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから