gorinphp0729

73
AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 技能五輪 若年者ものづくり競技大会 出場者向け 第一回 PHPセミナー 資料 講師 資料作成: サポート: 初版 第四版 AW技能五輪 第一回 PHPセミナー 資料 塚田 朗弘 電設部技能五輪プロジェクト 電設部技能五輪プロジェクト 2009年07月29日 2009年08月05日

Upload: akitsukada

Post on 24-May-2015

346 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 技能五輪 若年者ものづくり競技大会 出場者向け 第一回 PHPセミナー 資料

講師  :資料作成:サポート:初版  :第四版 :

 AW技能五輪 第一回 PHPセミナー 資料

塚田 朗弘電設部技能五輪プロジェクト電設部技能五輪プロジェクト2009年07月29日2009年08月05日

Page 2: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

名前 : 塚田 朗弘(つかだ あきひろ)  学科 : 高度情報処理科(07JZ)

所属 : 電設部(IT勉強会PJTリーダ)

ID   : atcorp(はてな・ついったー) その他 : http://tinyurl.com/atcorp-at-it         ↑いますぐクリック!

 講師紹介

Page 3: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 も く じ

2.データベース(mysql)の操作

2-1. データベースって何だろう2-2. データベースをイメージしよう2-3. 対五輪必須DBテクニック2-4. 実習環境の準備2-5. データの登録2-6. データの検索2-7. データの更新2-8. データの削除2-9. ここまでのまとめ2-10. PHP de SQL2-11. DBに接続・切断する2-12. SQL実行の基本的な流れ2-13. 文字セット設定2-14. SQL実行と結果セット2-15. 演習問題をやってみよう2-16. 演習問題こたえあわせ2-17. データベースの操作 まとめ2-18. おわりに

171821222531394347484952535662657172

1.配列の操作

1-1. "配列"ってなんだろう1-2. "配列"をイメージしよう1-3. こんなときによく使う1-4. 演習課題をやってみよう1-5. 演習課題こたえあわせ1-6. 配列の操作 まとめ

569

101114

Page 4: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 1. 配列の操作

第一部配列の操作

Page 5: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

◆配列は、変数(頭に$がつくもの)の仲間。 変数と配列の違いは・・・  ・変数は    一つの変数の中で一つの値  ・配列は

    一つの配列の中で複数の値                     を扱う!

 1-1. "配列"って何だろう 1. 配列の操作

Page 6: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

◆ まず、単なる変数 は 「ハコ」 です

<?php   $medal = "金メダル";   print $medal; ?>

※C:\xampp\htdocs\gorinphp\seminar02\ の中に作ってください。 その後、ブラウザで http://localhost/gorinphp/seminar02/sample1_2_1.php にアクセスすると動作確認できます。

 1-2. "配列"をイメージしよう(1) 1. 配列の操作

sample1_2_1.php ※ 変数$medalには、一度に一つの値だけが入る。

Page 7: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

◆ 対して、配列は 「仕切られたハコ」です

配列の[ ]内の数字を、「添え字」とか「インデックス」と言います。

 1-2. "配列"をイメージしよう(2) 1. 配列の操作

<?php  $medals[0]="金メダル";$medals[1]="銀メダル";$medals[2]="銅メダル";

print $medals[0];

?>

sample1_2_2.php 数字で仕切られたそれぞれに、値を入れておける。

Page 8: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 1-2. "配列"をイメージしよう(3) 1. 配列の操作

◆ 「添え字」は数字じゃなくてもOK!

<?php    $medals["gold"]="金";  $medals["silver"]="銀";  $medals["bronze"]="銅";    print $medals["gold"];  ?>

sample1_2_3.php

「文字列を添え字にした配列」 を 連想配列 と言います。「gold?あ、金ね。金。」って、連想してるっぽいでしょう?

”gold”などの文字列が添え字。

Page 9: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

配列は、多くの値を中に入れて、順番に使っていく「繰り返し処理」が大得意です。

◆ たくさんあるデータに片っ端からアクセス

 1-3. こんなときによく使う 1. 配列の操作

学生DB

0 1 2 3 4 5 ・・・

DBから学生のデータを取得し、配列に入れる

配列の中身を片っ端から <tr> <td> ***** </td> <td> ***** </td> <td> ***** </td> </tr>これに入れていく(繰り返し処理)

・・・

例)・クラス内の学生全員を一覧表示する。

Page 10: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

配列 $aw[] の、添え字 0 から順番に、右のデータを入れるプログラムを書いてください。その中から自分の名前を取り出して表示してみましょう。   表示方法のヒント) print $aw[??]; 時間に余裕がある人は、自分以外の名前を表示するなど、遊んでみてください。

添え字 値

0 織田信永

1 野比のび犬

2 鈴木一浪

3 自分の氏名

4 骨川スネ夫

添え字 値

織田 信永

野比 のび犬

鈴木 一浪

自分の姓 自分の名

骨川 スネ夫

 1-4. 演習課題をやってみよう 1. 配列の操作

ex1_4_1.php

ex1_4_2.php

配列 $aw[] に、姓を添え字、名を値として右に示すデータを入れて、その中から色々な人の名前を取り出して表示してみましょう。

Page 11: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 

 1-5. 演習課題こたえあわせ 1. 配列の操作

ex1_4_1.php ex1_4_2.php

Page 12: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 

 1-5. 演習課題こたえあわせ 1. 配列の操作

ex1_4_1.php

<?php

$aw[0] = "織田信永";$aw[1] = "野比のび太";$aw[2] = "鈴木一浪";$aw[3] = "電子太郎";$aw[4] = "骨川スネ夫";

print $aw[3];

?>

ex1_4_2.php

