|
Абырвалг ↓
|
 |
|
15 Сентябрь, 2010, 02:14:24
|
НЕ ХУЕТА!
ХУЕТА!
|
PHP Infected, симфоеб, маконенавистник
Группа: Джедаи Карма: 80
Сообщений: 6096 Сила слова: 1.31
|
а я вот постепенно отказываюсь от своих либ для работы с базой. Да, это все удобно, но нужно следовать стандартам Спустя 25 секунд добавил хотя буду задрачивать доктриновцев что б они добавили некоторые фичи
|
|
|
|
|
Записан
|
PHP does the job since 1995 Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
|
|
|
|
artoodetoo ↓
|
 |
|
15 Сентябрь, 2010, 02:17:01 , спустя 2 минуты 37 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
с особым цинизмом
Группа: в ухо Карма: 124
Сообщений: 3805 Сила слова: 3.26
|
что для тебя стандарт?
|
|
|
|
|
Записан
|
|
|
|
|
kostyl ↓
|
 |
|
15 Сентябрь, 2010, 02:26:34 , спустя 9 минут 33 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
занедельный антипаттерн
Группа: Джедаи Карма: 60
Сообщений: 3522 Сила слова: 1.7
|
я вообще в случае с query($sql, $params) за query bilder. Для тех кто в такне, что то типа такого:
<?php
/**
* @package Query.php
* @version 1.0
* @author Konstantin Gerasimov
* @copyright Copyright (c) 2009, Konstantin Gerasimov
* @license LGPL
*/
class Query {
const SELECT = 'Select';
const INSERT = 'Insert';
const UPDATE = 'Update';
const DELETE = 'Delete';
const ASC = 'ASC';
const DESC = 'DESC';
/**
* @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) &&
($QueryType !== self:: INSERT) &&
($QueryType !== self:: UPDATE) &&
($QueryType !== self:: DELETE)) {
throw new Exception ('Unknown type of Query "' . $QueryType . '"');
}
$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 ''
* @param string $TableAlias ''
* @return Query
*/
public function AddField ($TableName, $FieldName, $FieldAlias = '', $TableAlias = '')
{
$this->_ClearSqlCache ();
if(empty($FieldName) || empty($TableName)) {
throw new Exception ('Empty FeildName ="' . $FieldName . '" or/and TableName="' . $TableName . '"');
}
$FieldName = Str:: Strtolower($FieldName);
$TableName = Str:: Strtolower($TableName);
$FieldAlias = Str:: Strtolower($FieldAlias);
$TableAlias = Str:: Strtolower($TableAlias);
$Key = $TableName . '|' . $FieldName . '|' . $FieldAlias . '|' . $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 ('Unknown db format "' . $Format . '"');
}
$this->_Values [Str:: Strtolower($FieldName)] = array($Value, $Format);
return $this;
}
/**
* @param string $TableName
* @param string $TableAlias ''
* @return Query
*/
public function AddTable ($TableName, $TableAlias = '')
{
$this->_ClearSqlCache ();
$Key = $TableName . '|' . $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 ('Empty where string');
}
if (! is_array($Binds)) {
throw new Exception ('Binds is not an array');
}
$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 ('Empty join string');
}
if (! is_array($Binds)) {
throw new Exception ('Binds is not an array');
}
$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 ''
* @param string $TableAlias ''
* @return Query
*/
public function AddOrder ($Type, $TableName, $FieldName, $FieldAlias = '', $TableAlias = '')
{
$this->_ClearSqlCache ();
if (($Type !== self:: ASC) &&
($Type !== self:: DESC)) {
throw new Exception ('Wrong order type "' . $Type . '"');
}
$Key = $TableName . '|' . $FieldName . '|' . $FieldAlias . '|' . $TableAlias . '|' . $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) && empty($FieldAlias)) {
$this->_Orders [$Key][] = NULL;
$this->_Orders [$Key][] = $TableAlias;
}
}
return $this;
}
/**
* @param string $FunctionString
* @param array $Binds
* @param string $FunctionAlias ''
* @return Query
*/
public function AddFunction ($FunctionString, $Binds = array(), $FunctionAlias = '')
{
$this->_ClearSqlCache ();
if (empty($FunctionString)) {
throw new Exception ('Empty function string');
}
if (! is_array($Binds)) {
throw new Exception ('Binds is not an array');
}
$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-> {'_Get' . $this->_Type . 'Sql'}();
}
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 = 'SELECT ' . Str:: Strrepeat('?f,', count($this->_Fields ));
foreach ($this->_Fields as $Sign) {
$this->_Binds [] = $Sign;
}
if (count($this->_Functions )) {
foreach ($this->_Functions as $Sign) {
$Sql .= $Sign[0] . ',';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds [] = $Bind;
}
}
}
}
$Sql = Str:: Dec($Sql) . ' FROM ';
$Sql .= Str:: Strrepeat('?t,', 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 .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds [] = $Bind;
}
}
}
}
if (count($this->_Where )) {
$Sql .= ' WHERE ';
foreach ($this->_Where as $Sign) {
$Sql .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds [] = $Bind;
}
}
}
}
unset($Sign);
if (count($this->_Orders )) {
$Sql .= ' ORDER BY ';
foreach ($this->_Orders as $Sign) {
$Type = array_shift($Sign);
$Sql .= ' ?f ' . $Type . ',';
$this->_Binds [] = $Sign;
}
$Sql = Str:: Dec($Sql);
}
if ($this->_Limit ) {
$Sql .= ' LIMIT ?i OFFSET ?i';
$this->_Binds [] = $this->_Limit [0];
$this->_Binds [] = $this->_Limit [1];
}
return $Sql;
}
/**
* @return string
*/
private function _GetInsertSql ()
{
$this->_Binds = array();
$Sql = 'INSERT INTO ?t (';
$this->_Binds [] = array_shift($this->_Tables );
$Sql .= Str:: Strrepeat('?f,', count($this->_Fields ), TRUE);
foreach ($this->_Fields as $Sign) {
$this->_Binds [] = $Sign;
}
$Sql .= ') VALUES (';
foreach ($this->_Fields as $Sign) {
$Sql .= (isset($this->_Values [$Sign[1]]) ? $this->_Values [$Sign[1]][1] : Db:: FORMAT_NULL) . ','; //FORMAT
$this->_Binds [] = (isset($this->_Values [$Sign[1]]) ? $this->_Values [$Sign[1]][0] : NULL); //real value
}
$Sql = Str:: Dec($Sql) . ')';
return $Sql;
}
/**
* @return string
*/
private function _GetUpdateSql ()
{
$this->_Binds = array();
$Sql = 'UPDATE ?t SET ';
$this->_Binds [] = array_shift($this->_Tables );
foreach ($this->_Fields as $Sign) {
$Sql .= '?f=' . (isset($this->_Values [$Sign[1]]) ? $this->_Values [$Sign[1]][1]: Db:: FORMAT_NULL) . ',';
$this->_Binds [] = (isset($this->_Values [$Sign[1]]) ? $this->_Values [$Sign[1]][0] : NULL); //real value
}
$Sql = Str:: Dec($Sql);
if (count($this->_Where )) {
$Sql .= ' WHERE ';
foreach ($this->_Where as $Sign) {
$Sql .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds [] = $Bind;
}
}
}
}
return $Sql;
}
private function _ClearSqlCache ()
{
$this->_Sql = NULL;
}
}
А потом типа такого, "где-то в недрах" :
$Query = new Query(Query::SELECT);
$Query->AddTable('user')
->AddField('user', 'login')
->AddValue('login', 'kostyl', Db::FORMAT_STR); //это вроде для Query::INSERT и UPDATE так что тут не отработает
$rs = Db::Query($Query->GetSQL(), $Query->GetParams());
Короче типа того. Я думаю так удобнее собирать запросы и параметры.
|
|
|
|
« Последнее редактирование: 15 Сентябрь, 2010, 02:26:34 от kostyl »
|
Записан
|
качество жизни обратно пропорционально количеству лени
|
|
|
|
Абырвалг ↓
|
 |
