情報科学III

平成23年度前期 情報科学III (理系コア科目)
PHP と SQL (MySQL) の連携
その2
担当松永裕介
月曜日 2限
http://www.c.csce.kyushu-u.ac.jp/~matsunaga/lecture/php/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
1
以前の講義資料をもとにしています。
前回のおさらい(1)
 主な MySQL 関数
– MySQL との通信
• mysql_connect():MySQLへの接続
• mysql_query():コマンドまたはSQL文の実行
• mysql_select_db():データベースの切り替え
• mysql_close():MySQLからの切断
– MySQL から受け取った検索結果の操作
• mysql_fetch_array():検索結果から1行読み出す
• mysql_data_seek():読み出す位置を変更する
• mysql_num_rows():検索結果の行数を求める
2
前回のおさらい(2)
 PHP 4.x から MySQL 4.x を利用する際の標準的な作業手順
① MySQLサーバへの接続
• PHP の mysql_connect() 関数
② 通信に使用する文字コードの設定
• PHP の mysql_query() 関数
+ MySQL の SET CHARACTER SET 文
③ データベースの選択
• PHP の mysql_select_db() 関数
④ データベースの操作
• PHP の mysql_query() 関数
+ MySQL の SELECT/INSERT/UPPDATE/DELETE 文
• この④は繰り返してもよい.DBを切り替えるときは,③に戻る.
⑤ MySQLサーバからの切断
• PHP の mysql_close() 関数
3
前回のおさらい(3)
$results =mysql_query($query, $link);
$row = mysql_fetch_array($results, MYSQL_ASSOC);
mysql_fetch_array()
mysql_query()
$results
MySQL DB
$row
現在の
読み出し
位置
mysql_fetch_array() 関数は,
$results の中に行が残っている限り,
何度でも呼び出せる.
呼び出されるたびに,「現在の読み出し位
置」が1レコード分だけ下に移動する.
配付資料では,図
の部品に一部欠損
があった.
4
PHPとMySQLについて
知っておくと役立つこと(つづき)
前回の「豆知識?」を改題
5
前回の作業課題
 自分のデータベースにアクセスして,テーブルのレコードをす
べてブラウザに表示させるようなPHPプログラム
①接続
②文字コード設定
③DB選択
PHPプログラム
MySQL DBMS
④クエリ実行
⑤検索結果の処理
⑥切断
DB
配付資料では,文字コード設定が抜けていた
6
実際のデータベースでは…
 ブラウザ経由でやりたい仕事は,データの一覧表示だけではな
い.
– 与えられた条件に合致するデータの検索
– 新規データの登録
– 登録済みデータの修正
– 不要データの削除
:
 これらが,それぞれ別のプログラムになるのは,まぁしかたがな
い.
 しかし,1つの作業が済んだら,すぐに同じ名簿で別の作業を
始めたくなるかも知れない.
7
プログラムがいっぱいあると…
 やりたい処理のプログラムのURLを毎回直接指定する?
「ファイル」メ
ニューの「開く」を
クリック
PHPプロ
=(URL1)
グラム1
PHPプロ
=(URL2)
グラム2
そんな
面倒な!
PHPプロ
=(URL n)
グラム n
8
そういうときは…
 最初のメニュー画面のURLだけを指定して,あとは,そこからク
リックできるようにしたい.
URLを指定して
「開く」
ここから先は
クリックだけ
作業1
作業2
PHPプロ
グラム1
PHPプロ
グラム2
MySQL DBMS
作業 n
DB
PHPプロ
グラム n
9
どのプログラムでも毎回同じになる部分がある
 MySQL に接続してから,データベースを選択するまで
 MySQL から切断するところ
①接続
②文字コード設定
③DB選択
PHPプログラム
MySQL DBMS
④クエリ実行
⑤検索結果の処理
⑥切断
DB
 切断はPHPの文1行だけなのであまり問題がない.
 NySQLに接続するところから,データベースを選択するところま
