Класс обертки Mysqli by Koenig (Допилить)

9.21K
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
# Delphinum (22.08.2013 / 07:53)
L!MP, тогда я снова тебя не так понял ) У меня нет неприязни к билдерам, я просто их не применяю так как есть более удобные решения.
AlkatraZ, по долгу службы мне часто приходится использовать разны
Если к примеру клиент заставляет тебя писать какой-либо РНР скрипт под базу Firebird, по большой доле вероятности, или у этого клиента с психикой не все в порядке, или у его консультантов, или же клиент настолько отрован от реальности и незнаком с предметом, что использует понравившееся (Firebird к примеру) слово, или же попались недобросовестные консультанты (ты в этом случае попадаешь в их число), которые хотят "запудрить" клиенту мозги и снять с него побольше денег.

Твоя ОБЯЗАННОСТЬ как исполнителя, объяснить клиенту, что он заблуждается и что при использовании РНР скриптов не надо вдаряться в различную экзотику, ибо потом значительно возрастает стоимость сопровождения и снижается надежность.
---
AlkatraZ, по долгу службы мне часто приходится использовать разные СУБД (клиенты адовые попадаются)
Я с 1996 года работаю в IT сфере (начальник IT отдела), WEB Разработкой занимаюсь с 1998 года, клиентов за это время сам понимаешь, прошла туча, "тыщи их", но ни разу не пришлось применять Oracle, или DB2, или Firebird.
MSSQL очень давно (в 2001 - 2003 годах) применял по собственному почину (ибо ничего другого достойного в то время не было, да и программировал я тогда на MS ASP), но после выхода MySQL 4, уже более как 10 лет отказался от этого извращения в WEB программировании.

К чему я столь подробно вдарился в историю?
А к тому, что я сильно сомневаюсь, что тебе хоть раз приходилось делать заказы на DB2, Oracle, или Firebird. Если все же делать приходилось, мне крайне интересно глянуть тот сайт, на котором это работает, буду благодарен за ссылку.
.
AlkatraZ, все гораздо проще, мы работаем с бюджетными учреждениями, а им советовать сменить их FoxPro на более современную MS SQL смысла нет, советов они не слушают, потому приходится работать на том, что есть.
К примеру в управлении ФСБ по ингушской республике применяется Oracle DB, и советовать им перейти на MySQL мы не можем )
Есть пример сайта на MySQL и той же платформы на PostgreSQL, скоро планируется сайт на MS SQL для администрации города. Так же планируется разработка образовательной системы на базе моей платформы, которая сможет работать как в небольших ВУЗах (MySQL), так и на уровне республики (MS SQL или Oracle DB). Приходится планировать платформу заранее, тем более это не так сложно.
Показать примеры сайтов на постгри и мускуле? )))
.
Мы считаем что если клиент уже использует СУБД, не нужно ему советовать покупать еще одну СУБД или переходить на другую, так как на этой СУБД у него стоят другие системы, а мы лишь подстраиваемся под него. Мне кажется не правильным требовать от клиента конкретной СУБД только потому, что наша платформа умеет работать только с ней.
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
# Delphinum (22.08.2013 / 14:07)
Мы считаем что если клиент уже использует СУБД, не нужно ему советовать покупать еще одну СУБД или переходить на другую, так как на этой СУБД у него стоят другие системы, а мы лишь подстраиваемся под
Уважаемый, не забывай, что мы говорим не про офисные приложения, а про PHP и сайтостроение
Сайт на FoxPro это представляю какой будет лулз гг
Да и я сильно сомневаюсь, что управление ФСБ вдруг разрешит тебе использовать свою внутреннюю базу на Oracle в интернете, дико нарушается конфиденциальность и безопасность.
---
Посему не путай понятия.
Для сайтостроения для 95% случаев хватит MySQL.
Если надо опубликовать какие-то данные из внутренней (закрытой) базы на сайте, пишется программа, которая делает выборку и посылает запрос на добавление в базу сайта.

