ФорумРазработкаБазы данных → Срачь из темы про goDB

Срачь из темы про goDB

  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:14

    а я вот постепенно отказываюсь от своих либ для работы с базой. Да, это все удобно, но нужно следовать стандартам {+++25+++} хотя буду задрачивать доктриновцев что б они добавили некоторые фичи
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:17, спустя 2 минуты 37 секунд

    что для тебя стандарт?
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5201 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:26, спустя 9 минут 33 секунды

    я вообще в случае с query($sql, $params)  за query bilder. Для тех кто в такне, что то типа такого:
    <?php
    /**
    * @package Query.php
    * @version 1.0
    * @author Konstantin Gerasimov
    * @copyright Copyright © 2009, Konstantin Gerasimov
    * @license LGPL
    */
    class Query  {

     const SELECT = &#39;Select&#39;;
     const INSERT = &#39;Insert&#39;;
     const UPDATE = &#39;Update&#39;;
     const DELETE = &#39;Delete&#39;;
    const ASC = &#39;ASC&#39;;
    const DESC = &#39;DESC&#39;;
    /**
    * @var array
    */
    private $_Tables;
    /**
    * @var array
    */
    private $_Fields;
    /**
    * @var array
    */
    private $_Functions;
    /**
    * @var array
    */
    private $_Values;
    /**
    * @var array
    */
    private $_Joins;
    /**
    * @var array
    */
    private $_Where;
    /**
    * @var array
    */
    private $_Orders;
    /**
    * @var string
    */
    private $_Limit;
    /**
    * @var int
    */
    private $_Type;
    /**
    * @var array
    */
    private $_Binds;
     /**
      * @var string
      */
     private $_Sql;
    /**
    * @param string $QueryType self::SELECT
    */
     public function __construct($QueryType = self::SELECT)
     {
       if (($QueryType !== self::SELECT) &amp;&amp;
           ($QueryType !== self::INSERT) &amp;&amp;
           ($QueryType !== self::UPDATE) &amp;&amp;
           ($QueryType !== self::DELETE)) {
         throw new Exception(&#39;Unknown type of Query &quot;&#39; . $QueryType . &#39;&quot;&#39;);
       }
    $this->_Type = $QueryType;
    $this->_Tables = array();
    $this->_Values = array();
    $this->_Fields = array();
    $this->_Functions = array();
    $this->_Joins  = array();
    $this->_Where  = array();
    $this->_Orders = array();
    $this->_Limit  = NULL;
    $this->_Binds  = array();
       $this->_Sql = NULL;
     }
    /**
    * @param string $TableName
    * @param string $FieldName
      * @param string $FieldAlias &#39;&#39;
    * @param string $TableAlias &#39;&#39;
    * @return Query
    */
    public function AddField($TableName, $FieldName, $FieldAlias = &#39;&#39;, $TableAlias = &#39;&#39;)
    {
       $this->_ClearSqlCache();
    if(empty($FieldName) || empty($TableName)) {
    throw new Exception(&#39;Empty FeildName =&quot;&#39; . $FieldName . &#39;&quot; or/and TableName=&quot;&#39; . $TableName . &#39;&quot;&#39;);
    }
    $FieldName = Str::Strtolower($FieldName);
    $TableName = Str::Strtolower($TableName);
       $FieldAlias = Str::Strtolower($FieldAlias);
    $TableAlias = Str::Strtolower($TableAlias);
       $Key = $TableName . &#39;|&#39; . $FieldName . &#39;|&#39; . $FieldAlias . &#39;|&#39; . $TableAlias;
       if (!isset($this->_Fields[$Key])) {
         $this->_Fields[$Key] = array($TableName, $FieldName);
         if (!empty($FieldAlias)) {
           $this->_Fields[$Key][] = $FieldAlias;
           if (!empty($TableAlias)) {
             $this->_Fields[$Key][] = $TableAlias;
           }
         }
       }
    return $this;
    }
     
     public function ClearFields()
     {
       $this->_Fields = array();
     }
     /**
      *
      * @param string $FieldName
      * @param mixed $Value
      * @param string $Format
      * @return Query
      */
     public function AddValue($FieldName, $Value, $Format)
     {
       $this->_ClearSqlCache();
       if (!Db::IsDbFormat($Format)) {
         throw new Exception(&#39;Unknown db format &quot;&#39; . $Format . &#39;&quot;&#39;);
       }
       $this->_Values[Str::Strtolower($FieldName)] = array($Value, $Format);
       return $this;
     }
    /**
    * @param string $TableName
    * @param string $TableAlias &#39;&#39;
    * @return Query
    */
    public function AddTable($TableName, $TableAlias = &#39;&#39;)
    {
       $this->_ClearSqlCache();
    $Key = $TableName . &#39;|&#39; . $TableAlias;
    if (!isset($this->_Tables[$Key])) {
    $this->_Tables[$Key] = $TableName;
         if (!empty($TableAlias)) {
           $this->_Tables[$Key] = array($TableName, $TableAlias);
         }
    }
    return $this;
    }
    /**
    * @param string $WhereString
    * @param array $Binds array()
    * @return Query
    */
    public function AddWhere($WhereString, $Binds = array())
    {
       $this->_ClearSqlCache();
    if (empty($WhereString)) {
    throw new Exception(&#39;Empty where string&#39;);
    }
    if (!is_array($Binds)) {
    throw new Exception(&#39;Binds is not an array&#39;);
    }
    $this->_Where[] = array($WhereString, $Binds);
    return $this;
    }
    /**
    * @param string $JoinString
    * @param array $Binds array()
    * @return Query
    */
    public function AddJoin($JoinString, $Binds = array())
    {
       $this->_ClearSqlCache();
    if (empty($JoinString)) {
    throw new Exception(&#39;Empty join string&#39;);
    }
    if (!is_array($Binds)) {
    throw new Exception(&#39;Binds is not an array&#39;);
    }
       $Key = $JoinString . md5(serialize($Binds));
       if (!isset($this->_Joins[$Key])) {
         $this->_Joins[$Key] = array($JoinString, $Binds);
       }
    return $this;
    }
    /**
    * @param string $Type
    * @param string $TableName
    * @param string $FieldName
      * @param string $FieldAlias &#39;&#39;
    * @param string $TableAlias &#39;&#39;
    * @return Query
    */
    public function AddOrder($Type, $TableName, $FieldName, $FieldAlias = &#39;&#39;, $TableAlias = &#39;&#39;)
    {
       $this->_ClearSqlCache();
    if (($Type !== self::ASC) &amp;&amp;
           ($Type !== self::DESC)) {
    throw new Exception(&#39;Wrong order type &quot;&#39; . $Type . &#39;&quot;&#39;);
    }
       $Key = $TableName . &#39;|&#39; . $FieldName . &#39;|&#39; . $FieldAlias . &#39;|&#39; . $TableAlias . &#39;|&#39; . $Type;
       if (!isset($this->_Orders[$Key])) {
         $this->_Orders[$Key] = array($Type, $TableName, $FieldName);
         if (!empty($FieldAlias)) {
           $this->_Orders[$Key][] = $FieldAlias;
           if (!empty($TableAlias)) {
             $this->_Orders[$Key][] = $TableAlias;
           }
         }
         if (!empty($TableAlias) &amp;&amp; empty($FieldAlias)) {
           $this->_Orders[$Key][] = NULL;
           $this->_Orders[$Key][] = $TableAlias;
         }
       }
    return $this;
    }
    /**
    * @param string $FunctionString
    * @param array $Binds
      * @param string $FunctionAlias &#39;&#39;
    * @return Query
    */
    public function AddFunction($FunctionString, $Binds = array(), $FunctionAlias = &#39;&#39;)
    {
       $this->_ClearSqlCache();
    if (empty($FunctionString)) {
    throw new Exception(&#39;Empty function string&#39;);
    }
    if (!is_array($Binds)) {
    throw new Exception(&#39;Binds is not an array&#39;);
    }
       $Key = $FunctionString . md5(serialize($Binds)) . $FunctionAlias;
       if(!isset($this->_Functions[$Key])) {
         $this->_Functions[$Key] = array($FunctionString, $Binds);
         if (!empty($FunctionAlias)) {
           $this->_Functions[$Key][] = $FunctionAlias;
         }
       }
    return $this;
    }
    /**
    * @param int $Count
    * @param int $From 0
    */
    public function SetLimit($Count, $From = 0)
    {
       $this->_ClearSqlCache();
    if ($Count) {
    $this->_Limit = array($Count, $From);
    }
    }
     /**
      * @return string
      */
     public function GetSQL()
     {
       if (!$this->_Sql) {
         $this->_Sql = $this->{&#39;_Get&#39; . $this->_Type . &#39;Sql&#39;}();
       }
       return $this->_Sql;
     }
     /**
      * @return array
      */
     public function GetParams()
     {
       return $this->_Binds;
     }
     /**
      * @return string
      */
     public function __toString()
     {
       return htmlspecialchars($this->GetSQL());
     }
     /**
      * @return string
      */
     private function _GetSelectSql()
     {
       $this->_Binds = array();
    $Sql = &#39;SELECT &#39; . Str::Strrepeat(&#39;?f,&#39;, count($this->_Fields));
    foreach ($this->_Fields as $Sign) {
    $this->_Binds[] = $Sign;
    }
    if (count($this->_Functions)) {
    foreach ($this->_Functions as $Sign) {
           $Sql .= $Sign[0] . &#39;,&#39;;
    if (count($Sign[1])) {
             foreach ($Sign[1] as $Bind) {
      $this->_Binds[] = $Bind;
             }
    }
    }
    }
    $Sql = Str::Dec($Sql) . &#39; FROM &#39;;
       $Sql .= Str::Strrepeat(&#39;?t,&#39;, count($this->_Tables));
    foreach ($this->_Tables as $Sign) {
    $this->_Binds[] = $Sign;
    }
    $Sql = Str::Dec($Sql);
    if (count($this->_Joins)) {
    foreach ($this->_Joins as $Sign) {
    $Sql .= &#39; &#39; . $Sign[0] . &#39; &#39;;
    if (count($Sign[1])) {
             foreach ($Sign[1] as $Bind) {
      $this->_Binds[] = $Bind;
             }
    }
    }
    }
    if (count($this->_Where)) {
    $Sql .= &#39; WHERE &#39;;
    foreach ($this->_Where as $Sign) {
    $Sql .= &#39; &#39; . $Sign[0] . &#39; &#39;;
    if (count($Sign[1])) {
             foreach ($Sign[1] as $Bind) {
      $this->_Binds[] = $Bind;
             }
    }
    }
    }
    unset($Sign);
    if (count($this->_Orders)) {
    $Sql .= &#39; ORDER BY &#39;;
    foreach ($this->_Orders as $Sign) {
           $Type = array_shift($Sign);
    $Sql .= &#39; ?f &#39; . $Type . &#39;,&#39;;
           $this->_Binds[] = $Sign;
    }
    $Sql = Str::Dec($Sql);
    }
    if ($this->_Limit) {
    $Sql .= &#39; LIMIT ?i OFFSET ?i&#39;;
         $this->_Binds[] = $this->_Limit[0];
         $this->_Binds[] = $this->_Limit[1];
    }
    return $Sql;
     }
     /**
      * @return string
      */
     private function _GetInsertSql()
     {
       $this->_Binds = array();
       $Sql = &#39;INSERT INTO ?t (&#39;;
       $this->_Binds[] = array_shift($this->_Tables);
       $Sql .= Str::Strrepeat(&#39;?f,&#39;, count($this->_Fields), TRUE);
    foreach ($this->_Fields as $Sign) {
    $this->_Binds[] = $Sign;
    }
       $Sql .=  &#39;) VALUES (&#39;;
       foreach ($this->_Fields as $Sign) {
         $Sql .= (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][1] : Db::FORMAT_NULL) . &#39;,&#39;; //FORMAT
         $this->_Binds[] = (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][0] : NULL); //real value
       }
       $Sql = Str::Dec($Sql) . &#39;)&#39;;
       return $Sql;
     }
     /**
      * @return string
      */
     private function _GetUpdateSql()
     {
       $this->_Binds = array();
       $Sql = &#39;UPDATE ?t SET &#39;;
       $this->_Binds[] = array_shift($this->_Tables);
       foreach ($this->_Fields as $Sign) {
         $Sql .= &#39;?f=&#39; . (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][1]: Db::FORMAT_NULL) . &#39;,&#39;;
         $this->_Binds[] = (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][0] : NULL); //real value
       }
       $Sql = Str::Dec($Sql);
    if (count($this->_Where)) {
    $Sql .= &#39; WHERE &#39;;
    foreach ($this->_Where as $Sign) {
    $Sql .= &#39; &#39; . $Sign[0] . &#39; &#39;;
    if (count($Sign[1])) {
             foreach ($Sign[1] as $Bind) {
      $this->_Binds[] = $Bind;
             }
    }
    }
    }
       return $Sql;
     }
     
     private function _ClearSqlCache()
     {
       $this->_Sql = NULL;
     }
    }

    А потом типа такого, &quot;где-то в недрах&quot; :
        $Query = new Query(Query::SELECT);
       $Query->AddTable(&#39;user&#39;)
         ->AddField(&#39;user&#39;, &#39;login&#39;)
         ->AddValue(&#39;login&#39;, &#39;kostyl&#39;, Db::FORMAT_STR); //это вроде для Query::INSERT и UPDATE так что тут не отработает
       $rs = Db::Query($Query->GetSQL(), $Query->GetParams());

    Короче типа того. Я думаю так удобнее собирать запросы и параметры.
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:18, спустя 23 часа 51 минуту 58 секунд

    Doctrine2DBAL на основе PDO который
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:23, спустя 4 минуты 36 секунд

    что то типа такого:

    ну и хуйня …. код полное дерьмо
    Сапожник без сапог
  • kostyl

    Сообщения: 5201 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:28, спустя 5 минут 39 секунд

    phpdude, согласен, но дело не в коде, а в паттерне, потому как написать вручную запрос и параметры, который зависит от всяких условий, просто как строку и массив довольно напряжное дело. Эта хрень упрощает жизнь ))
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:31, спустя 2 минуты 53 секунды

    Эта хрень упрощает жизнь ))

    ну это не подход, это жопа!)
    Сапожник без сапог
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:36, спустя 5 минут 13 секунд

    Насчёт ORM vs Builder vs native-SQL: кто из них лучше тема для обширного и бессмысленного холивара.
    Каждый выбирает, что ему нравится, а после этого выбирает под это библиотеку.
    goDB это библиотека для тех, кто выбрал нативный скл.
    То что, у неё хуёвые плейсхолдеры или что-то ещё, это к ней, а то что ORM-форева, нет.
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:40, спустя 3 минуты 34 секунды

    d2 DBAL - это тоже нативный sql если че
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:47, спустя 6 минут 54 секунды


    d2 DBAL - это тоже нативный sql если че
    dая еDBAL
    adw/0
  • kostyl

    Сообщения: 5201 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:47, спустя 38 секунд

    ну это не подход, это жопа!)

    я имел в виду паттерн.
    vasa_c, да конечно. Я например тоже пишу всё руками там где у меня есть мапперы. А там где у меня актив рекорды - квери билдер ахуенная вещью, как по мне. Ну смотря конечно что и как делать.
    А вообще зачет за именованные плейсхолдеры
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:49, спустя 1 минуту 31 секунду

    я имел в виду паттерн.

    а я про него и писал паттерн - Jopa {+++23+++}
    А вообще зачет за именованные плейсхолдеры

    у меня всю жизнь {0}, {1}, {2} .. .))
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:51, спустя 1 минуту 51 секунду

    засрали тему
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 3:55, спустя 4 минуты 4 секунды

    у меня всю жизнь {0}, {1}, {2} .. .))

    Java way?
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 3:56, спустя 1 минуту 4 секунды

    Абырвалг, .net => String.Format(string patter, params object);
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!