では,パスワードやDB名を変更したりすると,書き換えが面倒.
10
共通の部分を1つのファイルにまとめる
 各プログラムに,そのファイルを読み込んで実行する.
PHPプロ
グラム1
PHPプロ
グラム2
共通
部分
パスワードなどを変更
した場合は,ここだけ
修正すれば済む.
PHPプロ
グラム n
11
PHPでは…
 require 文
– PHPプログラムのその場所に,指定したファイルを読み込ん
でそのまま実行させる.
– ファイルが存在しない場合には,そこでエラーとなる.
<?php
require ( 'ファイル名' );
PHPプログラム
?>
(include 文もほぼ同じ効果を持つ
が,include 文は,ファイルが見つ
からなくてもエラーにならない)
require 文の1行がまる
まるこのプログラムで置き
換わるイメージ
12
しかも…
 読み込まれるファイルの拡張子は,.php でなくてよい.
– むしろ,dbconnect.inc などのように,わざと .php でな
い拡張子にするのがよい.
dbconnect.inc
<?php
require ( 'ファイル名' );
PHPプログラム
?>
– web サーバの設定により,dbconnect.inc を直接URLで
指定してもアクセスできないようにコントロールできるから.
13
PHP + MySQL のシステム構成例(1)
メインメニュー
<form>タグが HTML
あるかもしれな ファイル
い
PHPプロ
グラム1
PHPプロ
グラム2
PHPプロ
グラム2a
これはきっと<form>
タグを含んでいる.
PHPプロ
グラム n
共通
部分
14
PHP + MySQL のシステム構成例(2)
PHPプロ
グラム1
「終了」を
クリック
HTML
ファイル
PHPプロ
グラム2
PHPプロ
グラム2a
HTML
ファイル
「お疲れ様
でした.」
PHPプロ
グラム n
共通
部分
15
さらに…
 これらのファイルは,すべて,同じディレクトリ(フォルダ)にまと
めておくとよい.
[te999999@rupus ~]$ cd public_html
[te999999@rupus public_html]$ cd address_book
[te999999@rupus address_book]$ ls -l
合計 20
-rw-r--r-- 1 te999999 ... 6月 12 22:47 dbconnect.inc
-rw-r--r-- 1 te999999 ... 6月 12 22:47 end.html
-rw-r--r-- 1 te999999 ... 6月 12 22:46 prog1.php
-rw-r--r-- 1 te999999 ... 6月 12 22:46 prog2.php
-rw-r--r-- 1 te999999 ... 6月 12 22:46 prog3.php
:
-rw-r--r-- 1 te999999 ... 6月 12 23:04 start.html
[te999999@rupus address_book]$
住
所
録
関
連
の
フ
ァ
イ
ル
16
今日の作業(1)
 前回作った(作りかけの)プログラムが public_html 直下に
ある場合は:
– rupus にログインして,public_html の下に新しいディレ
クトリを作る
mkdir 新ディレクトリ名
(mkdir コマンド)
– 前回のプログラムを,その新しいディレクトリに移動させる
(mv コマンド)
mv ファイル名 移動先ディレクトリ
• PC側にファイルが残っていることが確認できたら,ファイ
ルを削除する(rm コマンド)だけでもよい(要確認!).
rm ファイル名
17
今日の作業(2)
 PC側での作業
– 前回のプログラムから,MySQLへの接続とDBの選択の部分を切り出し
て,別のファイル(共通部分のファイル)に保存する.
• 今日のところは,ファイル名の拡張子は「.php 」にしておく.
• この理由は,次回説明する.
– 前回のプログラムの上記の部分は,require 文で置き換える.
– メインメニューのHTMLファイルを作り,そこからクリックだけで前回のプ
ログラムに飛べるようにする.
• 他の作業をするためのPHPプログラムを作る必要はないが,他にど
んなメニュー項目が必要か,考えて作っておくとよい.
• 逆に,プログラムを実行し終わったら,どうやってメインメニューに
戻ったらよいか?
 できあがったファイル群を,rupus 上で先ほど作ったディレクトリに転送する.
