18PHPスクリプトでMySQLを操作する(備忘録)→ > 01p > 02p > 03p > 04p > 05p > END
18PHPスクリプトでMySQLを操作する(p414)
(1)《PHPスクリプトでMySQLサーバーに接続する p414》
(2)《PHPスクリプトでクエリを発行 p000》
<まとめ>
<チェック>
<練習問題>
END
04MySQL+PHPの基礎
「基本からのMySQL」ですが、今やWebでの利用を考えずにMySQLを勉強することはできません。MySQLを利用するために必要な範囲でのWebとPHPの知識を勉強します。
☆CHAPTER15⇒MySQLを利用するためのPHP
☆CHAPTER16⇒PHPの基礎知識
☆CHAPTER17⇒PHPスクリプトとHTML
★CHAPTER18⇒PHPスクリプトでMySQLを操作する
★CHAPTER18⇒PHPスクリプトでMySQLを操作する(p414)★
いよいよ、PHPスクリプトを使ったMySQLサーバへの接続です。ブラウザでMySQLデータベースを操ってみましよう。PHPとMySQLサーバの連携の基本から、じっくりと勉強します。
(1)《PHPスクリプトでMySQLサーバーに接続する p414》
(1-1)<PHPでMySQLサーバーに接続する>
まずは、PHPスクリプトを使ってMySQLサーバーに接続します。 接続だけなら、次のスクリプトで実行します。これはサーバー名が「localhost」、ユーザー名が「root」、パスワードが「1234」とした場合の例ですが、現在使用している実際の環境に当てはめて実行してください。
■setuzoku.php
<?php $s=mysql_connect("localhost","root","1234") or die("失敗です"); ① print "成功しました"; mysql_close($s);② ?> ①の「$s=mysql_connect("localhost","root","1234")」で接続の値を代入し、「or die("失敗です");」で、失敗したら終了します。成功した場合は ②で切断します。この仕組みをじっくり見ていきましょう。 ※「setuzoku.php」のファイル名で、公開されているフォルダに保存し、MySQLとApachが動作していることを確認します。そして、ブラウザで「http://localhost/setuzoku.php」と入力し、リターンキーを押してください。無事に接続されれば、ブラウザに表示されます。接続したら、すぐに切断されます。 ※切断時には、特に何も表示されません。 もし、「失敗です」と表示された場合には、サーバー名、ユーザー名、パスワードの設定に問題があるか、またはMySQL自体が動作していないことが考えられます。 |
(1-2)<接続の仕組み>
MySQLサーバーに接続する仕組みを、詳しく見ていくことにしましょう。 mysql_connectは、MySQLサーバーに接続する関数です。次のような構文になります。
●書式⇒MySQLに接続する
mysql_connect(サーバー名,ユーザー名,パスワード) ※mysql_connect関数は、データベースの接続に成功すると「データベース接続の値」を返し、接続に失敗した場合は「FALSE」を返します。 「データベース接続の値」というのは、「MySQLサーバーとの接続に付けた名前」のようなものです。PHPスクリプトは、これを使って、MySQLサーバーに対してコマンドを実行します。 $s=mysql_connect("localhost","root","1234") ※ここでは変数「$s」で受け取ることにしました。PHPでは、変数の型を定義しなくても、勝手に代入した値の型になってくれます。 また、変数の名前は「$s」でなくても、何でもかまいません。よく使われるのは、「接続」ということで「$com」などですが、ここでは「$s」としています。 $s=mysql_connect("localhost","root","1234") or die("失敗です"); ※データベースの接続に成功すれば、mysql_connect関数は「接続の値を$sに代入」します。 さて、その後に「or die()」という関数です。ちなみに、die()の代わりに「exit()」という関数を使っても同じです。die()とexit()は、内部で同じプログラムを使っているので、まったく同じ様に動作します。 ※つまり、接続に成功なら、引き続き2行目からも実行され「print "成功しました"」で成功のメッセージが表示されます。 |
(1-3)<切断の仕組み>
次に、接続しているMySQLデータベースから切断するスクリプトです。切断するときは、mysql_close関数を使います。
●書式⇒MySQLから切断する関数
mysql_close(データベース接続の値) ※引数には、接続のときmysql_connect関数が返した値、つまりここでは「$s」を入れます。 mysql_close($s); ※次のようにすれば、切断に成功したら「切断に成功」、失敗したら「切断に失敗」と表示されます。 if(mysql_close($s)){ print "切断に成功"; }else{ print "切断に失敗"; } |
(2)《PHPスクリプトでクエリを発行 p000》
(2-1)<目標とする「sousa.php」>
MySQLサーバーに接続できたら、今度はPHPスクリプトによるクエリの発行です。前に使ったデータベース「db1」のテーブル「tb1」に、レコードを追加します。 データベース「db1」に、次のカラム構造を持つテーブル「tb1」があることを確認しておきましょう。 |
●テーブル「tb1」のカラム構造
カラム名(列名)⇒(データ型) id→VARCHAR(10) nama→VARCHAR(10) tosi→INT ※現在、テーブル「tb1」には次のようなデータが入力されているものとします。 |
●テーブル「tb1」のデータ
id⇒nama⇒tosi A101→佐藤→40 A102→高橋→28 A103→中川→20 A104→渡辺→23 A105→西沢→35 ※このテーブル「tb1」に、次のデータを挿入してみることにしましょう。 |
●「tb1」に挿入するデータ
d⇒nama⇒tosi K777→ピーエッチピー太郎→20 |
(2-2)<テーブルにデータを挿入するPHPスクリプト>
データを挿入するスクリプトを考えて見ましょう。まず、データベースの接続と切断は <?php $s=mysql_connect("localhost","root","1234") or die("失敗です"); print "成功しました"; mysql_close($s); ?> ※今回は、データベースに接続後、次の2つのコマンドを実行することになります。 ①データベース「db1」を利用→「USE db1;」 ②レコードを挿入→ 「INSERT INTO tb1 VALUES('K777','ピーエッチピー太郎',"20")」 |
●データベース「db1」を使用する。
まず、使うデータベースを指定する「USE」に相当するのは次の関数です。 |
●書式⇒データベースを指定する関数
mysql_select_db(データベース名,データベース接続の値); ※mysql_connect関数が、データベースに接続したときに返す値は、変数「$s」で受け取ります。従って、このmysql_select関数では指定する引数「データベース接続の値」は「$s」になります。 つまり、使用するデータベースを指定するのは次のスクリプトになります。 mysql_select_db("db1",$s); |
●レコードを挿入する
次に、「INSERT」コマンドです。「A105」「西沢」「35」のデータを挿入するSQL文を思い出してください。 次の通りです。 INSERT INTO tb1 VALUES('A105','西沢',35); ※SQL文を発行する関数は、mysql_queryです。 |
●書式⇒SQL文を発行する関数
mysql_query(SQL文) ※発行するSQL文を引数として指定します。 今回発行するSQL文は次の通です。 INSERT INTO tb1 VALUES('K777','ピーエッチピー太郎',20) ; |
●実行される内容
※MySQLモニタの操作とは異なり、SQL文の最後にデリミタ「;」を付ける必要はありません。 mysql_query(SQL文) ※SQL文は文字列なので、「""」か「''」で囲まなければなりません。「''」が使ってあるSQL文をさらに、''で囲むとエラーになってしまいます。 エラーにならないようにするには、例えば、次のように記述する方法があります。 mysql_query('INSERT INTO tb1 VALUES(\'K777\',\'ピーエッチピー太郎\',20)'); ※「\」でエスケープ処理をする。あるいは、次のように記述することもできます。 mysql_query("INSERT INTO tb1 VALUES('K777','ピーエッチピー太郎',20)"); なお、複雑なSQL分の場合は、ヒアドキュメントを使う方法もあります。 |
●実行後(テーブル「tb1」)
※MySQLモニタの操作とは異なり、SQL文の最後にデリミタ「;」を付ける必要はありません。 mysql_query(SQL文) ※SQL文は文字列なので、「""」か「''」で囲まなければなりません。「''」が使ってあるSQL文をさらに、''で囲むとエラーになってしまいます。 エラーにならないようにするには、例えば、次のように記述する方法があります。 mysql_query('INSERT INTO tb1 VALUES(\'K777\',\'ピーエッチピー太郎\',20)'); ※「\」でエスケープ処理をする。あるいは、次のように記述することもできます。 mysql_query("INSERT INTO tb1 VALUES('K777','ピーエッチピー太郎',20)"); なお、複雑なSQL分の場合は、ヒアドキュメントを使う方法もあります。 【画像】 |
(2-3)<PHPスクリプトでテーブルにデータを挿入する>
MySQLへの接続から、データベース「db1」の選択、クエリ発行のスクリプトをまとめると、次のようになります。
■sounyu.php
<?php $s=mysql_connect("localhost","root","1234") or die("失敗です"); ① print "成功しました"; mysql_select_db("db1",$s);② mysql_query('INSERT INTO tb1 VALUES("K777","ピーエッチピー太郎",20)');③ mysql_close($s); ?> ①で接続の値を代入、失敗したら終了。 ②でデータベースを指定。 ③でクエリを発行します。 ④で切断します。 ※公開されるフォルダに保存し、アドレスバーに次のURLを入力しして、リターンキーを押してください。 http://localhost/sounyu.php ※処理は、一瞬で終わります。 |
(2-4)<挿入が成功したことを確認する>
今回は単純な挿入だけのPHPスクリプトなので、その結果も表示されませんつまり、挿入が成功したのか失敗したのかも、ブラウザでは確認できません。 ※確認するには、MySQLモニタを起動して「SELECT」コマンドを発行します。では、実際にデータが挿入されたか、チェックしてください。 |
●操作手順
①MySQLモニタを起動する ②「USE db1」と入力する ③「SELECT * FROM tb1;」と入力する |
■実行結果
【画像】 ※挿入されたレコードが表示されれば成功です。 |
(2-5)<PHPでSQL文の実行結果を受け取る>
前ページのSQL文の発行では、結果がすぐにわかりません。せめて、SQL文を発行した結果を、ブラウザに表示させたいものです。
●PHPで「SELECT」コマンドを発行する
今度は、テーブル「tb1」のレコードを「SELECT」コマンドで表示するスクリプトを作ってみましょう。 PHPではクエリを発行するときは、mysql_query関数を使いました。 mysql_query("INSERT INTO tb1 VALUES('K777','ピーエッチピー太郎',20)"); ※この例では、使っていませんが、mysql_query関数はクエリの結果を返します。では、mysql_query関数で「SELECT」コマンドを発行し、返ってきた結果を変数「$re」に代入てみます。もちろん変数「$re」の名前は、何でもかまいません。 $re=mysql_query("SELECT * FROM tb1"); |
●mysql_query関数で返された結果を文字にする
変数「$re」には「SELECT * FROM tb1」というクエリの結果が代入されます。ところが、この後に「print $re」としても結果は表示されません。 これは、mysql_query関数が返す値が、単純な文字列ではないからです。 結果を文字列として利用できるようにするには、mysql_fetch_array関数を使います。 |
●書式⇒SQLコマンドの結果を配列として得る
mysql_fetch_array(結果) ※ちなみに「fetch(フェチ)」は「取ってくる」という意味です。引数の「結果」というのは、mysql_query関数が返した値(変数「$re」)です。この例で、 「mysql_fetch_array($re)」はクエリの結果の行を、配列として返します。 ※例えば、mysql_fetch_array関数が返す配列を変数「$kekka」に代入すると次のようになります。 $kekka=mysql_fetch_array($re) ※「$kekka」は配列変数といいます。クエリの結果は、1行目の各カラムの値が値を取り出すことになります。 $kekka[0]→カラム「bang」「A101など」 $kekka[1]→カラム「nama」「佐藤など」 $kekka[2]→カラム「tosi」「40など」 |
●返された結果を表示する
$kekka[0]~$kekka[2]に、1つのレコードの各カラムの値が入るので、これを「print」で書き出します。さらにこの処理を、表示するレコード数分繰り返します。 $re=mysql_query("SELECT * FROM tb1"); $kekka=mysql_fetch_array($re)//1行目 print $kekka[0]; print $kekka[1]; print $kekka[2]; $kekka=mysql_fetch_array($re)//2行目 print $kekka[0]; print $kekka[1]; print $kekka[2]; $kekka=mysql_fetch_array($re)//3行目(最後) print $kekka[0]; print $kekka[1]; print $kekka[2]; ※しかし、これをすべてのレコード数分繰り返すのは、あまり芸がありません。そこで、while分を使って次のようにします。 <?php $re=mysql_query("SELECT * FROM tb1"); while($kekka=mysql_fetch_array($re)){ print $kekka[0]; print $kekka[1]; print $kekka[2]; } ?> ※「mysql_fetch_array」は、SQLコマンドの結果からデータの配列を返しますが、取得する行がなくなると「FALSE」を返します。そこで、上の例のようにすれば、取得する行がなくなって「FALSE」が返されるまで「print $kekka」の部分を繰り返すことになります。 ※さらに、「SELECT * FROM tb1」のSQL文を実行する前に「INSERT INTO tb1 VALUES(…)」を実行すれば、レコードの挿入した結果をすぐに確認できます。 |
(2-6)<レコード挿入後にすぐデータを表示する>
先程とは別のデータ「('k888','エスキュー花子',25)」を挿入後、すぐに「SELECT」コマンドでデータを表示させる例です。つなげて表示されると見づらいので、改行「:」記号も入れています。
■sounyu_hyouzi.php
<?php $s=mysql_connect("localhost","root","1234") or die("失敗です"); print "成功しました<BR>"; mysql_select_db("db1",$s); mysql_query('INSERT INTO tb1 VALUES("K888","エスキュー花子",25)'); $re=mysql_query("SELECT * FROM tb1");① while($kekka=mysql_fetch_array($re)){② print $kekka[0]; print ":"; print $kekka[1]; print ":"; print $kekka[2]; print "<BR>"; } mysql_close($s); ?> ※①でクエリの結果を「$re」に代入し ②でその結果を配列として最後の行まで取得します。 |
■実行結果(p426)
【画像】 |
<まとめ>
●PHPでMySQLデータベースに接続し、切断する方法
●PHPでクエリを発行する方法
●PHPでレコードを挿入する方法
●PHPでクエリの結果を表示する方法
<チェック>
□mysql_connect、mysql_closeを使ってデータベースに接続し、切断できる
□mysql_select_dbを使ってデータベースを選択できる
□mysql_queryを使ってクエリを発行できる
□mysql_fetch_arrayを使って、クエリの結果を表示できる
<練習問題>
問題1
テーブル「tb」で、カラム「uria」が50以上で、「bang」ごとの「uria」の平均で120以上のものだけを、「uria」の平均の多いものから表示するPHPスクリプトを作成してください。
ただし、発行するSQL文は、解答例と同様に次を使うものとする。
SELECT bang,AVG(uria)
FROM tb
WHERE uria>=50
GROP BY bang
HAVING AVG(uria)>=120
ORDER BY AVG(uria) DESC;
《解答1》
次のスクリプトを作成します。
$s=mysql_connect("localhost","root","1234") or die("失敗です");
print "成功しました
";
mysql_select_db("db1",$s);
$q=<<
FROM tb
WHERE uria>=50
GROP BY bang
HAVING AVG(uria)>=120
ORDER BY AVG(uria) DESC;
eot;
$re=mysql_query($q);
while($kekka=mysql_fetch_array($re)){
print "社員番号:";
print $kekka[0];
print "売上平均:";
print $kekka[1];
print "
";
}
mysql_close($s);
?>
【実行結果】
未処理 |