Page 13: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 

 1-5. 演習課題こたえあわせ 1. 配列の操作

ex1_4_1.php

<?php

$aw[0] = "織田信永";$aw[1] = "野比のび太";$aw[2] = "鈴木一浪";$aw[3] = "電子太郎";$aw[4] = "骨川スネ夫";

print $aw[3];

?>

ex1_4_2.php

<?php

$aw["織田"] = "信永";$aw["野比"] = "のび太";$aw["鈴木"] = "一浪";$aw["電子"] = "太郎";$aw["骨川"] = "スネ夫";

print $aw["電子"];

?>

Page 14: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

→変数は「ハコ」、   配列は「区切られたハコ」

 1-6. 配列の操作 まとめ 1. 配列の操作

◆配列一個で、複数の値を扱える!

◆添え字は数字でも文字列でもOK!

◆例えばこんなときに使います。

→文字列の添え字 = 連想配列

→データベースから取得したデータに、  片っ端からアクセスして表示したり   計算したりするとき!

Page 15: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 1. 配列の操作

第一部配列の操作

Page 16: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2. データベース(mysql)の操作

第二部データベース

(MySQL)の操作

Page 17: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-1. データベースって何だろう 2. データベース(mysql)の操作

◆ 「膨大なデータを素早く安全に扱うソフト」

1)RDB(リレーショナルデータベース)が主流。

  2次元の表形式でデータを扱う。

2)膨大なデータ量と高速なパフォーマンス。

  エクセルでは、せいぜい1000件のデータ内を検索すれば  「フリーズ→落ちる→データ消える→泣く」ことになる。  DBでは、数千万件のデータを安定して扱い、且つ高速に  検索・更新・登録・削除することができる。

3)データの損失、不正アクセス、漏洩を防ぐ。

  同時アクセスの制御、バックアップとリカバリ機能、  細かく設定できる権限制御などにより、安全にデータを  管理してくれる。

Page 18: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-2. データベースをイメージしよう(1) 2. データベース(mysql)の操作

◆ 世間でのMySQLの使用例 - mixi

インターネット

MySQLサーバ

mixiサーバ

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1 fakj ふぇ えd

1 1 321213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

1 1 321 1 1 321 1 1 321 1 1 321 1 1 321213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

1 1 321 1 1 321 1 1 321 1 1 321 1 1 321213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd fakj ふぇ えd1 1 321 1 1 321 1 1 321 1 1 321 1 1 321

213 213 1 213 213 1 213 213 1 213 213 1 213 213 1321 321 213 321 321 213 321 321 213 321 321 213 321 321 213

1 321 321 1 321 321 1 321 321 1 321 321 1 321 321321 1 1 321 1 1 321 1 1 321 1 1 321 1 1321 321 321 321 321 321 321 321 321 321 321 321 321 321 321

1 321 1 1 321 1 1 321 1 1 321 1 1 321 1321 1 1 321 1 1 321 1 1 321 1 1 321 1 1

会員数2000万人のmixiはMySQLを使用。 ・日記データの検索や日記の投稿 ・コミュニティ参加者一覧の表示 ・新規ユーザ登録 ・ユーザパスワード管理 ・トピックへの新書き込み登録 ・・・etc複雑な機能を高パフォーマンスで実現。

ブラウザ

Page 19: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-2. データベースをイメージしよう(2) 2. データベース(mysql)の操作

◆ phpとMySQLの関係図

ブラウザ

サーバマシン

wwwサーバ(apache)

php

DBサーバ(MySQL)

1.httpリクエスト

6.レスポンス(htmlソース)

2.php実行

3.SQL実行

4.実行結果

5.html出力

Page 20: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-2. データベースをイメージしよう(2) 2. データベース(mysql)の操作

◆ phpとMySQLの関係図

ブラウザ

サーバマシン

wwwサーバ(apache)

php

DBサーバ(MySQL)

1.httpリクエスト

6.レスポンス(htmlソース)

2.php実行

3.SQL実行

4.実行結果

5.html出力

今から学ぶのは

3 と 4の部分です。

Page 21: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

1)DBの操作(SQL文)   - データ取得 (SELECT文)    - データ登録 (INSERT文)   - データ更新 (UPDATE文)    - データ削除 (DELETE文)

2)phpでSQLを使う方法 (php)   - DBへの接続    - SQLの実行   - DBへの接続を切断

 2-3. 対五輪必須DBテクニック 2. データベース(mysql)の操作

◆ 五輪本番で必要なDBテクニック

Page 22: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-4. 実習環境の準備(1) 2. データベース(mysql)の操作

◆ phpMyAdminの用意

・「phpMyAdmin」とは、ブラウザでMySQLの操作・管理が できるようにするためのWebツール

・データベースの中身を表示したり、SQL文の 構文を確認したり という使い方(あくまでも補助ツール)

・本番でも使用可能!

Step1. http://localhost/xampp/ にアクセス

Step2. xamppの左側メニューから、「phpMyAdmin」をクリック

Page 23: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

Step1. http://localhost/gorinphp/phpmyadminを開く Step2. 右フレーム内上部のメニューより「SQL」を クリック  Step3.  「サーバ "localhost" 上でクエリを実行する」の テキストエリア内に、右のSQL文⇒ を全て貼り付け、「実行する」をクリック

Step4.  「SQL は正常に実行されました」が出ればOK

CREATE DATABASE gorinphp0729 DEFAULT CHARACTER SET eucjpms COLLATE eucjpms_japanese_ci;;

USE gorinphp0729;

CREATE TABLE contest (skillname VARCHAR(40),expert VARCHAR(40),mail VARCHAR(40),uid CHAR(4)) ;