18
そこまで終われば…
 ここまでできていることになる.
メインメニュー
PHPプロ
グラム1
HTML
ファイル
PHPプロ
グラム2
PHPプロ
グラム2a
PHPプロ
グラム n
共通
部分
19
練習問題: まずSQLコマンドで、次にプログラムで
 Projection をやってみよう。
SELECT [ALL | DISTINCT]
SELECT項目リスト
FROM
テーブル名1[, テーブル名
2, ...]
[ JOIN 結合条件 ]
[ WHERE
検索条件 ]
 Join をやってみよう。
SELECT [ALL | DISTINCT]
SELECT項目リスト
FROM
テーブル名1[, テーブル名
2, ...]
[ JOIN 結合条件 ]
[ WHERE
検索条件 ]
20
練習 DB jk2009 で以下の SQL を実行してみよ。
select * from table table09062900;
Select * from table09062900 where vendor="nokia";
Select * from table table090629index;
Select * from table table090629n;
Select * from table table090629sa;
Select * from table table090629so;
Select * from table090629index join table090629n ;
Select * from table090629index join table090629n on
table090629index.type=table090629n.type;
 Select * from table090629index join table090629n on
table090629index.type=table090629n.type where
vendor="nokia";
 select table090629index.vendor,
table090629index.type, table090629n.name,
table090629n.price from table090629index join
table090629n on
table090629index.type=table090629n.type where
vendor="nokia";








