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