CREATE TABLE user (uid CHAR(4) NOT NULL,pass VARCHAR(10),expert VARCHAR(40),mail VARCHAR(40),age INT(3)) ;

ALTER TABLE user ADD CONSTRAINT PK_user PRIMARY KEY (uid);

 2-4. 実習環境の準備(2) 2. データベース(mysql)の操作

◆ サンプルDBと表の作成実習に使う、サンプルのDBを作成します。

Page 24: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-4. 実習環境の準備(3) 2. データベース(mysql)の操作

MySQL

テーブル:contestskillname(競技名)

文字型最大40桁(VARCHAR)

expert(参加者名)

文字型最大40桁(VARCHAR)

mail(メールアドレス)

文字型最大40桁(VARCHAR)

uid(参加者ID)

文字型固定4桁(CHAR)

テーブル:useruid(参加者ID)

文字型固定4桁(CHAR)

pass(パスワード)

文字型最大10桁(VARCHAR)

expert(参加者名)

文字型最大40桁(VARCHAR)

mail(メールアドレス)

文字型最大40桁(VARCHAR)

age(年齢)

整数型最大3桁(INT)

データベース:gorinphp0729

◆ 今日使うデータベースとテーブル完成!

userテーブルのuidは「主キー」列(重複値を許さない)

Page 25: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

phpMyAdminで「挿入」を行い、表示されるSQLを確認。

 2-5. データの登録(1) 2. データベース(mysql)の操作

INSERT INTO `gorinphp0729`.`user` (  `uid` ,  `pass` ,  `expert` ,  `mail` , `age`)VALUES (  '0001', '0001pass', '野比のび太', '[email protected]', 10)

 ただし、これはとっても丁寧な書き方で・・・

◆ phpMyAdminでINSERT文を確認

Page 26: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

実はこれくらいの記述でもOKです。(人間が作るときはだいたいこんなもんです。)

 2-5. データの登録(2) 2. データベース(mysql)の操作

INSERT INTO user (  uid, pass, expert, mail, age ) VALUES (  '0001', '0001pass', '野比のび太','[email protected]', 10)

では、INSERT文の構文を確認しましょう。

Page 27: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

INSERT  INTO  表名 (      列名1 [, 列名2, 列名3 ・・・ ] ) VALUES (      値1 [, 値2, 値3・・・ ])

斜体 ・・・毎回変わる(=考えて入力する)部分。  それ以外の部分はいつも同じ!

 2-5. データの登録(3) 2. データベース(mysql)の操作

◆ INSERT文の構文

VALUES句に入れる値は、文字列型の列だったら ' ' (シングルクォーテーション)で囲む。数値型だったらそのまま数字を書く。

Page 28: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-5. データの登録(4) 2. データベース(mysql)の操作

◆ INSERT文理解度確認問題phpMyAdminを操作してSQLを実行し、次のデータを登録する。そこで使われたINSERT文を確認しよう!

uid pass expert mail age

0001 0001pass 織田信雄 [email protected] 32

0002 pass0002 野比のび太 [email protected] 10

0003 00030003 ジャッキー [email protected] 55

user テーブル

skillname expert mail uid

卵焼き 織田信雄 [email protected] 0001

早撃ち 野比のび太 [email protected] 0002

スタント ジャッキー [email protected] 0003

contest テーブル

Page 29: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-5. データの登録(5) 2. データベース(mysql)の操作

◆ INSERT文理解度確認問題 解答

userテーブル

INSERT INTO user ( uid, pass, expert, mail, age) VALUES ( '0001', '0001pass', '織田信雄', '[email protected]', 32)

INSERT INTO user ( uid, pass, expert, mail, age) VALUES ( '0002', 'pass0002', '野比のび太', '[email protected]', 10)

INSERT INTO user ( uid, pass, expert, mail, age) VALUES ( '0003', '00030003', 'ジャッキー', '[email protected]', 55)

Page 30: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-5. データの登録(6) 2. データベース(mysql)の操作

◆ INSERT文理解度確認問題 解答

contestテーブル

INSERT INTO contest ( skillname, expert, mail, uid) VALUES ( '卵焼き', '織田信雄', '[email protected]', '0001')

INSERT INTO contest ( skillname, expert, mail, uid) VALUES ( '早撃ち', '野比のび太', '[email protected]', '0002')

INSERT INTO contest ( skillname, expert, mail, uid) VALUES ( 'スタント', 'ジャッキー', '[email protected]', '0003')

Page 31: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-6. データの検索(1) 2. データベース(mysql)の操作

テーブルを選択すると、SELECT文が表示される。

SELECT *FROM `user`LIMIT 0 , 30

◆ phpMyAdminでSELECT文を確認

少し省いて、次のように書いても問題ない。

SELECT *FROM user

では、SELECT文の構文を確認しよう!

Page 32: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

SELECT  列名1[,列名2,・・・] [FROM テーブル名] [WHERE 絞込み条件]

◆ SELECT文の構文

 2-6. データの検索(2) 2. データベース(mysql)の操作

次に、 [WHERE 絞込み条件] についてkwskみてみよう。

SELECT 句に指定できるのは、・ *     (アスタリスク。全ての列を表示する)・列名  (FROM句に指定されたテーブルに存在する列)・計算式  ( 1+1, 2*2, 3/3, 4-4 ~ など)・文字列  ( 'abc', 'あいう' ~ など)・MySQLの関数  ( now() ~ など)

の五つ。

Page 33: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

◆ WHERE句の使い方

 2-6. データの検索(3) 2. データベース(mysql)の操作

WHERE句は 「行を絞りこむ条件を書く場所」

記述例 意味 記述例 意味

a = b a と b が等しい a > b a が b より大きい

a != b a と b が等しくない a < b a が b より小さい