|
15 Сентябрь, 2010, 02:18:32 , спустя
|
НЕ ХУЕТА!
ХУЕТА!
|
PHP Infected, симфоеб, маконенавистник
Группа: Джедаи Карма: 80
Сообщений: 6096 Сила слова: 1.31
|
Doctrine2DBAL на основе PDO который
|
|
|
|
|
Записан
|
PHP does the job since 1995 Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
|
|
|
|
phpdude ↓
|
 |
|
15 Сентябрь, 2010, 02:23:08 , спустя 4 минуты 36 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 344
Сообщений: 20790 Сила слова: 1.65
|
что то типа такого:
ну и хуйня .... код полное дерьмо
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
kostyl ↓
|
 |
|
15 Сентябрь, 2010, 02:28:47 , спустя 5 минут 39 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
занедельный антипаттерн
Группа: Джедаи Карма: 60
Сообщений: 3522 Сила слова: 1.7
|
phpdude, согласен, но дело не в коде, а в паттерне, потому как написать вручную запрос и параметры, который зависит от всяких условий, просто как строку и массив довольно напряжное дело. Эта хрень упрощает жизнь ))
|
|
|
|
|
Записан
|
качество жизни обратно пропорционально количеству лени
|
|
|
|
phpdude ↓
|
 |
|
15 Сентябрь, 2010, 02:31:40 , спустя 2 минуты 53 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 344
Сообщений: д-о-х-у-я! Сила слова: 1.65
|
Эта хрень упрощает жизнь ))
ну это не подход, это жопа!)
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
vasa_c ↓
|
 |
