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
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 \Majestic\Exception\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);
|
|
}
|
|
}
|