a <= b a が b 以下 a IS NULL a が 空っぽ(NULL値)

a >= b a が b 以上 a IS NOT NULL a が 空っぽじゃない

a LIKE '表現' a が 表現に合致する a NOT LIKE '表現' a が 表現に合致しない

比較する記号(比較演算子)例 (参考:http://dev.mysql.com/doc/refman/5.1/ja/comparison-operators.html)

記号 意味 使用例 意味

_ (アンダーバー)

そこに1文字の何かがある name LIKE '_a_ada'

name は、1文字目と3文字目に何かの文字があり、2文字目が「a」、4文字目以降が「ada」である。

% そこに0文字以上の何かがある

name LIKE '%ada%'nameは、「ada」を含む全ての文字列。ada、Wada、adachi、 Tada、 WadaBen など全てOK。

LIKE演算子の'表現'について(「_」「%」の使い方)

Page 34: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-6. データの検索(4) 2. データベース(mysql)の操作

「=, !=, <=, >=, <, >, IS NULL, IS NOT NULL, LIKE」 > 「AND」 > 「OR」

条件の組み合わせ(AND、OR、()の使い方)記述例 意味

a = b AND b = c a と b が等しく、かつ b と c が等しい

a = b OR b = c a と b が等しいか、または b と c が等しい

a = b AND b = c OR a > 5 「aとbが等しく、かつbとcが等しい」か、または「aが5より大きい」

a = b AND (b = c OR a > 5) 「aとbが等しく」、かつ「bとcが等しいか、またはaが5より大きい」

a >= 10 AND a < 100 a が 10以上100未満

a < 10 AND a > 100 a が 10より小さく、かつ100より大きい(ありえない)

a + b > 10 OR b < 5 a + b が10より大きいか、または b が5より小さい

( a = 0 OR b = 1 ) OR c = 2 「aが0 または bが1」であるか、または 「cが2」である

a = 0 OR ( b = 1 OR c = 2 ) 「aが0」であるか、または「bが1 または cが2」である

Page 35: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-6. データの検索(5) 2. データベース(mysql)の操作

問題 どんな意味??

age > 10

name IS NULL

uid = '0001'

age < 22 AND gakuseki LIKE '07%'

gakunen >= 2 OR gakka = 'AW'

◆ 条件式理解度確認問題

どう書く? 意味

age が 18以上、65未満である

name が 「T」 で始まり「a」で終わる

gakunen が 1 であるか、または gakka が「JO」である

gakuseki が 「09JZ」で始まり、かつ bukatsu が空っぽである

gakka が 「J」から始まる2文字で、age が 20 以下である

Page 36: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-6. データの検索(6) 2. データベース(mysql)の操作

◆ 条件式理解度確認問題 解答問題 どんな意味??

age > 10 age が 10 より大きい

name IS NULL name が空っぽである

uid = '0001' uid が 「0001」である

age < 22 AND gakuseki LIKE '07%' age が 22より小さく、かつ gakuseki が「07」から始まる

gakunen >= 2 OR gakka = 'AW' gakunen が 2以上であるか、または gakka が「AW」である

どう書く? 意味

age >= 18 AND age < 65 age が 18以上、65未満である

name LIKE 'T%a' name が 「T」 で始まり「a」で終わる

gakunen = 1 OR gakka = 'JO' gakunen が 1 であるか、または gakka が「JO」である

gakuseki LIKE '09JZ%' AND

bukatsu IS NULLgakuseki が 「09JZ」で始まり、かつ bukatsu が空っぽである

gakka LIKE 'J_' AND age <= 20 gakka が 「J」から始まる2文字で、age が 20 以下である

Page 37: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

◆ SELECT文理解度確認問題

uid pass expert mail age

0001 0001pass 織田信雄 [email protected] 32

0002 pass0002 野比のび太 [email protected] 10

0003 00030003 ジャッキー [email protected] 55

user テーブル

 2-6. データの検索(7) 2. データベース(mysql)の操作

この user テーブルから、次の内容を表示するSELECT文を書き、phpMyAdminで実行しよう。

1) age が 30 以上の行のuid, expert を表示する

2) mail が「no」から始まる行のpass を表示する

3) expert がジャッキーであるか、または   mail に 「ta」を含む行の全ての列を表示する

Page 38: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-6. データの検索(8) 2. データベース(mysql)の操作

◆ SELECT文理解度確認問題 解答1) age が 30 以上の行のuid, expert を表示する

2) mail が noから始まる行のpass を表示する

3) expert がジャッキーであるか、または   mail に 「ta」を含む行の全ての列を表示する

SELECT uid, expert FROM userWHERE age >= 30

SELECT pass FROM userWHERE mail LIKE 'no%'

SELECT * FROM userWHERE mail LIKE '%ta%' OR expert = 'ジャッキー'

Page 39: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-7. データの更新(1) 2. データベース(mysql)の操作

phpMyAdminで「編集」を実行すると、UPDATE文が表示されます

UPDATE `gorinphp0729`.`user`SET `expert` = '野比のびすけ'WHERE `user`.`uid` = '0001'LIMIT 1

◆ phpMyAdminでUPDATE文を確認

少し省いて、次のように書いても問題ありません。

UPDATE userSET expert = '野比のびすけ'WHERE uid = '0001'

では、UPDATE文の構文を確認してみましょう。

Page 40: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

UPDATE  表名 SET 列名1 = 値1 [, 列名2 = 値2・・・][WHERE 絞込み条件]

 2-7. データの更新(2) 2. データベース(mysql)の操作

◆ UPDATE文の構文

・WHERE句の使い方はSELECT文とまったく同じ。・列名は、更新対象の表に存在する列名。・WHERE句を指定しないと、表にある全ての行を 更新してしまう。気をつけて!

