00メニュー > 01はじめてのMySQL > 02MySQLの基礎知識 > 03MySQLを使いこなす > 04MySQL+PHPの基礎 > 05MySQL+PHPの実践 > 06Appendix

18PHPスクリプトでMySQLを操作する(備忘録)→ > 01p > 02p > 03p > 04p > 05p > 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=<< SELECT bang,AVG(uria)
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);
?>

【実行結果】

未処理