PHP PDOのスニペット集
このページは、PHPのPDOのスニペットなどをまとめる予定のページです。
目次
注意
- コードのライセンスはCC0 (クレジット表示不要、改変可、商用可) です。
スニペット
PDO の生成
setAttribute()
※ コンストラクタの引数で指定しても可
getAttribute()
パラメータのバインド
bindParam()
も使用できますが、bindValue()
のほうが問題が少ないです。
SQL の実行
トランザクション
直近の INSERT ID の取得
ユーティリティ関数
PDO 簡易関数
ORMやクエリビルダなどのライブラリを使うまでもない場合に使用するための関数です。
<?php
/**
* PDOを生成します。
* @param array|string $params DSN生成用のパラメータまたはDSN文字列
* @param string $user DBユーザー名
* @param string $password DBパスワード
* @param array $options PDOオプション
* @return PDO
*/
function pdo($params, $user = null, $password = null, array $options = array()) {
// DSN文字列指定の場合はそのまま使用
if (is_string($params)) $dsn = $params;
// その他の場合はDSN文字列化 (MySQL等)
else {
$dsn = strtolower($params['driver']) . ':';
// SQLite: source にあるファイルパスまたは:memory:をセット
if ($dsn == 'sqlite:') $dsn .= $params['source'];
// その他: パラメータを文字列化 (mysql:dbname=testdb;host=localhost 等)
else foreach ($params as $k => $v) $dsn .= "{$k}={$v};";
}
$user = (is_array($params) && isset($params['user'])) ? $params['user'] : $user;
$password = (is_array($params) && isset($params['password'])) ? $params['password'] : $password;
return new PDO($dsn, $user, $password, $options);
}
/**
* クエリ(SELECT, INSERT, UPDATE, DELETE)を実行します。
* @param PDO $pdo 対象PDO
* @param string $query SQL文
* @param array $params SQL文のパラメータ
* @return PDOStatement
*/
function pdo_query(PDO $pdo, $query, array $params = array()) {
$keys = array_keys($params);
$isAssoc = ($keys !== range(0, count($keys)-1));
$st = $pdo->prepare($query);
foreach ($params as $k => $v) {
$name = ($isAssoc) ? ':' . $k : ($k + 1);
$dataType = (!is_string($v) && is_int($v)) ? PDO::PARAM_INT : PDO::PARAM_STR;
$st->bindValue($name, $v, $dataType);
}
$st->execute();
return $st;
}
/**
* クエリ(主にSELECT文)を実行し、結果を配列で取得します。
* @param PDO $pdo 対象PDO
* @param string $query SQL文
* @param array $params SQL文のパラメータ
* @return array
*/
function pdo_query_all(PDO $pdo, $query, array $params = array()) { return pdo_query($pdo, $query, $params)->fetchAll(); }
/**
* クエリ(主にSELECT文)を実行し、結果を1行取得します。
* @param PDO $pdo 対象PDO
* @param string $query SQL文
* @param array $params SQL文のパラメータ
* @return mixed
*/
function pdo_query_one(PDO $pdo, $query, array $params = array()) { return pdo_query($pdo, $query, $params)->fetch(); }
/**
* クエリ(主にSELECT文)を実行し、結果の先頭行の先頭列の値を1つ取得します。
* @param PDO $pdo 対象PDO
* @param string $query SQL文
* @param array $params SQL文のパラメータ
* @return mixed
*/
function pdo_query_var(PDO $pdo, $query, array $params = array()) { $row = pdo_query($pdo, $query, $params)->fetch(PDO::FETCH_NUM); return $row ? $row[0] : false; }
/**
* INSERT文を実行します。(引数からSQLを生成して実行します)
* @param PDO $pdo 対象PDO
* @param string $table 対象テーブル名
* @param array $fields 列名と値を持つ連想配列 (array('id' => 1) 等)
* @return int
*/
function pdo_insert(PDO $pdo, $table, array $fields) {
$keys = array_keys($fields);
$fieldInfo = '';
$isAssoc = ($keys !== range(0, count($keys)-1));
if ($isAssoc) {
$q = ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') ? '`' : '"';
foreach ($keys as $k) {
$fieldInfo .= ", {$q}{$k}{$q}";
}
$fieldInfo = '(' . substr($fieldInfo, 2) . ')';
}
$st = $pdo->prepare("INSERT INTO {$table}{$fieldInfo} VALUES (" . implode(', ', array_fill(0, count($keys), '?')) . ')');
$st->execute(array_values($fields));
return $st->rowCount();
}
/**
* UPDATE文を実行します。(引数からSQLを生成して実行します)
* @param PDO $pdo 対象PDO
* @param string $table 対象テーブル名
* @param array $fields 列名と値を持つ連想配列 (array('id' => 1) 等)
* @param string $where WHERE句 ('id = ?', 'id = :id' 等)
* @param array $params WHERE句のパラメータ (array(1), array('id' => 1) 等)
* @return int
*/
function pdo_update(PDO $pdo, $table, array $fields, $where = null, array $params = array()) {
$q = ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') ? '`' : '"';
$paramKeys = array_keys($params);
$isParamsAssoc = ($paramKeys !== range(0, count($paramKeys)-1));
$fieldInfo = '';
$newFields = array();
// フィールドパラメータを WHERE パラメータに合わせる (連想配列か通常配列)
if ($isParamsAssoc) {
$i = 1;
foreach ($fields as $k => $v) {
$newFieldKey = '__' . $i;
$newFields[$newFieldKey] = $v;
$fieldInfo .= ", {$q}{$k}{$q}=:{$newFieldKey}";
$i++;
}
}
else {
foreach ($fields as $k => $v) {
$newFields[] = $v;
$fieldInfo .= ", {$q}{$k}{$q}=?";
}
}
$fieldInfo = substr($fieldInfo, 2);
$params = array_merge($newFields, $params);
$st = $pdo->prepare("UPDATE {$table} SET {$fieldInfo}" . ($where ? " WHERE {$where}" : ''));
$st->execute($params);
return $st->rowCount();
}
/**
* DELETE文を実行します。(引数からSQLを生成して実行します)
* @param PDO $pdo 対象PDO
* @param string $table 対象テーブル名
* @param string $where WHERE句 ('id = ?', 'id = :id' 等)
* @param array $params WHERE句のパラメータ (array(1), array('id' => 1) 等)
* @return int
*/
function pdo_delete(PDO $pdo, $table, $where = null, array $params = array()) {
$st = pdo_query($pdo, "DELETE FROM {$table}" . ($where ? " WHERE {$where}" : ''), $params);
return $st->rowCount();
}