Иначе можешь наворотить такого, что не ФСБ будет твоим клиентом, а ты их
.
(\/)____o_O____(\/)
тут вопрос назрел, а если сотворить апи для какого нибудь сайта и потом просто как с орм общаться с сайтом и не задумываться об СУБД на которой сайт. по сути прослойка, просто данный класс как бы для апи и пишется
.
Koenig, при данном подходе людям, которые будут пользоваться апи прийдеться знать структуру базы, что им совсем не к чему.
это если я правильно понял.
.
(\/)____o_O____(\/)
flaky, структура известная, плюс дока к апи
.
AlkatraZ, я не говорю о сайтостроение, моя платформа позволяет писать не только web сайты, но и приложения с web мордой, а про базу ФСБ - у них там не сайт, у них система расчета зарплаты
.
(\/)____o_O____(\/)
еще обнова
/**
* KoeNysqli
* 
* Обертка для Mysqli
* 
* @author Koenig <http://johncms.com/users/profile.php?user=6565>
* @version 1.2
*/

class KoeMysql extends Mysqli
{
   /**
   * limit
   * 
   * @var integer or array 
   */    
  private $limit = false;
   /**
   * условия
   * 
   * @var array
   */
  private $where = array(); 
   /**
   * условия сортировки
   * 
   * @var array 
   */
  private $sort = array();
   /**
   * constructor
   * 
   * @param string $db_host
   * @param string $db_user
   * @param string $db_pass
   * @param string $db_name
   * @param string $db_charset
   * @param integer $port
   * @return mysqli_stmt
   */
  public function __construct($db_host, $db_user, $db_pass, $db_name, $db_charset, $port = 3306)
  {
    @parent::__construct($db_host, $db_user, $db_pass, $db_name, $port);
    @$this->set_charset($db_charset);
    if ($this->connect_errno) die($this->connect_error);
  }
  /**
  * stmt count params => ?
  * 
  * @return integer
  */
  public function count_params()
  {
    return $this->stmt ? $this->stmt->param_count : die('stmt not started');
  }
  /**
  * stmt count fields in result
  * 
  * @param void
  * @return integer
  */
  public function count_fields()
  {
    return $this->stmt ? $this->stmt->field_count : die('stmt not started');
  }
  /**
  * return yes/no fetch result
  * 
  * @param void
  * @return boolean
  */
  public function is_fetch()
  {
    if ($this->stmt) {
      return preg_match('/select/i', $this->sql) ? true : false;
    }
    else {
      die('Query not execute');
    }
  }
  /**
  * sql
  * 
  * @param string $sql
  * @return mysqli_stmt
  */
  public function sql($sql) {
     $this->sql = $sql; 
     return $this;
  }
  /**
  * result
  * 
  * @param mixed $placeholders
  * @return array|integer|boolean
  */
  public function result($placeholders = null)
  {
    $this->sql .= $this->get_where() . $this->get_sort() . $this->get_limit();
    if (!$this->stmt = $this->prepare($this->sql)) {
      die('error sql <<< ' . $this->sql . ' >>>');
    }
    if ($this->count_params() && $placeholders) {
      if (!$this->set_placeholders($placeholders)) {
        die('Placeholders failed');
      }
    }
    if (!$this->is_fetch()) {
      $this->stmt->execute();
      return $this->stmt->affected_rows;
    }
    else {
      $this->stmt->execute();
      if (!$this->bind_result()) {
        die('Bind result failed');
      }
    }
    $this->limit = false;
    $this->sort = array();
    $this->where = array();
    return $this->fetch_result();                 
  }
  /**
  * autofetch
  * 
  * @param void
  * @return array|integer|boolean
  */
  public function fetch_result()
  {
    if (!$this->stmt->num_rows) {
      $return = false;
    }
    if ($this->count_fields() == 1) {
      $res = $this->stmt->get_result();
      $row = $res->fetch_row();
      $return = $row[0];
    }
    else {
      $return = array();
      $res = $this->stmt->get_result();
      while ($row = $res->fetch_assoc()) {
        array_push($return, $row);
      }
    }
    return $return;
  }
  /**
  * bind result for placeholders
  * @param void
  * @return mysqli_stmt
  */
  public function bind_result()
  {
    $result = array();
    $binds = array();
    $meta = $this->stmt->result_metadata();
    while ($field = $meta->fetch_field()) {
      $binds[] = & $row[$field->name];
    }
    if (!call_user_func_array(array(
      $this->stmt,
      'bind_result'
    ) , $binds)) {
      die('Not bind result');
    }
    return $this->stmt;
  }
  /**
  * set placeholders
  * 
  * @param array $args
  * @return mysqli_stmt
  */
  public function set_placeholders($args)
  {
    if (!is_array($args)) {
      $args = array(
        $args
      );
    }
    $types = '';
    $newarray = array();
    for ($i = 0; $i < sizeof($args); $i++) {
      $types.= is_numeric($args[$i]) ? 'i' : ((is_double($args[$i]) || is_float($args[$i])) ? 'd' : 's');
      $newarray[] = $args[$i];
    }
    $args = array();
    $args[] = $types;
    foreach($newarray as $k => $v) {
      $args[] = & $newarray[$k];
    }
    if (!call_user_func_array(array(
      $this->stmt,
      'bind_param'
    ) , $args)) {
      die('Not bind params');
    }
    return $this->stmt;
  }
  /**
  * add where
  * 
  * @param string $field
  * @param string $type
  * @param string $value
  */
  public function where($field, $type, $value)
  {
    $str = in_array($type, array(
      '=',
      '!=',
      '>',
      '<',
      '<=',
      '>=',
      'like',
      'regexp'
    )) 
    ? '`' . $field . '`' . $type . (is_int($value) ? $value : ($value == '?' ? $value : ($type == 'like' ? "'%" . $value . "%'" : "'" . $value . "'"))) 
    : die('invalid argument in where');
    if ($type == 'in') {
      $str = 'in(';
      $value = is_array($value) && sizeof($value) > 0 ? $value : die('invalid arguments in where');
      $i = sizeof($value);
      $x = 1;
        foreach($value as $val) {
          $str.= is_int($val) || $val == '?' ? $val : "'" . $value . "'";
            if ($x != $i) {
              $str.= ', ';
            }
            else {
              $str.= ' ';
            }
          $x++;
        }
      $str.= ')';
    }
    $this->where[] = $str;
    return $this;
  }
  /**
  * set limits
  * 
  * @param array or integer $args
  @return mysqli_stmt 
  */
  public function limit($args)
  {
    if (is_array($args) && sizeof($args) == 2) {
      $str = ' LIMIT ' . implode(' ,', array_values($args));
    }
    elseif (is_int($args)) {
      $str = ' LIMIT ' . $args;
    }
    else {
      die('Number of arguments 1 (string) or 2 (array)');
    }
    $this->limit = $str;
    return $this;
  }
  /**
  * set sort params
  * 
  * @param array $args
  * @return mysqli_stmt 
  */
  public function order($field, $type)
  {
    $type = in_array(mb_strtolower($type), array('asc', 'desc')) ? $type : die('invalid arguments in order');  
    $this->sort[] = '`' . $field . '` ' . mb_strtoupper($type); 
    return $this;
  }
  /**
  * get sort
  * 
  * @param void
  * @return string @sort
  */
  public function get_sort()
  {
    $this->sql .= ' ORDER BY ' . implode(' ,', array_values($this->sort)); ;
  }
  /**
  * get limit
  * 
  * @param void
  * @return string @limit
  */  
  public function get_limit()
  {
    $this->sql .= $this->limit;
  }
  /**
  * get where
  * 
  * @param void
  * @return string @where
  */  
  public function get_where()
  {
    $this->sql .= sizeof($this->where) > 0 ? ' WHERE ' .  implode(' AND ', array_values($this->where)) : '';
  }

}
Прикрепленные файлы:
.
(\/)____o_O____(\/)
пример
/* 
-- 
-- Table structure for table `table` 
-- 

CREATE TABLE IF NOT EXISTS `table` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `name` text NOT NULL, 
  `pass` varchar(32) NOT NULL, 
  `time` int(11) NOT NULL, 
  `pid` int(11) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
*/ 

$db_host = 'localhost'; 
$db_user = 'root'; 
$db_pass = ''; 
$db_name = 'test'; 
$db_charset = 'utf-8'; 

$mysqli = new KoeMysql($db_host, $db_user, $db_pass, $db_name, $db_charset);

$sql = "select * from `table`";
$placeholders = array(100, 213);
$res = $mysqli->sql($sql)->where('id', '>', '?')->where('pid', '=', '?')->order('id', 'desc')->order('pid', 'asc')->limit(array(5, 10))->result($placeholders);
echo $mysqli->sql;
echo '<pre>'; print_r($res);

далее уже придумал как реализовать OR
будет в следующих версиях
Всего: 362