MySQL/PDOの基本

MySQLのPDOを用いた基本的な操作
自分のための備忘録

アプリケーションとDBMS(データベース管理システム)の間に入ってDBMSの違い(例えばMySQLやSQLiteなどの違い)を意識せずにアプリケーションを作成するデータアクセス抽象化レイヤというものがあり,PDOは,そのデータアクセス抽象化レイヤの一つで,PHP5.1からバンドル(標準で使える状態)されている.

CONNECT

以下のように,ホスト名・データベース(DB)名・ユーザー名・パスワードを指定する.(また5.3.7以降でcharsetが指定できるようになった.)

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

CREATE

以下のようにデータベース中にテーブルを作成できる.
テーブルの属性指定はバッククオート(`)である点に注意.(Shift+@)Macの場合は省略.「id」はオートインクリメント可能.「VARCHER」は文字列(改行できない).「INT」は数値(「 01」と登録しても「 1」になる)「TEXT」は改行も可能な文字列.「DATETIME」は 2015-02-11 18:30:54 のような形式の日付.()の中は保存できる桁数を指定している.

try {
$stmt =  $pdo->exac("CREATE TABLE table_name (
id INT auto_increment primary key,
name VARCHAR(255),
y VARCHAR(4),
m VARCHAR(4),
d VARCHAR(4),
a1 INT(11),
a2 INT,
MEMO TEXT,
i_date DATETIME
)");
} catch (PDOException $e) {
 exit('テーブル作成失敗。'.$e->getMessage());
}

SELECT

table_nameという名前のテーブルからデータ(列),具体的にはrow1,row2を呼び出す.以下のようなソース例が考えられるが,query()とexecute()は両立不可である点に注意.

$stmt = $pdo -> prepare("SELECT * FROM table_name WHERE id=:id");
$stmt -> bindValue(':id', 1, PDO::PARAM_INT);
$stmt -> execute();
if ($rows = $stmt -> fetch()) {
    $name = $rows["row1"];
    $age = $rows["row2"];
}
$stmt = $pdo -> query("SELECT row1, row2 FROM table_name");
while($row = $stmt -> fetch()) {
print "$row[row1], $row[row2] \n";
}
$stmt = $pdo -> query("SELECT row1, row2 FROM table_name");
$rows = $stmt ->fetchAll();

INSERT

INSERT関数によりテーブルに値(行)を追加できる.列を指定して値を追加することもできる.(指定しなければ全ての列について追加になる.)

$myname = "TAKAYOSHI";
$myage = "35";
$stmt = $pdo -> 
prepare("INSERT INTO table_name (id,name,age) VALUES ('', :name, :age)");
$stmt -> bindParam(':name', $myname, PDO::PARAM_STR);
$stmt -> bindValue(':age', $myage, PDO::PARAM_STR);
$myname = "IWASAKI";
$myage = "30";
$stmt -> execute();
try {
$stmt =  $pdo->
exac("INSERT INTO table_name (id,name,age) VALUES ('', :name, :age)")
} catch (PDOException $e) {
 exit('テーブルへのデータ追加失敗。'.$e->getMessage
}

FYI
「bindValue」は値をバインドしたら、その時点のセットした値が使われる.「bindParam」はバインドの後で、セットする変数の内容が変わったら、それが使われる.bindValue と bindParamはどちらも値をバインドするが,評価のタイミングが「実行時」 と「バインドした時」と異なる.

UPDATE

指定したテーブルのデータを編集(更新)できる.以下の結果は同じである.

$stmt = $pdo -> prepare("UPDATE mydata SET name =:name WHERE id = :id");
$stmt-> bindParam(':name', $myname, PDO::PARAM_STR);
$stmt-> bindValue(':id', $myid, PDO::PARAM_INT);
$stmt-> execute();
$sql = 'UPDATE mydata SET name =:name WHERE id = :id';
$stmt = $pdo -> prepare($sql);
$stmt->bindParam(':name', $myname, PDO::PARAM_STR);
$stmt->bindValue(':id', $myid, PDO::PARAM_INT);
$stmt->execute();

DELETE

指定したテーブルのデータないしそのテーブル自体,データベース自体を削除できる.Aはレコードを削除,Bはテーブルを削除

$stmt = $pdo -> prepare("DELETE FROM mydata WHERE id = :delete_id");
$stmt -> bindValue(':delete_id', $myid, PDO::PARAM_INT);
$stmt -> execute();
$sql = "DROP TABLE IF EXISTS テーブル名";
$pdo -> exec($sql);

COUNT

指定したテーブルの行数を得られる.

$stmt = $pdo -> prepare("SELECT * FROM mydata WHERE age = :age");
$stmt -> bindValue(':age', $user_age, PDO::PARAM_INT);
$stmt -> execute();
$count = $stmt -> rowCount();

この記事が気に入ったらサポートをしてみませんか?