SQL-запросы в виде констант

Alexandre

PHPПенсионер
Мне интересно, какие преимущества и недостатки такого метода.
Вариант 1.
запросы пишет один человек - программист БД
код пишет другой, PHP-кодер,
в некоторых организациях есть такое разделение труда

вариант 2. когда запросы выделены в одном месте, то в проооекте всегда существуют такие запросы, которые повторяются, поэтому, изменение их лучше делать в одном месте, нежели ползать по коду и искать, где же у тебя был еще такой-же запрос...
 

melo

однажды
минус вижу такой, напрмер запрос не верный, сначало смотрим то место, где вызываеться запрос, потом константу запроса, потом константы в запросе. хотя если имеешь с этим дело - можно наловчиться.
 

dark-demon

d(^-^)b
небольшой оффтоп..

PHP:
define( 'select', ' select' );
define( 'all', ' *' );
define( 'from', ' from' );
define( 'article', ' [my-article]' );
define( 'where', ' where' );
define( 'artID', article.'[art-id]' );
define( 'equal', ' =' );
$article= $db->getRow( select.all.from.article.where.artID.equal,$id );
:)
 

kode

never knows best
Просто для таких случаев есть хранимые процедуры :)
 

Gas

может по одной?
kode
для таких это для каких?

dark-demon
ну если в sql'ях в одном файле смысл найти можно, то в приведённом тобой примере я его не нашёл :)
 

TutanXamoN

Новичок
kode
Полной абстракции всё равно не будет ибо две части из трёх
(данные<->контроллер<->представление) неизбежно связаны в реальных задачах.
 

kode

never knows best
Но это надёжная вещь чтобы разделить труд. Фактически это интерфейс к бд. Так-же это всё можно реализовать через классы-сущности :) Я вобще против чтобы SQL запросы в каком либо виде были прямо в коде, только в классах-интерфейсах и через классы SQL-абстракции :)

Те например

PHP:
<?php

class User extends BaseModule {
	
	const users_table = "billing.users";
	const accounts_table = "billing.accounts";
	
	private $user_data;
	private $user_accounts;
	private $user_id;
	
	public function __construct($id){
		$this->user_id = $id;
		//Инизиализируем БД $this->db = DB::getInstance();
		parent::__construct();
		$this->getUser();
		$this->getAccounts();
	}
	
	public function getInfo(){
		$result = $this->user_data;
		$result['accounts'] = $this->user_accounts;
		return $result;
	}
		
	public function addAccount($login,$password){
		$this->db->insert(self::accounts_table,array("uid"=>$this->user_id,"login"=>$login,"password"=>md5($password)));
		$this->getAccounts();  //Обновляем информацию
	}
	
	public function editUser($data){
		/* всякие проверки */
		$this->db->update(self::users_table,$data,array('id'=>$this->user_id));
		$this->getUser(); //Обновляем информацию
	}
		
	private function getUser(){
		return $this->user_data = $this->db->selectExOne(self::users_table,array("id"=>$this->user_id));
	}
	
	private function getAccounts(){
		return $user_accounts = $this->db->selectEx(self::accounts_table,array("uid"=>$this->user_id));
	}
	
}

?>
 

FractalizeR

Новичок
Но это надёжная вещь чтобы разделить труд. Фактически это интерфейс к бд. Так-же это всё можно реализовать через классы-сущности Я вобще против чтобы SQL запросы в каком либо виде были прямо в коде, только в классах-интерфейсах и через классы SQL-абстракции
Согласен. Правда я пока не уверен в целесообразности инкапсуляции в классы запросов, строящих списки (получение списка пользователей с указанными условиями). Мне кажется, тут намного проще просто запрос в код вставить.
 

TutanXamoN

Новичок
FractalizeR
О чём я и говорю. Разделение есть но чем дальше мы пытаемся вынести какую-то вещь тем больше мы связываем себя:
вынесли запросы+структура - имеем универсализацию данных но ограничеваем контролер-представление.
Инкапсулировали в классы - имеем сцепку данные-контроллер универсализируя связь (данные-контроллер)+представление.

Для каждого конкретного случая нужно думать нужно-ли ето в етом конкретном случае.
 

kode

never knows best
Автор оригинала: FractalizeR
Согласен. Правда я пока не уверен в целесообразности инкапсуляции в классы запросов, строящих списки (получение списка пользователей с указанными условиями). Мне кажется, тут намного проще просто запрос в код вставить.
ну например я делаю так :)
PHP:
<?php

class Users  extends BaseModule implements Iterator {
	
	const users_table = "users";
	protected $expression;
	private $db_result;
		
	public $current_row;
	
	public function __construct($expression){
		parent::__construct();
		$this->expression = $expression;
	}
	
	public function rewind(){
		$this->db_result = $this->db->select(self::users_table,$this->expression);
		$this->next(); //Получаем первый результат
	}
	
	public function key(){;
		return $this->current_row['id'];
	}
	
	public function next(){
		return $this->current_row = $this->db->fetchRow($this->db_result);
	}
	
	public function current(){
		return $this->current_row;
	}
	
	public function valid(){
		if($this->current_row){
			return$this->current_row;
		}
	}
}

$users = new Users(array('date_connect'=>array('LIKE','2007-11-%')));

foreach ($users as $id=>$user){
	echo "Пользователь:",$user['fullname'],'(',$id,")\n";
}

?>
 

FractalizeR

Новичок
Наверное, неплохо, но почти настолько же эффективно и удобно, как и простой запрос с итерацией рекордсета по foreach (у меня класс рекордсета реализовывает Iterator). Ведь у вас current() экземпляр класса User не возвращает... Строго говоря, достаточно просто сделать, чтобы возвращал.
 

kode

never knows best
Ну дык это я как пример привёл :) Это не настоящий код, а написаный за 15 минут на коленке.

Строго говоря, достаточно просто сделать, чтобы возвращал.
PHP:
public function __construct($input){
	//Инизиализируем БД $this->db = DB::getInstance();
	parent::__construct();
	if(is_array($input)){
		$this->user_data = $input;
		$this->user_id = $input['id'];
	}elseif(is_numeric($input)){
		$this->user_id = $input;
		$this->getUser();
	}else{
		throw new Exception("Unknown input data");
	}
	$this->getAccounts();
}
 
Сверху