Page 41: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-7. データの更新(3) 2. データベース(mysql)の操作

◆ UPDATE文理解度確認問題

skillname expert mail uid

卵焼き 織田信雄 [email protected] 0001

早撃ち 野比のび太 [email protected] 0002

スタント ジャッキー [email protected] 0003

contest テーブル

phpMyAdminからUPDATE文を実行し、この contest テーブルを更新しよう。

1) uid が 「0001」の行の skillname を   「目玉焼き」に変更する

2) mail に「i」を含む行のexpertを   「野比のびすけ」に変更する

3) uid が 「0002」か、または「0003」の行の   skillname を「早食い」に変更する

Page 42: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-7. データの更新(4) 2. データベース(mysql)の操作

◆ UPDATE文理解度確認問題 解答1) uid が 「0001」の行の skillname を「目玉焼き」に変更する

2) mail に「i」を含む行のexpertを「野比のびすけ」に変更する

3) uid が 「0002」か、または「0003」の行の   skillname を「早食い」に変更する

UPDATE contest SET skillname = '目玉焼き'WHERE uid = '0001'

UPDATE contest SET expert = '野比のびすけ'WHERE mail LIKE '%i%'

UPDATE contest SET skillname = '早食い'WHERE uid = '0002' OR uid = '0003'

Page 43: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

phpMyAdminでDELETE文を確認

これを簡単な書き方に直すと

 2-8. データの削除(1) 2. データベース(mysql)の操作

◆ phpMyAdminで文を確認

DELETE FROM `user`WHERE CONVERT(`user`.`uid` USING utf8) = '0001'LIMIT 1

DELETE FROM userWHERE uid = '0001'

Page 44: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

DELETE FROM  表名 [WHERE 絞込み条件]

 2-8. データの削除(2) 2. データベース(mysql)の操作

◆ DELETE文の構文

・WHERE句の使い方はSELECT文とまったく同じ。・WHERE句を指定しないと、表にある全ての行を 削除してしまう。気をつけて!

Page 45: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-8. データの削除(3) 2. データベース(mysql)の操作

◆ DELETE文理解度確認問題

uid pass expert mail age

0001 0001pass 織田信雄 [email protected] 32

0002 pass0002 野比のび太 [email protected] 10

0003 00030003 ジャッキー [email protected] 55

user テーブル

phpMyAdminからDELETE文を実行し、この user テーブルから行を削除しよう。ただし、条件に合致する行がない場合もある。

1) uidが「0003」で、かつage が40以下の行を削除

2) pass が 「s」で終る行を削除

3) uidが「0003」であるか、またはageが40以上の行を削除

Page 46: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-8. データの削除(4) 2. データベース(mysql)の操作

◆ DELETE文理解度確認問題 解答1) uidが「0003」で、かつage が40以下の行を削除

2) pass が 「s」で終る行を削除

3) uidが「0003」であるか、またはageが40以上の行を削除

DELETE FROM userWHERE uid = '0003' AND age <= 40

DELETE FROM userWHERE pass LIKE '%s'

DELETE FROM userWHERE uid = '0003' OR age >= 40

Page 47: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

ここまでで 

を見てきた。また、 

 ということも分かった。では最後に、phpのプログラムでSQLを実行する方法を確認していこう!

 2-9. ここまでのまとめ 2. データベース(mysql)の操作

データの登録(INSERT文)データの検索(SELECT文)データの更新(UPDATE文)データの削除(DELETE文)

phpMyAdminで、正しい(機械的な)SQL文を確認できる

Page 48: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

PHPでMySQLを扱う際には、

どのような操作であっても次の手順で処理をする。

また、 2)SQLを実行 のとき、そのSQLが

SELECT・INSERT・UPDATE・DELETEのどれであっても、基本的に同じ一つの方法で実行できる。

 2-10. PHP de SQL 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

Page 49: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-11. DBに接続・切断する(1) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ phpからDBに接続してみようsample2_11_1.php<?php$host = "localhost"; // 接続先のマシンを指定$user = "root"; // 接続するMySQLのユーザを指定$pass = ""; // MySQLユーザのパスワードを指定$db = "gorinphp0729"; // MySQL内のデータベースを指定

// MySQLに接続を試みる

$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { // 接続できたか判定print "接続OK!(゚Д゚)";

mysqli_close($conn); // 接続を切断} else {

print "接続NG!orz"; }?>

Page 50: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-11. DBに接続・切断する(2) 2. データベース(mysql)の操作

◆ 接続の瞬間とその結果

// MySQLに接続を試みる

$conn = mysqli_connect($host, $user, $pass, $db);

mysqli_connect($host, $user, $pass, $db) の結果を、変数 $conn に代入。 $conn の中身は・・・

接続を試みた結果

変数 $conn

成功!

「MySQLへの接続そのもの※」が代入されている。

失敗・・・ false が代入されている。

php MySQL

^ 。^

コレ

1)DBに接続 2)SQLを実行 3)接続を切断

※「MySQLへの接続そのもの」のことを、  接続オブジェクト とか コネクションオブジェクト と呼ぶ

Page 51: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-11. DBに接続・切断する(3) 2. データベース(mysql)の操作

◆ 接続の成否を判定

if ($conn) {   // 接続できたか判定print "接続OK!(゚Д゚)";mysqli_close($conn); // 接続を切断

} else {print "接続NG!orz";

}

変数 $conn には、mysqli_queryによって「MySQLへの接続そのもの」 または 「false」のどちらかが入っている。

「false か 0 か null」以外は全て「true」として扱われるため、接続に成功して「MySQLへの接続そのもの」が入っている$conn は true と判定される! そして切断↓

