Вход Регистрация
Файл: 3020.ru/file_3020/_system/_classes/class.simpleMysqli.php
Строк: 294
<?php
/**
 * simpleDB is functional similarity to DBsimple class by Dmitry Koterov,
 * but written with latest versions of php language
 * and uses fast mysqli extension for mysql queries
 *
 * @author DeusModus <maximebaldin@gmail.com>
 * @link maximebaldin@gmail.com
 * @version 1.2.0
 * @package simpleDB
 * @license http://www.gnu.org/licenses/gpl-3.0.txt
 */

class simpleMysqli extends simpleDB
{
    
/**
     * The constructor expects an array, which contains connection settings:
     * <code>
    array('server' => 'localhost',
    'username' => 'root',
    'password' => '',
    'db' => 'auto',
    'port' => 3306,
    'charset' => 'utf8',
    )
     * </code>
     * @pacram  $connectionSettingsArray
     */
    
public function __construct($connectionSettingsArray)
    {
        
extract($connectionSettingsArray);
        
/**
         * @var $db
         * @var $server
         * @var $username
         * @var $password
         * @var $port
         * @var $charset
         */
        //writeLn('Инициация соединения с БД: ', $this->db = $db);
        
$this->db_resource = new mysqli($server$username$password$db$port);
        
$this->db_resource->set_charset($charset);
        
        if(
$this->db_resource->connect_error){
            throw new 
Exception($this->db_resource->connect_error);
        }
    }

    
/**
     * Starting transaction mode<br>
     * <b>Example:</b>
     * <code>
     * $db=new simpleMysqli($config);
     * $db->transactionStart();
     * $db->insert('INSERT INTO `test` set testval=?',20);
     * $db->insert('INSERT INTO `test` set testval=?',10);
     * $db->insert('INSERT INTO `test` set testval=?',123);
     * $db->transactionCommit();
     * </code>
     * @return void
     */
    
public function transactionStart()
    {
        
$this->db_resource->autocommit(false);
    }

    
/**
     * Stops transaction mode and commit query<br>
     * For example look at
     * <b>transactionStart</b> method description
     * @return void
     */
    
public function transactionCommit()
    {
        
$this->db_resource->commit();
        
$this->db_resource->autocommit(true);
    }

    
/**
     * RollBack transaction query<br>
     * <b>Example:</b>
     * <code>
     * $db=new simpleMysqli($config);
     * $db->transactionStart();
     * $db->insert('INSERT INTO `test` set testval=?',20);
     * $db->insert('INSERT INTO `test` set testval=?',10);
     * $db->insert('INSERT INTO `test` set testval=?',123);
     * $db->transactionRollBack(); // rollback changes
     * $db->transactionCommit(); // insert did not occur
     * </code>
     * @return void
     */
    
public function transactionRollBack()
    {
        
$this->db_resource->rollback();
    }

    
/**
     * Method for SELECT-like query
     * @return array|string|bool false=fail;<br>array=some methods like select, selectCol and others<br> string=methods like selectCell
     */
    
protected function s_query()
    {
        
$data null;
        
$arguments func_get_args();
        
$this->query($arguments);
        if (!
$this->stmp) return false;

        
$execute $this->stmp->execute();
        if (!
$execute) return false;

        
$result $this->bindResult($data);
        if (!
$result) return false;

        
$returnPrepareMethod $this->returnMethod;
        
$rows $this->$returnPrepareMethod($data);
        
$this->setQueryInfo();
        return 
$rows;
    }

    public function 
simpleQuery($query){
        return 
$this->db_resource->query($query);
    }

