miyamon_good’s blog

エンジニア×パチンコ・パチスロ

PHP勉強始めますpart.3

・データベース(MySQL)と接続するためのプログラム

<?php

try {

  $db = new PDO('mysql:dbname=mydb;host=localhost;charset=utf8',

  'root', 'root');

} catch(PDOException $e) {

  echo 'DB接続エラー: ' . $e->getMessage();

}

?>

new PDO:PHP Data object(DBを扱うためのオブジェクト)のコンストラクターという、

オブジェクトを作るときに指定するパラメーターを指定していく。

DBに接続するための文字列(接続文字列)としてsqlの場合は、

DBの名前+サーバーのアドレス+文字コードを指定しそれぞれを;で区切る。

try{}catch{}構文:エラーが発生した時そのままエラーとして落とすのではなく例外を発生させそれを受け取り処理を行う構文。

try{new PDO}:接続をしてうまく行かなかった時は例外を投げてくださいという処理。

catch(){}:例外を投げた時PDOExceptionを$eとして受け取り、その$eの中のメッセージを出力する処理。これによりDBに接続できなかった時エラー画面に飛ばしたり、DBを使わなくてもできる処理だけを行うといった制御が可能になる。

複数のファイルに記載する場合は、DB接続のファイルを1つ用意し、別ファイルでは

require('DB接続ファイル');

で呼び出す方法が適している。

 

・DBからデータを出力する:指定のカラムを連想配列で取り出すプログラム

$records = $db->query('SELECT * FROM my_items');

while ($record = $records->fetch()) {

  print($record['item_name'] . "\n");

}

queryメソッドは後述のSELECT文で得られた値を受け取る。

これで$recordsはオブジェクトのインスタンスとなり、Recordsetというオブジェクトのインスタンスとなる。このインスタンスが持つメソッドの中の1つとしてfetchを利用。

fetchはDBから受け取ったレコードの行の集まりから1行を取り出していき無くなるとfalseを返す。

全てのレコードを受け取るためwhile文で繰り返し処理を行い1つ1つを$recordに格納。

$recordは連想配列のため、$recordのブラケットとDBのカラム名を指定し、

item_nameというカラムのレコードを取り出し出力。

 

・URLパラメーターにページの数字を指定された時にそのページに対応するデータを出力するプログラム

require('dbconnect.php');

if (isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {

  $page = $_REQUEST['page'];

} else {

  $page = 1;

}

$start = 5 * ($page - 1);

$memos = $db->prepare('SELECT * FROM memos ORDER BY id DESC LIMIT ?, 5');

$memos->bindParam(1, $start, PDO::PARAM_INT);

$memos->execute();

1ページ目には最新id5件まで出力。2ページ目以降は順番に5件ずつ出力するよう設定。

?のプレースホルダーには数字が入れたいためbindParamメソッドを使用。

1番目の?に$startの値を入るように設定し、数字でパラメーターを渡すために型を指定している(PDO::PARAM_INT)。そしてexecuteメソッドでプリペアドステートメントを実行している。

プリペアドステートメント:SQL文で値が変わる可能性を有る箇所に対して、変数のように別の文字列を入れておき後で置き換える仕組み。