1)DBに接続 2)SQLを実行 3)接続を切断

mysqli_close($conn); // 接続を切断

Page 52: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-12. SQL実行の基本的な流れ 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ 文字セット設定→SQL作成→mysqli_query実行sample2_12_1.php<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) {

mysqli_query($conn, "SET NAMES eucjpms"); // 文字セット設定

$sql = "SELECT now()"; // SQL作成

$result = mysqli_query($conn, $sql); // $conn と $sql を指定し、mysqli_query!

if ($result) { // SQL実行が成功したかどうかを判定

print "実行成功!(゚Д゚)";} else {

print "実行失敗・・・orz";}

mysqli_close($conn);

}

?>

Page 53: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-13. 文字セット設定(1) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ MySQLの文字化け対策phpを使ってSQL文を実行すると、日本語などのマルチバイト文字が

文字化けを起こしたり、WHERE句条件で正しく判定されなかったりする。対策として、DBへの接続をした後に

mysqli_query(接続オブジェクト, "SET NAMES 文字セット名");

と書いておくと、日本語を扱うときも正しくSQL文が処理される。文字セット名は、phpMyAdminのデータベース情報ページで確認できる。

「照合順序」の、最初の「 _ 」の前までが文字セット名 (この場合eucjpms)

Page 54: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-13. 文字セット設定(2) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

sample2_13_1.php<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = "UPDATE contest SET expert = 'アホ'"; $result = mysqli_query($conn, $sql); mysqli_close($conn);}?>

例)文字セット eucjpms のDBでUPDATE文を実行する場合

サンプルコードの、文字セットを設定している行をコメントアウト( // )すると、値が正しくUPDATEされないことを確かめてみよう。

Page 55: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-13. 文字セット設定(3) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

⇒ mysqli_query(接続オブジェクト, "SET NAMES sjis");

⇒ mysqli_query(接続オブジェクト, "SET NAMES utf8");

◆ eucjpms以外の文字セットの例

その他、php<->MySQL間以外にもphp<->Apache間やApache<->ブラウザ間の文字化け対策については、第二回セミナーで詳しく取り扱う予定!

Page 56: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(1) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ mysqli_query メソッド の使い方mysqli_query の使い方は、次のとおり

$result = mysqli_query(接続オブジェクト, SQL文);

実行するSQL文の種類によって(SELECT文かどうかで)、変数$resultに入る実行結果が若干ちがう

実行したSQL文

変数 $result

SELECT

「MySQLから取得したデータのかたまり」が代入される。失敗したらfalse。

INSERTUPDATEDELETE など

成功したら true、失敗したら false が代入される。

MySQL

^ 。^

php $result

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

データのかたまり

「データのかたまり」の使い方は??

Page 57: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(2) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ THE "データのかたまり" 「結果セット」$result = mysqli_query(接続オブジェクト, SELECT文);

MySQL

^ 。^

php $result

fakj ふぇ えd1 1 321

213 213 1321 321 213

1 321 321321 1 1321 321 321

1 321 1321 1 1

データのかたまり

$row = mysqli_fetch_array(結果セット);

これで、SELECT文を実行して得られた結果を

先頭の1行だけ取り出し、配列として変数$row に代入。$row[添え字] で、その1行の好きな列の値を得られる。添え字は、数字(0列目から)か"列名"が使える。実行するたびに、次の行、次の行と進んでいく。

もう取り出せる行がない場合、$rowにNULL が入る。

このかたまりを、「結果セット」と呼ぶ。結果セットから

データを取り出すにはmysqli_fetch_array メソッドを使う。

Page 58: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(3) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ mysqli_fetch_arrayの動作確認 そのいち

sample2_14_1.php<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";

$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = "SELECT uid, mail FROM contest"; $result = mysqli_query($conn, $sql); // (1) if ($result) { // (2) $row = mysqli_fetch_array($result); // (3) print $row[0] . ", "; // (4) print $row[1] . ", "; print $row["uid"] . ", "; print $row["mail"] . "<br>\r\n"; }mysqli_close($conn);

}?>

(1)

(2)

(3)

(4)

接続オブジェクト$connとSQL文$sqlを使って、mysqli_queryでSQLを実行。結果セットを$resultに代入。

結果セット$resultを判定し、SQLの実行が成功していれば if 文の中に入る。

結果セット$resultから、mysqli_fetch_arrayで先頭の一行を取り出し、配列として$rowに代入。

配列 $rowの 各値(= 1行の中にある、各列の値)をprint文で出力している。$row[]の添え字は、数値でも列名でもOK。

Page 59: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(4) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ mysqli_fetch_arrayの動作確認 そのに

sample2_14_2.php<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";

$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = "SELECT uid, mail FROM contest"; $result = mysqli_query($conn, $sql); if ($result) { $row = mysqli_fetch_array($result); if ($row) { // (1) print $row[0] . ", "; print $row[1] . ", "; print $row["uid"] . ", "; print $row["mail"] . "<br>\r\n"; } }mysqli_close($conn);

}?>

(1)mysqli_fetch_arrayで、ちゃんと行が取り出されて、$rowに入っていることを判定

Page 60: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(5) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ mysqli_fetch_arrayの動作確認 そのさん

sample2_14_3.php(1)

mysqli_fetch_arrayを2回実行し、1行読み進めている。

<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";

$conn = mysqli_connect($host, $user, $pass, $db);if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = "SELECT uid, mail FROM contest"; $result = mysqli_query($conn, $sql); if ($result) { $row = mysqli_fetch_array($result); $row = mysqli_fetch_array($result); // (1) if ($row) { print $row[0] . ", " . $row[1] . ", "; print $row["uid"] . ", " . $row["mail"]; print "<br>\r\n"; } }mysqli_close($conn);

}?>

Page 61: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-14. SQL実行と結果セット(6) 2. データベース(mysql)の操作

1)DBに接続 2)SQLを実行 3)接続を切断