|
15 Сентябрь, 2010, 02:36:53 , спустя 5 минут 13 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Насчёт ORM vs Builder vs native-SQL: кто из них лучше тема для обширного и бессмысленного холивара.
Каждый выбирает, что ему нравится, а после этого выбирает под это библиотеку.
goDB это библиотека для тех, кто выбрал нативный скл.
То что, у неё хуёвые плейсхолдеры или что-то ещё, это к ней, а то что ORM-форева, нет.
|
|
|
|
|
Записан
|
|
|
|
|
Абырвалг ↓
|
 |
|
15 Сентябрь, 2010, 02:40:27 , спустя 3 минуты 34 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
PHP Infected, симфоеб, маконенавистник
Группа: Джедаи Карма: 80
Сообщений: 6096 Сила слова: 1.31
|
d2 DBAL - это тоже нативный sql если че
|
|
|
|
|
Записан
|
PHP does the job since 1995 Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
|
|
|
|
adw0rd ↓
|
 |
|
15 Сентябрь, 2010, 02:47:21 , спустя 6 минут 54 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
эдво
Группа: в ухо Карма: не нужна
Сообщений: 17623 Сила слова: 1.67
|
d2 DBAL - это тоже нативный sql если че
dая еDBAL
|
|
|
|
|
Записан
|
|
|
|
|
kostyl ↓
|
 |
|
15 Сентябрь, 2010, 02:47:59 , спустя 38 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
занедельный антипаттерн
Группа: Джедаи Карма: 60
Сообщений: 3522 Сила слова: 1.7
|
ну это не подход, это жопа!)
я имел в виду паттерн.
vasa_c, да конечно. Я например тоже пишу всё руками там где у меня есть мапперы. А там где у меня актив рекорды - квери билдер ахуенная вещью, как по мне. Ну смотря конечно что и как делать.
А вообще зачет за именованные плейсхолдеры
|
|
|
|
|
Записан
|
качество жизни обратно пропорционально количеству лени
|
|
|
|
phpdude ↓
|
 |
|
15 Сентябрь, 2010, 02:49:30 , спустя 1 минуту 31 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 344
Сообщений: д-о-х-у-я! Сила слова: 1.65
|
я имел в виду паттерн.
а я про него и писал паттерн - Jopa Спустя 23 секунды добавил А вообще зачет за именованные плейсхолдеры
у меня всю жизнь {0}, {1}, {2} .. .))
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|
artoodetoo ↓
|
 |
|
15 Сентябрь, 2010, 02:51:21 , спустя 1 минуту 51 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
с особым цинизмом
Группа: в ухо Карма: 124
Сообщений: 3805 Сила слова: 3.26
|
засрали тему
|
|
|
|
|
Записан
|
|
|
|
|
Абырвалг ↓
|
 |
|
15 Сентябрь, 2010, 02:55:25 , спустя 4 минуты 4 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
PHP Infected, симфоеб, маконенавистник
Группа: Джедаи Карма: 80
Сообщений: 6096 Сила слова: 1.31
|
у меня всю жизнь {0}, {1}, {2} .. .))
Java way?
|
|
|
|
|
Записан
|
PHP does the job since 1995 Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
|
|
|
|
phpdude ↓
|
 |
|
15 Сентябрь, 2010, 02:56:29 , спустя 1 минуту 4 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
я - ЭМО
Группа: в ухо Карма: 344
Сообщений: 20790 Сила слова: 1.65
|
Абырвалг, .net => String.Format(string patter, params object);
|
|
|
|
|
Записан
|
забанен. могу забанить других, пишите в личку BEER. Helping ugly people have sex since 1862.
|
|
|
|