情報科学III

平成20年度 情報科学III (理系コア科目・2年生)
09 06/23 PHP と SQL
(MySQL) の連携 その2
担当 岡村耕二
月曜日 2限
http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
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について知っておくと役立つこと(つづき)
 MySQLにアクセスするPHPプログラムの改良(つづき)
5
PHPとMySQLについて
知っておくと役立つこと(つづき)
前回の「豆知識?」を改題
6
前回の作業課題
 自分のデータベースにアクセスして,テーブルのレコードをす
べてブラウザに表示させるようなPHPプログラム
①接続
②文字コード設定
③DB選択
PHPプログラム
MySQL DBMS
④クエリ実行
⑤検索結果の処理
⑥切断
DB
配付資料では,文字コード設定が抜けていた
7
実際のデータベースでは…
 ブラウザ経由でやりたい仕事は,データの一覧表示だけではな
い.
– 与えられた条件に合致するデータの検索
– 新規データの登録
– 登録済みデータの修正
– 不要データの削除
:
 これらが,それぞれ別のプログラムになるのは,まぁしかたがな
い.
 しかし,1つの作業が済んだら,すぐに同じ名簿で別の作業を
始めたくなるかも知れない.
8
プログラムがいっぱいあると…
 やりたい処理のプログラムのURLを毎回直接指定する?
「ファイル」メ
ニューの「開く」を
クリック
PHPプロ
=(URL1)
グラム1
PHPプロ
=(URL2)
グラム2
そんな
面倒な!
PHPプロ
=(URL n)
グラム n
9
そういうときは…
 最初のメニュー画面のURLだけを指定して,あとは,そこからク
リックできるようにしたい.
URLを指定して
「開く」
ここから先は
クリックだけ
作業1
作業2
PHPプロ
グラム1
PHPプロ
グラム2
MySQL DBMS
作業 n
DB
PHPプロ
グラム n
10
どのプログラムでも毎回同じになる部分がある
 MySQL に接続してから,データベースを選択するまで
 MySQL から切断するところ
①接続
②文字コード設定
③DB選択
PHPプログラム
MySQL DBMS
④クエリ実行
⑤検索結果の処理
⑥切断
DB
 切断はPHPの文1行だけなのであまり問題がない.
 NySQLに接続するところから,データベースを選択するところま
では,パスワードやDB名を変更したりすると,書き換えが面倒.
11
共通の部分を1つのファイルにまとめる
 各プログラムに,そのファイルを読み込んで実行する.
PHPプロ
グラム1
PHPプロ
グラム2
共通
部分
パスワードなどを変更
した場合は,ここだけ
修正すれば済む.
PHPプロ
グラム n
12
PHPでは…
 require 文
– PHPプログラムのその場所に,指定したファイルを読み込ん
でそのまま実行させる.
– ファイルが存在しない場合には,そこでエラーとなる.
<?php
require ( 'ファイル名' );
PHPプログラム
?>
(include 文もほぼ同じ効果を持つ
が,include 文は,ファイルが見つ
からなくてもエラーにならない)
require 文の1行がまる
まるこのプログラムで置き
換わるイメージ
13
しかも…
 読み込まれるファイルの拡張子は,.php でなくてよい.
– むしろ,dbconnect.inc などのように,わざと .php でな
い拡張子にするのがよい.
dbconnect.inc
<?php
require ( 'ファイル名' );
PHPプログラム
?>
– web サーバの設定により,dbconnect.inc を直接URLで
指定してもアクセスできないようにコントロールできるから.
14
PHP + MySQL のシステム構成例(1)
メインメニュー
<form>タグが HTML
あるかもしれな ファイル
い
PHPプロ
グラム1
PHPプロ
グラム2
PHPプロ
グラム2a
これはきっと<form>
タグを含んでいる.
PHPプロ
グラム n
共通
部分
15
PHP + MySQL のシステム構成例(2)
PHPプロ
グラム1
「終了」を
クリック
HTML
ファイル
PHPプロ
グラム2
PHPプロ
グラム2a
HTML
ファイル
「お疲れ様
でした.」
PHPプロ
グラム n
共通
部分
16
さらに…
 これらのファイルは,すべて,同じディレクトリ(フォルダ)にまと
めておくとよい.
[te999999@bossp ~]$ cd public_html
[te999999@bossp public_html]$ cd address_book
[te999999@bossp 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@bossp address_book]$
住
所
録
関
連
の
フ
ァ
イ
ル
17
今日の作業(1)
 前回作った(作りかけの)プログラムが public_html 直下に
ある場合は:
– bossp にログインして,public_html の下に新しいディレ
クトリを作る
mkdir 新ディレクトリ名
(mkdir コマンド)
– 前回のプログラムを,その新しいディレクトリに移動させる
(mv コマンド)
mv ファイル名 移動先ディレクトリ
• PC側にファイルが残っていることが確認できたら,ファイ
ルを削除する(rm コマンド)だけでもよい(要確認!).
rm ファイル名
18
今日の作業(2)
 PC側での作業
– 前回のプログラムから,MySQLへの接続とDBの選択の部分を切り出し
て,別のファイル(共通部分のファイル)に保存する.
• 今日のところは,ファイル名の拡張子は「.php 」にしておく.
• この理由は,次回説明する.
– 前回のプログラムの上記の部分は,require 文で置き換える.
– メインメニューのHTMLファイルを作り,そこからクリックだけで前回のプ
ログラムに飛べるようにする.
• 他の作業をするためのPHPプログラムを作る必要はないが,他にど
んなメニュー項目が必要か,考えて作っておくとよい.
• 逆に,プログラムを実行し終わったら,どうやってメインメニューに
戻ったらよいか?
 できあがったファイル群を,bossp 上で先ほど作ったディレクトリに転送する.
19
そこまで終われば…
 ここまでできていることになる.
メインメニュー
PHPプロ
グラム1
HTML
ファイル
PHPプロ
グラム2
PHPプロ
グラム2a
PHPプロ
グラム n
共通
部分
20
練習問題: まずSQLコマンドで、次にプログラムで
 Projection をやってみよう。
SELECT [ALL | DISTINCT]
SELECT項目リスト
FROM
テーブル名1[, テーブル名
2, ...]
[ JOIN 結合条件 ]
[ WHERE
検索条件 ]
 Join をやってみよう。
SELECT [ALL | DISTINCT]
SELECT項目リスト
FROM
テーブル名1[, テーブル名
2, ...]
[ JOIN 結合条件 ]
[ WHERE
検索条件 ]
21
演習問題
 テーブルのカラムとして
– 商品名
– 価格
– 色
– 重さ
を、用意し、「商品名」で検索し、「色」「重さ」はオプションで表示できるようなプログラ
ムを作成せよ。
 テーブルのカラムとして
– テーブル1
• 商品名
• 価格
– テーブル2
• 商品名
• 色
– テーブル3
• 商品名
• 重さ
を用意して、「商品名」で検索して、「価格」「色」「重さ」が表示されるプログラムを作
成せよ。
22