PHPスクリプトからクエリ発行(INSERT,SELECTでテーブルデータ表示)
MySQLへの接続方法がわかったら、次はPHPからクエリを発行してみましょう。
あらかじめデータベースへ「db」のテーブル「tb」の内容をphpMyAdminで確認し、
テーブル「tb」は「cd」「nm」「pr」の3つのカラムだけで構成されています。
ここでは以下のように新しいレコードを挿入します。
テーブル「tb」
挿入するレコード
cd | nm | pr |
XXXX7 | 付箋 | 175 |
<?php
$d = mysqli_connect("localhost","root","") or die("接続失敗");
print"接続成功<br>";
mysqli_select_db($d,"db");
mysqli_query($d,"INSERT INTO tb VALUES('XXXX7','付箋',175)");
mysqli_close($d) or die("切断失敗");
print"切断成功";
?>
以前は「mysql_query」などのMySQL(iがつかない)が使われていましたが、PHP5.5以降では非推奨となり、その代替えとなったのがMySQLiですので上記はmysqli_xxx(" ")を使用しております。
1つだけ注意しなければならないのは、MySQLとMySQLiでは受け取るパラメータの順番が異なることです。
実行結果
関数 mysqli_select_db
書式 mysqil_select_db(MySQLリンクID,データベース名)
機能 データベースを指定する
返り値 成功するとTRUEを、失敗するとFALSEを返す
最初の引数では「MySQLリンクID」です。mysqli_connect関数がデータベースに接続したときに返す値($d)を指定します。その次の引数は、「データベース名」である「db」を指定します。
mysqli_select_db($d,"db") or die("DB接続失敗");
・クエリの発行
クエリを発行する関数はmysqli_queryです。
関数 mysqli_query(MySQLリンクID,SQL文)
機能 クエリを発行する
返り値 成功するとその結果セット、もしくはTRUE返し、失敗するとFALSEを返す。
mysqli_query関数は発行する命令によって、成功時の返り値が変わります。
SELECT文を発行した場合は選択された結果セットが返りますが、INSERT文の場合はTRUEが返ります。失敗の場合はFALSEが返ります。
結果セットとはSELECTにより選択されたデータのかたまりのことです。
またSQL文は文字列なので、" "か' 'で囲わなければいけません。もし' 'を使ったSQL文を、さらに' 'で囲うとエラーになるので、今回は' 'を含むSQL文全体を" "で囲うことにしました。さらに引数のSQL文には行末の「;」を付けてはいけません。
mysqli_query($d,"INSERT INTO tb VALUES('XXXX7','付箋',175)");
ちなみに、上記の通りmysql_queryはINSERT文の実行に成功するとTRUEを返すので、次のようにするとメッセージが表示されます。
$r = mysqli_query($d,"INSERT INTO tb VALUES('XXXX7','付箋',175)");
if($r){
print "INSERT成功<br>";
}else{
print "INSERT失敗<br>";
}
SELECT文の発行
今度は、SELECTでテーブル「tb」の内容を表示させてみましょう。つまり次のクエリを発行します。
SELECT * FROM tb;
phpMyAdminでレコードの表示は簡単ですが、これをPHPでやると結構面倒です。
<?php
$d = mysqli_connect("localhost","root","")or die("接続失敗");
mysqli_select_db($d,"db");
$r = mysqli_query($d,"SELECT * FROM tb");
while ($row = mysqli_fetch_array($r)){
print"{$row['cd']}{$row['nm']}{$row['pr']}<br>";
}
mysqli_close($d);
?>
実行結果
・SELECTの結果を表示する仕組み
PHPでクエリを発行する場合mysqli_query関数を使いました。テーブル「tb」の全カラム、全レコードを表示するSQL文は「SELECT * FROM tb」なので、PHPスクリプトは次のようになります。
$r = mysqli_query($d,"SELECT * FROM tb");
mysqli_query関数ではSELECT文の発行に成功すると、クエリの結果セットを返すので、これを変数$rに代入しています。
ところが、この後単純に「print $r」とやっても結果は表示されません。これは、mysql_query関数が返す結果セットが、単純な文字列ではないからです。
結果セットからデータを取り出すためには
「結果の行を配列にして受け取る」mysqli_fetch_array関数を使います。
関数 mysql_fetch_array
書式 mysql_fetch_array(結果セット)
返り値 成功すると取得した行の配列を返し、行が存在しない場合FALSEを返す
「fetch(フェッチ)とは「取ってくる」という意味です。次で、SELECTの結果を1行だけ
配列変数$rowに代入しています。
$row = mysql_fetch_array($r);
そして、これをwhileの「繰り返しの条件」に指定します。これにより、mysql_fetch_arrayがFALSEを返す、つまり「最後まで読みだされて、もう読む行がない」状態になるまで、whileの繰り返しが行われます。
なぜこのような条件を書くかというと、この場合まず、mysql_fetch_arrayの実行結果が$rowに代入され、その後、$rowがboolean型に変換されてから評価される仕組みになっているからです。boolean型に変換されるとき、明示的なFALSEや「0」以外はTRUEになりますので、結果セットの中にまだ取り出していないレコードが存在する間はTRUEとなります。
クエリの結果は、1行目の各カラムの値が$row['cd'],$row['nm'],$row['pr']に入ります。
$row['cd'] ➡カラム「cd」の値「SH001」
$row['nm']➡カラム「nm」の値「鉛筆」
$row['pr']➡カラム「pr」の値「100」
連想配列のキーには、カラム名を指定します。また順番に$row[0],$row[1],$row[2]としても同じ結果です。
この$row['cd'],$row['nm'],$row['pr']の値をprintで書き出します。" "で囲まれる文字列に変数を入れるので{ }を付けています。
print "{$row['cd']},{$row['nm']},{$row['pr']}<br>";
mysql_fetch_arrayで1つのレコードの各カラムの値が入るので、これをレコード同じ回数繰り返す必要があります。