◆ mysqli_fetch_arrayの動作確認 そのよん

sample2_14_4.php<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";

$conn = mysqli_connect($host, $user, $pass, $db);if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = "SELECT uid, mail FROM contest"; $result = mysqli_query($conn, $sql);

if ($result) { $row = mysqli_fetch_array($result); for ($i = 0; $row != null; $i++) { // (1)

print "{$i}行目 => "; print $row[0] . ", " . $row[1] . ", "; print $row["uid"] . ", " . $row["mail"]; print "<br>\r\n"; $row = mysqli_fetch_array($result); } }mysqli_close($conn);

}?>

(1)「mysqli_fetch_array($result) の結果が nullでない間繰り返す」という継続条件の、for 文のループ。

つまり、SELECT文で取得した全ての行について、内容を表示することを繰り返すプログラム。

(たぶん、そういうことをやるときは ホントはforじゃなくてwhileというループを 使うことが多いです。) while ($row=mysqli_fetch_array($result)){ print ~~~ }

Page 62: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-15. 演習問題をやってみよう(1) 2. データベース(mysql)の操作

/* DBを選択 */USE gorinphp0729;

/* 既存のデータを削除 */DELETE FROM user;DELETE FROM contest;

/* 問題用のデータを挿入 */INSERT INTO user (uid, pass, expert, mail, age) VALUES ('0001', '0001pass', '織田信雄', '[email protected]', 32);INSERT INTO user (uid, pass, expert, mail, age) VALUES ('0002', 'pass0001', '野比のび太', '[email protected]', 10);INSERT INTO user (uid, pass, expert, mail, age) VALUES ('0003', '00030003', 'ジャッキー', '[email protected]', 55);

INSERT INTO contest (skillname, expert, mail, uid) VALUES ('卵焼き', '織田信雄', '[email protected]', '0001');INSERT INTO contest (skillname, expert, mail, uid) VALUES ('早撃ち', '野比のび太', '[email protected]', '0002');INSERT INTO contest (skillname, expert, mail, uid) VALUES ('スタント', 'ジャッキー', '[email protected]', '0003');

uid pass expert mail age

0001 0001pass 織田信雄 [email protected] 32

0002 pass0002 野比のび太 [email protected] 10

0003 00030003 ジャッキー [email protected] 55

user テーブル

skillname expert mail uid

卵焼き 織田信雄 [email protected] 0001

早撃ち 野比のび太 [email protected] 0002

スタント ジャッキー [email protected] 0003

contest テーブル

まず、問題を解くためにデータベースの中身を整理します。(下の二つのテーブルがある 状態にします)phpMyAdminから、右のSQLを全て入力し、実行してください。

◆ 演習問題の環境整理

Page 63: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-15. 演習問題をやってみよう(2) 2. データベース(mysql)の操作

ex2_15_1.php

user テーブルから全てのデータを取得し、その結果セットから先頭の一行を取り出し、その行の一列目の値を表示してください。

ex2_15_2.php

データベースの接続パスワードにわざと誤った文字列を指定し、if 文を使って接続が失敗することを確認してください。

ex2_15_3.php

user テーブルから、「ageが30以上」または「mailが j から始まる」行のuidを取得し、その結果セットから二回行を抜き出し、二回目に取り出した行の uid を表示してください。

Page 64: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-15. 演習問題をやってみよう(3) 2. データベース(mysql)の操作

ex2_15_4.php

contest テーブルの、uidが 0001 である行の skillname を、「焼そば」に変更してください。

ex2_15_5.php

user テーブルに、次の新規データを登録してください。uid:「0004」  pass:「pwd」  expert:「ポチ」mail:「[email protected]」  age:「7」

ex2_15_6.php

contest テーブルの全ての行を削除し、その処理が成功した場合のみ、続いてuser テーブルの「pass列に 'p' を含む行」を削除してください。

Page 65: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(1) 2. データベース(mysql)の操作

ex2_15_1.php

user テーブルから全てのデータを取得し、その結果セットから先頭の一行を取り出し、その行の一列目の値を表示してください。<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms");

$sql = ""; // ↓以下、$sqlの中身

$sql .= " " . "SELECT"; // SELECT $sql .= " " . " *"; // SELECT * $sql .= " " . "FROM"; // SELECT * FROM $sql .= " " . " user"; // SELECT * FROM user

$result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result);

print $row[0]; mysqli_close($conn);

}?>

<!-- 以下、補足説明

変数 $sql にSQLを作って代入していく箇所は、SQLを作るときによく使われる書き方。

例えば、exampleテーブルから col1~col4、col6~col9をSELECTするとき、

$sql = "SELECT col1, col2, col3, col4, col6, col7, col8, col9 FROM example";

と書くよりも

$sql = ""; // 変数の初期化$sql .= " " . "SELECT";$sql .= " " . " col1,";$sql .= " " . " col2,";$sql .= " " . " col3,";$sql .= " " . " col4,";$sql .= " " . " col6,";$sql .= " " . " col7,";$sql .= " " . " col8,";$sql .= " " . " col9";$sql .= " " . "FROM";$sql .= " " . " example";

と書いたほうが見やすく、編集しやすい。

-->

Page 66: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(2) 2. データベース(mysql)の操作

ex2_15_2.php

データベースの接続パスワードにわざと誤った文字列を指定し、if 文を使って接続が失敗することを確認してください。<?php$host = "localhost";$user = "root";$pass = "(゚∀゚)アヒャヒャ!!"; // 間違ったパス$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { print "接続成功しちゃった?(^^;"; mysqli_close($conn);} else { print "はい失敗";}?>

