You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.2 KiB

<?php namespace Majestic\Model;
/**
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage db
* @since 2010-02-17
*/
/**
* @property \MySQLi $connection
*/
class MySQLiDriver extends SqlDbDriver
{
public function insert($table, $bind, $on_duplicate = array())
{
$columns = array();
foreach ($bind as $col => $val) {
$columns[] = $this->quoteIdentifier($col);
}
$values = array_values($bind);
if ($on_duplicate) {
$update = array();
foreach ($on_duplicate as $col => $val) {
$update[] = $this->quoteIdentifier($col) . '=' . $this->quote($val);
}
$on_duplicate = ' ON DUPLICATE KEY UPDATE ' . implode(', ', $update);
}
$sql = 'INSERT INTO ' . $this->quoteIdentifier($table)
. ' (' . implode(', ', $columns) . ') VALUES (' . $this->quote($values) . ')'
. (($on_duplicate) ? $on_duplicate : '');
return $this->query($sql)->affectedRows();
}
/**
* @param mixed $sql
* @return MySQLiStatement
*/
public function prepare($sql)
{
return new MySQLiStatement($this, $sql);
}
public function getInsertId($table = null, $key = null)
{
return $this->connection->insert_id;
}
public function isConnected()
{
return ($this->connection instanceof \MySQLi);
}
public function disconnect()
{
if ($this->isConnected()) {
$this->connection->close();
}
$this->connection = null;
}
protected function connect()
{
if ($this->connection) {
return;
}
$port = isset($this->config['port']) ? (int) $this->config['port'] : null;
$this->connection = mysqli_init();
@mysqli_real_connect($this->connection,
$this->config['hostname'],
$this->config['username'],
$this->config['password'],
$this->config['database'],
$port);
// Connection errors check
if (mysqli_connect_error()) {
throw new GeneralException(mysqli_connect_error(), mysqli_connect_errno());
}
$charset = (!empty($this->config['charset'])) ? $this->config['charset'] : 'utf8';
$this->connection->set_charset($charset);
}
protected function driverQuote($value)
{
if (is_int($value) || is_float($value)) {
return $value;
}
if (is_bool($value)) {
return (int) $value;
}
if ($value === null) {
return 'NULL';
}
$this->connect();
return '\'' . $this->connection->real_escape_string($value) . '\'';
}
protected function driverBeginTransaction()
{
$this->connect();
$this->connection->autocommit(false);
}
protected function driverCommitTransaction()
{
$this->connection->commit();
$this->connection->autocommit(true);
}
protected function driverRollbackTransaction()
{
$this->connection->rollback();
$this->connection->autocommit(true);
}
}