    protected function 
query($arguments)
    {
        
$this->prepareQuery($arguments);
        
$query $arguments[0];

        if (
$this->stmp$this->stmp->close();

        
$this->stmp $this->db_resource->prepare($query);
        if (!
$this->stmp) return false;

        if (
count($arguments) > 1) {
            
$bindVars $arguments;
            unset(
$bindVars[0]);
            
$params = array();
            
$binding $this->bindParams($bindVars$params);
            if (!
$binding) return false;
        }
        return 
true;
    }

    
/**
     * Method for INSERT/DELETE-like query
     * @return bool|MySQLi_STMT
     */
    
protected function i_query()
    {
        
$arguments func_get_args();
        
$this->query($arguments);
        if (!
$this->stmp) return false;

        
$execute $this->stmp->execute();
        if (!
$execute) return false;
        
$this->setQueryInfo();
        return 
true;
    }

    
/**
     * Assign to public var <b>queryInfo</b> additional info, like "num_rows" and "affected_rows"
     * @return void
     */
    
protected function setQueryInfo()
    {
        
$info = array(
            
'affected_rows' => $this->stmp->affected_rows,
            
'insert_id' => $this->stmp->insert_id,
            
'num_rows' => $this->stmp->num_rows,
            
'field_count' => $this->stmp->field_count,
            
'sqlstate' => $this->stmp->sqlstate,
        );
        
$this->queryInfo $info;
    }

    
/**
     * Returns query error
     * @return string
     */
    
public function error()
    {
        return 
$this->db_resource->error;
    }

    
/**
     * Returns query error number
     * @return string
     */
    
public function errno()
    {
        return 
$this->db_resource->errno;
    }

    
/**
     * Extended placeholder %s (array)<br>
     * @param  $arguments
     * @return void
     */
    
protected function prepareQuery(&$arguments)
    {
        
$sprintfArg = array();
        
$sprintfArg[] = $arguments[0];
        foreach (
$arguments as $pos => $var) {
            if (
is_array($var)) {
                
$insertAfterPosition $pos;
                
$replaceWith = array();
                unset(
$arguments[$pos]);
                foreach (
$var as $arrayVar) {
                    
array_splice($arguments$insertAfterPosition0$arrayVar);
                    
$insertAfterPosition++;
                    
$replaceWith[] = '?';
                }
                
$sprintfArg[] = implode(','$replaceWith);
            }
        }
        
$arguments[0] = call_user_func_array('sprintf'$sprintfArg);
    }

    
/**
     * @param  object $stmt of MySQLi_STMT class
     * @param  array $bindVars vars, that contains values for replacing
     * @param  array $params params for binding
     * @return void
     */
    
private function bindParams($bindVars, &$params)
    {
        
$params[] = $this->getParamTypes($bindVars);
        foreach (
$bindVars as $key => $param) {
            
$params[] = &$bindVars[$key]; // pass by reference, not value
        
}
        return 
call_user_func_array(array($this->stmp'bind_param'), $params);
    }

    
/**
     * Bind results with query
     * @param  $data
     * @return mixed
     */
    
private function bindResult(&$data)
    {
        
$this->stmp->store_result();
        
$variables = array();

        
$meta $this->stmp->result_metadata();
        
/**
         * @var  mysqli_result $field
         */
        
while ($field $meta->fetch_field()) {
            
$variables[] = &$data[$field->name]; // pass by reference, not value
        
}
        return 
call_user_func_array(array($this->stmp'bind_result'), $variables);
    }

    
/**
     * Mysqli fetch assoc realization
     * @param  $data
     * @return array
     */
    
private function mysqliFetchAssoc(&$data)
    {
        
$i 0;
        
$array = array();
        while (
$this->stmp->fetch())
        {
            
$array[$i] = array();
            foreach (
$data as $k => $v) {
                
$array[$i][$k] = $v;
            }
            
$i++;
        }
        return 
$array;
    }

    
/**
     * Mysqli fetch column realization
     * @param  $data
     * @return array
     */
    
private function mysqliFetchCol(&$data)
    {
        
$i 0;
        
$array = array();
        while (
$this->stmp->fetch())
        {
            
$array[$i] = array();
            foreach (
$data as $v) {
                
$array[$i] = $v;
                break;
            }
            
$i++;
        }
        return 
$array;
    }

    
/**
     * Mysqli fetch row realization
     * @param  $data
     * @return array
     */
    
private function mysqliFetchRow(&$data)
    {
        
$this->stmp->fetch();
        return 
$data;
    }

    
/**
     * Mysqli fetch cell realization
     * @param  $data
     * @return string
     */
    
private function mysqliFetchCell(&$data)
    {
        
$this->stmp->fetch();
        return 
$data[key($data)];
    }

    
/**
     * Return mysqli-comp string like <b>iis</b> (integer,integer,string) for params binding
     * @param  $arguments
     * @return string
     */
    
private function getParamTypes($arguments)
    {
        unset(
$arguments[0]);
        
$retval '';
        foreach (
$arguments as $arg) {
            
$retval .= $this->getTypeByVal($arg);
        }
        return 
$retval;
    }

    
/**
     * Simple method to detect var type(int,float or string)
     * @param  $variable
     * @return string
     */
    
protected function getTypeByVal($variable)
    {
        switch (
gettype($variable)) {
            case 
'integer':
                
$type 'i';
                break;
            case 
'double':
                
$type 'd';
                break;
            default:
                
$type 's';
        }
        return 
$type;
    }
    
/**
     * Возвращает обьект класса mysqli для нереализованных операций
     * @return mysqli
     */
    
public function _getObject(){
        return 
$this->db_resource;
    }

    public function 
__destruct()
    {
        
$this->db_resource->close();
        
//writeLn('Соединение с БД ' . $this->db . ' разорвано');
    
}
}
Онлайн: 1
Реклама