Page 67: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(3) 2. データベース(mysql)の操作

ex2_15_3.php

user テーブルから、「ageが30以上」または「mailが j から始まる」行のuidを取得し、その結果セットから二回行を抜き出し、二回目に取り出した行の uid を表示してください。<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = ""; $sql .= " " . "SELECT"; $sql .= " " . " uid"; $sql .= " " . "FROM"; $sql .= " " . " user"; $sql .= " " . "WHERE"; $sql .= " " . " age >= 30"; $sql .= " " . "OR"; $sql .= " " . " mail LIKE 'j%'";

$result = mysqli_query($conn, $sql);

$row = mysqli_fetch_array($result); $row = mysqli_fetch_array($result);

print $row["uid"];

mysqli_close($conn);

}

?>

Page 68: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(4) 2. データベース(mysql)の操作

<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = ""; $sql .= " " . "UPDATE"; $sql .= " " . " contest"; $sql .= " " . "SET"; $sql .= " " . " skillname = '焼そば'"; $sql .= " " . "WHERE"; $sql .= " " . " uid = '0001'";

$result = mysqli_query($conn, $sql); if ($result) { print "更新成功!"; } mysqli_close($conn);}?>

ex2_15_4.php

contest テーブルの、uidが 0001 である行の skillname を、「焼そば」に変更してください。

Page 69: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(5) 2. データベース(mysql)の操作

<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) { mysqli_query($conn, "SET NAMES eucjpms"); $sql = ""; $sql .= " " . "INSERT INTO user ("; $sql .= " " . " uid, pass, expert, mail, age"; $sql .= " " . ")VALUES("; $sql .= " " . " '0004',"; $sql .= " " . " 'pwd',"; $sql .= " " . " 'ポチ',"; $sql .= " " . " '[email protected]',"; $sql .= " " . " 7"; $sql .= " " . ")";

$result = mysqli_query($conn, $sql); if ($result) { print "更新成功!"; }

mysqli_close($conn);}?>

ex2_15_5.php

user テーブルに、次の新規データを登録してください。uid:「0004」  pass:「pwd」  expert:「ポチ」 mail:「[email protected]」  age:「7」

Page 70: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-16. 演習問題こたえあわせ(6) 2. データベース(mysql)の操作

<?php$host = "localhost";$user = "root";$pass = "";$db = "gorinphp0729";$conn = mysqli_connect($host, $user, $pass, $db);

if ($conn) {

mysqli_query($conn, "SET NAMES eucjpms");

$sql = "DELETE FROM contest"; $result = mysqli_query($conn, $sql);

if ($result) {

print "contest テーブル成功!<br>\r\n";

$sql = ""; $sql .= " " . "DELETE FROM user"; $sql .= " " . "WHERE"; $sql .= " " . " pass LIKE '%p%'";

$result = mysqli_query($conn, $sql); if ($result) {

print "user テーブル成功!<br>\r\n";

} else {

print "user テーブル処理失敗orz<br>\r\n";

}

} else {

print "contest テーブル処理失敗orz<br>\r\n";

}

mysqli_close($conn);

}

?>

ex2_15_6.php

contest テーブルの全ての行を削除し、その処理が成功した場合のみ、続いて user テーブルの「pass列に 'p' を含む行」を削除してください。

Page 71: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-17. データベースの操作 まとめ 2. データベース(mysql)の操作

◆DBに接続$conn = mysqli_connect("サーバアドレス","ユーザ名","パスワード","DB名");

 →接続に成功すれば、$conn には「MySQLへの接続そのもの(接続オブジェクト)」が、   失敗すれば false が入る。 → if ($conn) { … で、正しく接続できたことを確認してから、続きの処理を行う。

◆SQLを実行mysqli_query(接続オブジェクト, "SET NAMES 文字セット名"); // 文字セット設定 →文字セット名は、phpMyAdminのデータベース情報「照合順序」で確認。

$result = mysqli_query(接続オブジェクト, "SQL文");      // SQL文の実行 →$resultには、SQL文がSELECT文ならば「結果セット」かfalseが、   SELECT文以外ならば true か false が入る。

$row = mysqli_fetch_array($result); // 結果セットを1行読む →SELECT文実行後の結果セットから、1行ずつ取り出して、配列として$rowに入れる。   $row[列番号] または $row["列名"] で、取り出した行にある好きな列の値が得られる。 →もう読む行が残っていない場合は、$row に NULL がはいる。

1)DBに接続 2)SQLを実行 3)接続を切断

◆接続を切断

$mysqli_close(接続オブジェクト);

Page 72: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

 2-18. おわりに 2. データベース(mysql)の操作

この第一回セミナーで取り上げたことは、実践的ではありますが最低限の内容とも言えます。(先輩はこのくらいのことをやっていました)

SQLやphpには、DBを操作するためのもっと便利な使い方もたくさんあります。(たとえば、「登録年月日が一番古い」という条件を書く、 DB処理中にエラーが発生したら更新を元に戻す、などなど)

「こんなことできないのかなぁ?」「この辺もっとkwsk」ということがあったら、あきらめる前にググるか、電設部 技能五輪PJTまでお気軽にご質問ください。

大丈夫、大体のことはできますよ!(たぶんね)

◆ 技能五輪金メダルを目指すAWの皆様へ

Page 73: Gorinphp0729

AW技能五輪 第一回 PHPセミナー (c) 2009 Akihiro Tsukada, JO-GORIN-PJT. 

長時間お疲れさまでした!

 AW技能五輪 第一回 PHPセミナー 資料