21
table09062900
+--------------+-----------+------+--------+
| vendor
| type
| name | price |
+--------------+-----------+------+--------+
| nokia
| cellphone | N97 | 100000 |
| nokia
| cellphone | N78 | 60000 |
| nokia
| cellphone | E71 | 60000 |
| nokia
| cellphone | E63 | 30000 |
| nokia
| bluetooth | BT00 | 10000 |
| nokia
| bluetooth | BT01 | 12000 |
| samsung
| cellphone | SS00 | 50000 |
| nokia
| cable
| CA00 |
1000 |
| nokia
| cable
| CA01 |
2000 |
| samsung
| cellphone | SS10 | 60000 |
| samsung
| bluetooth | BT00 |
5000 |
| samsung
| bluetooth | BT10 |
7000 |
| sonyericsson | cellphone | X1
| 80000 |
| sonyericsson | bluetooth | BT10 | 10000 |
+--------------+-----------+------+--------+
22
select * from table09062900 where vendor="nokia";
+--------+-----------+------+--------+
| vendor | type
| name | price |
+--------+-----------+------+--------+
| nokia | cellphone | N97 | 100000 |
| nokia | cellphone | N78 | 60000 |
| nokia | cellphone | E71 | 60000 |
| nokia | cellphone | E63 | 30000 |
| nokia | bluetooth | BT00 | 10000 |
| nokia | bluetooth | BT01 | 12000 |
| nokia | cable
| CA00 |
1000 |
| nokia | cable
| CA01 |
2000 |
+--------+-----------+------+--------+
23
taable090629index,n,sa,so
+--------------+-----------+
| vendor
| type
|
+--------------+-----------+
| nokia
| cellphone |
| nokia
| bluetooth |
| nokia
| cable
|
| samsung
| cellphone |
| samsung
| bluetooth |
| sonyericsson | cellphone |
| sonyericsson | bluetooth |
+--------------+-----------+
+-----------+------+-------+
| type
| name | price |
+-----------+------+-------+
| cellphone | SS00 | 50000 |
| cellphone | SS10 | 60000 |
| bluetooth | BT00 | 5000 |
| bluetooth | BT10 | 7000 |
+-----------+------+-------+
+-----------+------+--------+
| type
| name | price |
+-----------+------+--------+
| cellphone | N97 | 100000 |
| cellphone | N78 | 60000 |
| cellphone | E71 | 60000 |
| cellphone | E63 | 30000 |
| bluetooth | BT01 | 12000 |
| cable
| CA00 |
1000 |
| cable
| CA01 |
2000 |
| bluetooth | BT00 | 10000 |
+-----------+------+--------+
+-----------+------+-------+
| type
| name | price |
+-----------+------+-------+
| cellphone | X1
| 80000 |
| bluetooth | BT10 | 10000 |
+-----------+------+-------+
24
select * from table090629index join table090629n on
table090629index.type=table090629n.type;
+--------------+-----------+-----------+------+--------+
| vendor
| type
| type
| name | price |
+--------------+-----------+-----------+------+--------+
| nokia
| cellphone | cellphone | N97 | 100000 |
| samsung
| cellphone | cellphone | N97 | 100000 |
| sonyericsson | cellphone | cellphone | N97 | 100000 |
| nokia
| cellphone | cellphone | N78 | 60000 |
| samsung
| cellphone | cellphone | N78 | 60000 |
| sonyericsson | cellphone | cellphone | N78 | 60000 |
| nokia
| cellphone | cellphone | E71 | 60000 | table090629n
table090629index
| samsung
| cellphone | cellphone | E71 | 60000 |
| sonyericsson | cellphone | cellphone | E71 | 60000 |
table090629index.type=table090629n.type
| nokia
| cellphone | cellphone
| E63 | 30000 |
| samsung
| cellphone | cellphone | E63 | 30000 |
| sonyericsson | cellphone | cellphone | E63 | 30000 |
| nokia
| bluetooth | bluetooth | BT01 | 12000 |
| samsung
| bluetooth | bluetooth | BT01 | 12000 |
| sonyericsson | bluetooth | bluetooth | BT01 | 12000 |
| nokia
| cable
| cable
| CA00 |
1000 |
| nokia
| cable
| cable
| CA01 |
2000 |
| nokia
| bluetooth | bluetooth | BT00 | 10000 |
| samsung
| bluetooth | bluetooth | BT00 | 10000 |
| sonyericsson | bluetooth | bluetooth | BT00 | 10000 |
+--------------+-----------+-----------+------+--------+
25
select * from table090629index join table090629n on
table090629index.type=table090629n.type where vendor="nokia“;
+--------+-----------+-----------+------+--------+
| vendor | type
| type
| name | price |
+--------+-----------+-----------+------+--------+
| nokia | cellphone | cellphone | N97 | 100000 |
| nokia | cellphone | cellphone | N78 | 60000 |
| nokia | cellphone | cellphone | E71 | 60000 |
| nokia | cellphone | cellphone | E63 | 30000 |
| nokia | bluetooth | bluetooth | BT01 | 12000 |
| nokia | cable
| cable
| CA00 |
1000 |
| nokia | cable
| cable
| CA01 |
2000 |
| nokia | bluetooth | bluetooth | BT00 | 10000 |
+--------+-----------+-----------+------+--------+
26
select table090629index.vendor, table090629index.type,
table090629n.name, table090629n.price from table090629index join
table090629n on table090629index.type=table090629n.type where
vendor="nokia";
+--------+-----------+------+--------+
| vendor | type
| name | price |
+--------+-----------+------+--------+
| nokia | cellphone | N97 | 100000 |
| nokia | cellphone | N78 | 60000 |
| nokia | cellphone | E71 | 60000 |
| nokia | cellphone | E63 | 30000 |
| nokia | bluetooth | BT01 | 12000 |
| nokia | cable
| CA00 |
1000 |
| nokia | cable
| CA01 |
2000 |
| nokia | bluetooth | BT00 | 10000 |
+--------+-----------+------+--------+
27
演習問題
 テーブルのカラムとして
– 商品名
– 価格
– 色
– 重さ
を、用意し、「商品名」で検索し、「色」「重さ」はオプションで表示できるようなプログラ
ムを作成せよ。
 テーブルのカラムとして
– テーブル1
• 商品名
• 価格
– テーブル2
• 商品名
• 色
– テーブル3
• 商品名
• 重さ
を用意して、「商品名」で検索して、「価格」「色」「重さ」が表示されるプログラムを作
成せよ。
28