Edited at

PHPをあまり使った事がない人がPDOを使ってデータベースを構築してみた

More than 1 year has passed since last update.

普段phpを使わないのですが、データベースを使ってのデータ構築を考えてみた。

サーバーでがっつり借りてはないけどlolipopとかで、wordpressとかは入れられるけどーみたいなのに毛が生えた程度のリファレンス

サーバーサイドの人に任せると、印象としては、頼んだ事の数倍面倒な事をやってるのか、結構時間かかる感じだったので自分で実装してみた時のサンプルを用意しました(管理画面とか作ってくれたり、拡張性をもたせてくれてるというのは理解しているが、スピードが大事だったりする)

一応、少し間違った事も書くかもしれないのですが、逆に構築してどうこうするというのが分かりにくいリファレンスしか見当たらなかったので書いてみます


qiita.php


try {
$pdo = new PDO('mysql:host=**********.jp;dbname=データベース名;charset=utf8','ユーザー名','パスワード',
array(PDO::ATTR_EMULATE_PREPARES => false));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
exit('データベース接続失敗。'.$e->getMessage());
}


が接続まで、ここでsetAttributeでエラー出してねみたいなのを書かないとエラーが出ないので追加をしておきます。optionなどで設定してるのもあったのですが、取り急ぎこの書き方

tryのかっこの中に書くのが前提ですが

テーブルの作り方


qiita.php

$sql = 'CREATE TABLE gamedata (

id INT(11) AUTO_INCREMENT PRIMARY KEY,
time INT(255),
name VARCHAR(4),
userid VARCHAR(40),
data VARCHAR(1000),
registry_datetime DATETIME
) engine=innodb default charset=utf8'
;
$res = $pdo->query($sql);

作ったテーブルに値を追加する方法


qiita.php

$sql = "INSERT INTO gamedata (time, name, userid, data,registry_datetime) VALUES (:time, :name, :userid, :data, now())";

// 挿入する値は空のまま、SQL実行の準備をする
$stmt = $pdo->prepare($sql);
// 挿入する値を配列に格納する
$params = array(':time' => '12322', ':name' => '名前', ':userid' => 'TESTTEST', ':data' => 'AAAAAAAAAAAAAAAA');
// 挿入する値が入った変数をexecuteにセットしてSQLを実行
$stmt->execute($params);

登録した値を更新する方法(USERIDを選択した値で、名前と時間を編集)


qiita.php

$sql = 'update gamedata set name =:name,time =:time where userid = :value';

$stmt = $pdo -> prepare($sql);
$stmt->bindValue(':name', 'な', PDO::PARAM_STR);
$stmt->bindValue(':time', 3, PDO::PARAM_INT);
$stmt->bindValue(':value', 'TEST', PDO::PARAM_STR);
$stmt->execute();

テーブルの中に登録されてる要素数


qiita.php

$sql = 'select count(*) from gamedata';

$stmt = $pdo->query($sql);
echo '行数:'.$stmt->fetchColumn();

テーブルの中から要素を取得する


qiita.php

$smt = $pdo->query('select * from gamedata WHERE time <= 1000 order by time desc limit 1 offset 1');

// 実行結果を配列に返す。
$select_data = $smt->fetchAll();
var_dump($select_data);

値の制限、順番 数 offsetで欲しいデータが取得できる。

特定の条件の要素の数を取得する


qiita.php

$sql = 'select count(*) from gamedata where userid = :value';

$stmt = $pdo -> prepare($sql);
$stmt->bindValue(':value', 'TEST12345TEST', PDO::PARAM_STR);
$stmt->execute();
echo $stmt->fetchColumn();

存在条件も数で取得をしてしまった方がいいかと思っていて、

この形式で登録ができました。

というか、これだけあれば組み合わせて目的のが自分で作れそう。追加の時にURLエンコードとかだけちゃんとやっとけばセキュリティ的に最低限は大丈夫と思いたい