MySQLデータベースからデータを読み込む方法はいくつかあります。ここでは「mysql_query()関数でSQL文を発行して、mysql_fetch_array()関数で結果セットから1レコード文のデータを取り出す」という方法について解説します。
mysql_query()関数は、MySQLデータベースに対してSQL文を発行するための関数です。ここでは「sampledb」データベースの「fifaranking」テーブルからすべてのフィールドとレコードを読み込むものとして、以下のSQL文を引数に指定します。
SELECT * FROM fifaranking
mysql_query()関数の引数としてSELECT文を指定した場合、返り値はデータベースから返された結果セット(レコードの集まり)のIDになります。引数がIINSERT文やUPDATE文などの場合は、SQLの発行に成功したときはTrue、失敗した場合にはFalseになります。
開いた結果セットから1レコード文のデータを取り出すには、mysql_fetch_array()関数を使います。mysql_fetch_array()関数の引数には、先ほどmysql_query()関数から返された結果セットIDを指定します。
この関数の返り値は、結果セット内のカレントコード(初めて呼び出したときは1レコード目)の各フィールド値(保存されているデータ)です。返り値は連想配列または数値インデックスの配列となっており、テーブル上のフィールド名や列番号をインデックスに指定することで、それぞれのフィールドのデータを取り出すことができます。例えば、MySQL上のフィールド名が「rank」なら、以下のような配列を行います。
$col["rank"]
mysql_fetch_array()関数を呼び出すたびに、カレントコードは1つ次へ進みます。最後のレコードを過ぎるとFalseを返すので、While文で返り値がFalseになるまでループすることで、結果セット内にあるすべてのレコードを読み込むことができます。
この関数の第2引数として、以下のように返り値の形式を指定できます。この例では第2引数を省略しているので、1列目から$col[0]、$col[1]……のような記述で各フィールドのデータを取り扱うこともできます。
MySQL_BOTH | 連想配列と数値インデックスの両方で返す |
MySQL_ASSOC | 連想配列として返す |
MySQL_NUM | 数値インデックス配列として返す |
省略 | MySQL_BOTHに同じ |
SELECT文を使ってすべてのレコードの読み込み処理が完了したら、最後にmysql_free_result()関数を使って結果セットを破棄してメモリを開放します。この関数の引数には、mysql_query()関数から返された結果セットIDを指定します。ただし、メモリはスクリプトの終了時に自動的に解放されます。結果セットのデータ量が膨大であるなど、PHPスクリプトの実行時のメモリ使用量が極端に多くkなる場合以外は省略できます。
<?php header("Content-type: text/html; charset=utf-8"); define("DBSERVER","localhost"); define("DBUSER","root"); define("DBPASSWORD","root"); define("DBNAME","sampledb"); //DB接続 if(!$con = @mysql_connect(DBSERVER, DBUSER, DBPASSWORD)){ die("MySQLに接続できませんでした!<br>"); exit(); } //DB選択 if(!$selectdb = @mysql_select_db(DBNAME)){ die(DBNAME . "が見つかりませんでした!<br>"); exit(); } //文字コードセット if(!$result =@mysql_query("SET NAMES utf8;")){ die("sqlエラー!<br>"); exit(); } //データ取得 $sql = "SELECT * FROM fifaranking"; if(!$result =@mysql_query($sql)){ die("sqlエラー!<br>"); exit(); } $body = ""; while($col = @mysql_fetch_array($result)){ $body .= "<tr>"; $body .= "<td align=\"center\">" . $col["rank"] . "</td>"; $body .= "<td>" . $col["team"] . "</td>"; $body .= "<td>" . $col["area"] . "</td>"; $body .= "<td align=\"right\">" . $col["point"] . "</td>"; $body .= "</tr>"; } //結果を破棄 mysql_free_result($result); //DB切断 if(!$con = @mysql_close()){ die("MySQLとの接続を解除できませんでした!<br>"); exit(); } ?> <!DOCTYPE HTML> <html lang="ja-JP"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <table border="1"> <tr> <th>順位</th> <th>チーム</th> <th>地域</th> <th>ポイント</th> </tr> <?=$body?> </table> </body> </html>