Обёртка для работы с PDO
Интерфейс PDO для работы с базами данных в PHP является удобным и мощным по сравнению со старыми интерфейсами, например, функциями mysql_* и аналогичными. Однако, часто оказывается, что программный код скрипта оказывается переполнен служебными конструкциями, которые хорошо бы было спрятать от глаз подальше в какую-нибудь оболочку, ещё более упростившую бы работу с базой.
Я использую для своих целей такую оболочку (см. ниже). Благодаря ей, большинство обращений к базе данных укладываются в одну строку кода, и в результате программа содержит минимум "обрамляющего" кода, становясь компактнее и гораздо лучше читаемой.
class Db { private $db; public function __construct($db) { $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->db = $db; } public function insert($table, $fields, $insertParams = null) { try { $result = null; $names = ''; $vals = ''; foreach ($fields as $name => $val) { if (isset($names[0])) { $names .= ', '; $vals .= ', '; } $names .= $name; $vals .= ':' . $name; } $ignore = isset($insertParams['ignore']) && $insertParams['ignore']? 'IGNORE': ''; $sql = "INSERT $ignore INTO " . $table . ' (' . $names . ') VALUES (' . $vals . ')'; $rs = $this->db->prepare($sql); foreach ($fields as $name => $val) { $rs->bindValue(':' . $name, $val); } if ($rs->execute()) { $result = $this->db->lastInsertId(null); } return $result; } catch(Exception $e) { $this->report($e); } } // Returns true/false public function update($table, $fields, $where, $params = null) { try { $sql = 'UPDATE ' . $table . ' SET '; $first = true; foreach (array_keys($fields) as $name) { if (!$first) { $first = false; $sql .= ', '; } $first = false; $sql .= $name . ' = :_' . $name; } if (!is_array($params)) { $params = array(); } $sql .= ' WHERE ' . $where; $rs = $this->db->prepare($sql); foreach ($fields as $name => $val) { $params[':_' . $name] = $val; } $result = $rs->execute($params); return $result; } catch(Exception $e) { $this->report($e); } } public function queryValue($query, $params = null) { try { $result = null; $stmt = $this->db->prepare($query); if ($stmt->execute($params)) { $result = $stmt->fetchColumn(); $stmt->closeCursor(); } return $result; } catch(Exception $e) { $this->report($e); } } public function queryValues($query, $params = null) { try { $result = null; $stmt = $this->db->prepare($query); if ($stmt->execute($params)) { $result = array(); while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $result[] = $row[0]; } } return $result; } catch(Exception $e) { $this->report($e); } } public function queryRow($query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) { $rows = $this->queryRowOrRows(true, $query, $params, $fetchStyle, $classname); return $rows; } public function queryRows($query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) { $rows = $this->queryRowOrRows(false, $query, $params, $fetchStyle, $classname); return $rows; } private function queryRowOrRows($singleRow, $query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) { try { $result = null; $stmt = $this->db->prepare($query); if($classname) { $stmt->setFetchMode($fetchStyle, $classname); } else { $stmt->setFetchMode($fetchStyle); } if ($stmt->execute($params)) { $result = $singleRow? $stmt->fetch(): $stmt->fetchAll(); $stmt->closeCursor(); } return $result; } catch(Exception $e) { $this->report($e); } } public function quote($str) { return $this->db->quote($str); } public function quoteArray($arr) { $result = array(); foreach ($arr as $val) { $result[] = $this->db->quote($val); } return $result; } public function quoteImplodeArray($arr) { return implode(',', $this->quoteArray($arr)); } // returns true/false public function sql($query, $params = null) { try { $result = null; $stmt = $this->db->prepare($query); return $stmt->execute($params); } catch(Exception $e) { $this->report($e); } } private function report($e) { throw $e; } }
А вот и пример работы:
$pdo = new PDO($dsn, $user, $password); $db = new Db($pdo); // Выборка одного значения $count = $db->queryValue('SELECT COUNT(*) FROM users'); // Выборка набора записей $users = $db->queryRows('SELECT * FROM users WHERE name LIKE ?', array('%username%')); // Выборка одной записи $user = $db->queryRow('SELECT * FROM users WHERE id=:id', array(':id' => 123)); // Добавление записи (INSERT) и получение значения поля AUTO_INCREMENT $newUserId = $db->insert('users', array('name' => 'NewUserName', 'password' => 'zzxxcc')); // Изменение записи (UPDATE) $db->update('users', array('name' => 'UpdatedName'), 'id=:id', array(':id' => $newUserId));
Возможно, и вам пригодится!