WAVE Log
PHP + MySQL

env.php

<?php define('DB_HOST', 'localhost'); define('DB_NAME', 'mydb'); define('DB_USER', 'myname'); define('DB_PASS', 'password');

dbconnect.php

<?php require_once 'env.php'; function connect() { $host = DB_HOST; $db = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4"; try { $dbh = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ]); return $dbh; } catch(PDOException $e) { echo '接続失敗です!' . $e->getMessage(); exit(); } }

※ PDO::ERRMODE_EXCEPTION
エラーが発生した時に、PDOException の例外を投げてくれる。

※ PDO::FETCH_ASSOC
カラム名をキーとする連想配列で返す。

※ PDO::ATTR_EMULATE_PREPARES
データベース側が持つ「プリペアドステートメント」という機能のエミュレーションをPDO側で行うかどうかを設定する。

create.php

<?php require_once 'dbconnect.php'; function blogCreate($blogs) { $sql = 'INSERT INTO table_name (title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = connect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title',$blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content',$blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category',$blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status',$blogs['publish_status'], PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch(PDOException $e) { $dbh->rollBack(); exit($e); } }

※ PDO::PARAM_INT
SQL INTEGER データ型を表します。

※ PDO::PARAM_STR
SQL CHAR, VARCHAR, または他の文字列データ型を表します。

※ カラム名と IN 句にプレースホルダは使えない。

※ トランザクション
(一連の処理の整合性を保つための機能。一つでも処理が失敗すれば、その全ての処理を無効とする。)
beginTransaction() → トランザクション開始
commit() → データベースに反映させる
rollBack() → 処理を全て無効とする
注)トランザクションを利用する場合は、テーブル形式は InnoDB を使用する。MyISAM はトランザクション機能がない。

get.php

<?php require_once 'dbconnect.php'; // データを取得する // 引数:なし // 返り値:取得したデータ function getAll() { $dbh = connect(); //①SQLの準備 $sql = 'SELECT * FROM table_name order by id'; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(); return $result; $dbh = null; } // 引数:$id // 返り値:$result function getById($id) { if(empty($id)) { exit('IDが不正です。'); } $dbh = connect(); // SQL準備 $sql = 'SELECT * FROM table_name where id = :id'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', (int)$id, PDO::PARAM_INT); // SQL実行 $stmt->execute(); // 結果を取得 $result = $stmt->fetch(); if(!$result) { exit('ブログがありません。'); } return $result; } // レコード数を取得 // 引数:$category // 返り値:$count function countCategory($category) { $dbh = connect(); $sql = 'SELECT COUNT(*) FROM table_name WHERE category = :category'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':category', (int)$category, PDO::PARAM_INT); $stmt->execute(); $count = $stmt->fetchColumn(); return $count; }

※ fetch() と fetchall()
fetch → 1行ずつ取得
fetchall → 全データを配列に変換

※ query メソッドと prepare メソッド
query メソッド → ユーザからの入力を含まない SQL を実行
prepare メソッド → ユーザからの入力を含む SQL を実行

※ SELECT 文の実行結果が存在しない場合
fetch()メソッドはfalseを返します。COUNTの場合は、ゼロを返します。

結果の存在確認だけが目的ならば、EXISTS句を使用する。

<?php function checkCategoryExists($category) { $dbh = connect(); $sql = 'SELECT EXISTS(SELECT 1 FROM table_name WHERE category = :category)'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':category', (int)$category, PDO::PARAM_INT); $stmt->execute(); $exists = $stmt->fetchColumn(); return $exists; }

カテゴリが存在する場合には1を返し、存在しない場合には0を返します。
SELECT 1 FROM table_nameの「1」は、EXISTS句の中で特定の行が存在するかどうかを確認するためだけに使用されるプレースホルダーのようなもので、具体的なデータを取得する必要がないため、「1」などの定数を使うことが一般的。