Webアプリ制作に欠かせないのがサーバーサイド言語とデータベースの連携です。
PHPのPDOオブジェクトを用いてMySQLに接続し、読み込み・書き込みをするときに使えるコードをまとめてみました。データベースのログイン情報などを適宜書き換えていただくだけで、ほぼコピペで動くと思います。
(コードサンプル中にtry-catchを書いていたのですが、それだと丸ごとコピペできなくなってしまうためtryの中身だけ書くようにしました。必要に応じてtry-catchで囲んでくださいということで…)
##データベースに接続する
書き換える箇所:DB名、ユーザー名、パスワード
とりあえずこれで$pdo
を作ってデータベースに接続します。これがないと他のコードは動きません。
$pdo = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'ユーザー名','パスワード');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
※3行目については、手元の書籍にあったのを意味も分からず入れていたのですが、エミュレーションの無効化は無くてもいい(無い方がいい?)とコメントで教えていただきました。ありがとうございます。
##テーブルから情報を取得(SELECT)
書き換える箇所:テーブル名
whileの内部は、テーブルの内容を配列$result
に入れる処理になっています。
whileの中の$row
にテーブル一行分のデータが入っていますので、煮るなり焼くなり好きにしてください。
$rowsの中にレコード達が入っています。
(fetchAllを知らなくて、whileとただのfetchで一行ずつ取り出すとかいうことをやっていました…場合によってはその方がいいこともあるかもしれないですが)
$sql = "SELECT * FROM テーブル名";
$stmh = $pdo->prepare($sql);
$stmh->execute();
$rows = $stmh->fetchAll();
##テーブルの行を追加する(INSERT)
$sql = "INSERT INTO テーブル名(カラム名1, カラム名2, …) VALUES(:カラム名1, :カラム名2, …)";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(":カラム名1", 内容1);
$stmh->bindValue(":カラム名2", 内容2);
//以下略...
$stmh->execute();
##テーブルを更新する(UPDATE)
$sql = "UPDATE テーブル名 SET カラム名 = :カラム名";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(":カラム名", 内容);
//以下略...
$stmh->execute();
##書き込み系(INSERT,UPDATE)について
###トランザクション
複数の命令を実行する途中にエラーになったとき、データの整合性を守るために一連の命令を全部取り消すrollBackを使います。
try{
$pdo->beginTransaction();
/*
処理の内容
*/
$pdo->commit();
}catch(PDOException $Exception){
$pdo->rollBack();
echo "Updating error : ".$Exception->getMessage();
}
###bindValue
こっちはINSERT,UPDATEに限りませんが
SQLにベタ書きしてもいい気がするのですが、ループで同じようなSQLを回すときはbindValue使った方がいいのかな?
あと型によって値を'
で囲んだり囲まなかったりとかをうまいことやってくれる? でもそれには第3引数で型を指定しないといけないんだっけ…
##SQL書くときの注意
SQLのテーブル名、カラム名が日本語だったりスペース入ってたり、予約語だったり(これは特に注意)すると囲み記号で囲ってやらないといけないわけですが、このとき使う記号は `(バッククォート)
です!! '(シングルクォート)
や"(ダブルクォート)
ではエラー吐かれます。逆にvalueの文字列を囲むときは「'
」「"
」なのだけども。
(個人的に、注文を入れるテーブルとかカラムに「order」と名付けたら予約語だったというのがすごくよくあります)