PHPスクリプトからクエリ発行(INSERT,SELECTでテーブルデータ表示)

MySQLへの接続方法がわかったら、次はPHPからクエリを発行してみましょう。

あらかじめデータベースへ「db」のテーブル「tb」の内容をphpMyAdminで確認し、

テーブル「tb」は「cd」「nm」「pr」の3つのカラムだけで構成されています。

ここでは以下のように新しいレコードを挿入します。

テーブル「tb」

f:id:mkyosuke:20191202142450p:plain


挿入するレコード

cd nm pr
XXXX7 付箋 175

 

まずは最も単純なPHPスクリプトを作成し、実行してみます。

<?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);
?>

実行結果

f:id:mkyosuke:20191202164336p:plain

・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つのレコードの各カラムの値が入るので、これをレコード同じ回数繰り返す必要があります。

f:id:mkyosuke:20191202173303p:plain