DB接続方法
PHPでデータベースへ接続する方法は、2022年現在だと以下が主流だと思われます。
//DB接続部
define('DB_HOST', 'localhost');
define('DB_NAME', 'hogehoge');
define('DB_CHARSET', 'utf8mb4');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
function connect(): PDO
{
$dsn='mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHARSET;
$pdo = new PDO($dsn, DB_USER, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $pdo;
}
//DB操作実行部
try {
$pdo = connect();
$sql = 'SELECT * FROM hoge WHERE first_name = :first_name OR last_name = :last_name';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':first_name', 'foo');
$stmt->bindValue(':last_name', 'bar');
$stmt->execute();
} catch (PDOException $e) {
echo '検索に失敗しました。';
return;
}
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['$first_name'];
echo $row['$last_name'];
}
$stmt = null;
$pdo = null;
DBの切断について
参考書などではDBの切断処理を省略している場合がありますが、接続は明示的に閉じた方がいいのでnullを代入して切断しましょう。
接続を閉じるには、他から参照されていないことを保障することでオブジェクトを破棄する必要があります。それには、オブジェクトを保持している変数に対してnullを代入します。明示的にこれを行わなかった場合は、スクリプトの終了時に自動的に接続が閉じられます。
PHPマニュアル “接続、および接続の管理”
FETCHの種類
フェッチモード定数は以下の4つが定義されています。
定数名 | 意味 | 値 |
---|---|---|
PDO::FETCH_ASSOC | カラム名をキーとした連想配列を返す | $result[‘column’] |
PDO::FETCH_NUM | 添字配列を返す | $result[0] |
PDO::FETCH_BOTH | FETCH_ASSOCとFETCH_NUMをミックスした配列を返す | $result[‘column’] & result[0] |
PDO::FETCH_OBJ | カラム名をプロパティに持つインスタンスを返す | $result->column |
FETCHALLについて
fetchAllメソッドを使用してもフェッチは可能ですが、基本的にはfetchを使用します。
fetchメソッドのほうがPHPのメモリ使用量を大幅に抑えられるため、なるべくfetchメソッドを選ぶようにしてください。
PHP本格入門 上
先ほどの例をfetchAllで書き直すと以下のようになります。
/**
* while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
* echo $row['$first_name'];
* echo $row['$last_name'];
* }
*/
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo $row['$first_name'];
echo $row['last_name'];
}
しかし先述したようにfetchAllではなくfetchを使用するようにしましょう。
fetchAllのほうが、より多くメモリを消費することに注意しましょう。
PHP本格入門 上
実行されたSQLのログの確認方法
SQLをプリペアドステートメントで記述していた場合、最終的に実行されたSQLが分かり辛いという問題があります。
発行されたSQLを確認したい場合は、MySQL(MariaDB)のmy.iniを修正してSQLがログとして出力されるようにします。
例えばXamppを使用している場合、以下のパスにmy.iniがあるはずです。
C:\xampp\mysql\bin\my.ini
my.iniの[mysqld]という項目の最終行に以下の2行を追記して保存します。
[mysqld]
...(省略)
general_log=ON
general_log_file="queries.log"
追記後はMySQL(MariaDB)を再起動してください。
以降、SQLのログが以下のパスに出力されるようになります。
C:\xampp\mysql\data\queries.log