Василий М.
Новичок
бред какой-то.Ага, а еще можно памяти докупить. Ну, надо же где-то хранить туеву хучу ненужных данных, что вернулись как результат запроса.
radioheaded все правильно описал.
бред какой-то.Ага, а еще можно памяти докупить. Ну, надо же где-то хранить туеву хучу ненужных данных, что вернулись как результат запроса.
Вероятнее всего, имелось в виду другое. Вам хотели сказать, что нужно доставать только те записи, которые вам нужны в данный момент. Это не про свойства одной записи, а про количество записей.Вот так номер, а мне на sql.ru по этому поводу прямо противоположное сказали: «Ага, а еще можно памяти докупить. Ну, надо же где-то хранить туеву хучу ненужных данных, что вернулись как результат запроса.» Хорошо, что здесь переспросил!
//Низкоуровневая работа с БД
static class Sql {
public function add($tableName) { ... }
public function del($tableName, $id) { ... }
public function get($tableName, $id) { ... }
public function set($tableName, $fieldsArr) { ... }
public function saveSort($tableName, $posArr, $pidArr) { ... }
...
}
//ActiveRecord
class ActiveRecord {
private function __constructor($tableName) {
setQueue('add', $tableName)
}
public function del($tableName, $id) {
setQueue('del', $tableName, $id)
}
public function get($tableName, $id) {
setQueue('get', $tableName, $id)
}
public function set($tableName, $fieldsArr) {
setQueue('set', $tableName, $fieldsArr)
}
public function save() {
switch ($queue) {
/* ... */ Sql::add($tableName)
/* ... */ Sql::del($tableName, $id)
/* ... */ Sql::get($tableName, $id)
/* ... */ Sql::set($tableName, $fieldsArr)
}
}
}
//Распределение поступающих от клиента запросов
switch ($_REQUEST['to']) {
case 'productsType':
switch ($_REQUEST['act']) {
case 'add':
$result = new ActiveRecord($_REQUEST['tableName']);
break;
case 'del':
$result = ActiveRecord::del($_REQUEST['tableName'], $_REQUEST['id']);
break;
case 'get':
$result = ActiveRecord::set($_REQUEST['tableName'], $_REQUEST['id']);
break;
case 'set':
$result = ActiveRecord::set($_REQUEST['tableName'], $_REQUEST);
break;
case 'sort':
$result = Sql::saveSort($_REQUEST['tableName'], $_REQUEST['posArr'], $_REQUEST['pidArr'])
};
break;
case 'colorList': ...
case 'sizesList': ...
case 'currencyList': ...
}
echo json_encode($result);
Неа. Мой изначальный вопрос звучал как: «Как в запросе select написать обращение к столбцу `x` и если он не существует все его значения выдать как null. В крайнем случае, вообще, ничего не выдать, главное, чтобы запрос не завершался ошибкой и выдавал бы остальные значения» Речи о количестве записей не велось. Только о наборах полейВероятнее всего, имелось в виду другое. Вам хотели сказать, что нужно доставать только те записи, которые вам нужны в данный момент.
Правильно поставленный вопрос = 70% ответа. В вашем случае, вам этого хотеться не должно. В такой постановке задача решается на пхп, выборкой всех значений, и потом обработкой данных. ИМХО опять же.Неа. Мой изначальный вопрос звучал как: «Как в запросе select написать обращение к столбцу `x` и если он не существует все его значения выдать как null. В крайнем случае, вообще, ничего не выдать, главное, чтобы запрос не завершался ошибкой и выдавал бы остальные значения» Речи о количестве записей не велось. Только о наборах полей
- это твоя "низкоуровневая" приблуда. Низкоуровневая работа с БД должна осуществляться минимум - через родные функции/классы, максимум - через обертки (раз, два), не замещающие никоим образом возможности работы с SQL.Какая-то чушь
get($tableName, $id)
class User
{
protected $table = 'user';
protected $db; // Класс для работы с СУБД, mysqli или mysql
public function __construc(Database $db)
{
$this->db = $db;
}
// Свойства - такие жэе, как поля в таблице user
protected $id, $first_name, $last_name;
public function findById($id)
{
$data = $this->db->query('select id, first_name, last_name from ' . $this->table . 'where id = ' . $id);
// нашли данные?
if ($data) {
// Транслируем их в свойства класса
foreach ($data as $key => $value) {
if (isset($this->$key)) { // теперь в объекте есть свойства
$this->$key = $value; // $this->id, $this->first_name, $this->last_name
}
}
}
}
public function setFirstName($name)
{
$this->first_name = $name;
}
public function getFullName()
{
return $this->first_name . ' ' . $this->last_name;
}
public function save()
{
if ($this->id) {
$this->db->query('UPDATE ' . $this->table . ' SET first_name="' . $this->first_name . '", last_name="' . $this->last_name . '" where id = ' . $this->id);
} else {
$this->db->query('INSERT INTO ' . $this->table . ' VALUES(null, "' . $this->first_name . '", "' . $this->last_name . '")');
}
}
}
$db = new Database('host', 'user', 'password');
$user = new User($db);
$user->findById(123); // нашли пользователя
echo $user->getFullName(); // Петя Иванов
$user->setFirstName('Федя');
echo $user->getFullName(); // Федя Иванов
$user->save();
Поэтому я и задавал вопрос на форуме sql, т.к. нужно было сделать это одним запросом без ПХППравильно поставленный вопрос = 70% ответа. В вашем случае, вам этого хотеться не должно. В такой постановке задача решается на пхп, выборкой всех значений, и потом обработкой данных. ИМХО опять же.
Ага, теперь становится понятно, что создание экземпляра класса не несет в себе автоматическое создание поля в БД. Так же понятно, что любая манипуляция данными, не создающая новой записи всегда использует лишний запрос findById($id). Т.е. этот шаблон удваивает количество запросов к базе (косяк). Судя по ссылке из следующего поста, не возбраняется увеличивать его универсальность, определяя переменные $class_name, $table_name и т.п.ActiveRecord должен выглядеть примерно так:
Точно не напишу! Спасибо за ссылку, очень не хватает примеров хорошего кода для ПХП!Автору топика, если он хочет AR, стоит взять что-то вроде https://github.com/j4mie/paris.
Сам нормально не напишет, опыта не хватит
поясни, пожалуйста, выделенные вещи. я ничего не понял. где ты тут косяки увидел? где "лишний запрос"?Ага, теперь становится понятно, что создание экземпляра класса не несет в себе автоматическое создание поля в БД. Так же понятно, что любая манипуляция данными, не создающая новой записи всегда использует лишний запрос findById($id). Т.е. этот шаблон удваивает количество запросов к базе (косяк). Судя по ссылке из следующего поста, не возбраняется увеличивать его универсальность, определяя переменные $class_name, $table_name и т.п
$user->setFirstName('Федя');
$user = new User($db);
$user->findById(123); // нашли пользователя
А какое хорошее? global $db?(Кстати $db как аргумент при создании объекта, тоже имхо плохое архитектурное решение...
ну не так согласись, чтобы во все модели передавать хендлер соединения... давайте еще параметры бд туда пихать и в каждой модели подключаться...А какое хорошее? global $db?
Другое дело, что инстанциировать лучше не напрямую, и $db может передавать ModelFactory или IoC.
Еще лучше, если не $db, а менеджер соединений, но это ТСу точно ни к чему
я это и имел ввиду. вообще по сути надо иметь class Db и уже от него наследовать все модели. Такой подход мне кажется оптимальным.Хэндлер соединения, конечно, не нужно
Я про то, что популярный подход с App::db() - это вовсе не образец для подражания.
protected getDb(), который берет "откуда-то", хоть бы и из App::db() в текущей реализации - уже лучше: это всегда можно изменить.
И не надо ничего понимать прямо сейчас. Если тебе что-то не подходит — не используй это. Когда будет не хватать — сам дойдешь до верного решения.На лицо лишний запрос... Или, правда, чего-то не понимаю...
лол чтоclass Db и уже от него наследовать все модели
А что мы обновляем-то, какую строчку? в запросе у нас where id = ' . $this->id .'К сожалению не понимаешь...
смотри $user->update($arrayFields); ...
Скорее всего так и будет)И не надо ничего понимать прямо сейчас. Если тебе что-то не подходит — не используй это. Когда будет не хватать — сам дойдешь до верного решения.
namespace Lib\Sql;
class MySql {
private $host;
private $user;
private $pass;
private $db;
private $connect;
public function __construct() {
}
public function init($params) {
$this->host = $params[0];
$this->user = $params[1];
$this->pass = $params[2];
$this->db = $params[3];
$this->connect();
}
public function connect() {
$this->connect = mysql_connect($this->host, $this->user, $this->pass) or $this->error(mysql_error());
mysql_select_db($this->db);
$this->query("SET NAMES 'UTF8'");
}
public function getOne($entry, $query) {
$res = $this->query("select `" . $entry . "` from " . $query . "");
$row = $this->fetch($res);
return $row[$entry];
}
public function count($entry, $query) {
$res = $this->query("select count(`" . $entry . "`) as `" . $entry . "` from " . $query . "");
$row = $this->fetch($res);
return $row[$entry];
}
public function getLastId() {
return mysql_insert_id();
}
public function query($text) {
return mysql_query($text);
}
public function fetch($result) {
return mysql_fetch_assoc($result);
}
public function error($errorText) {
print $errorText;
}
}
public function getIdFromUrl($url) {
$sql = \Lib\sql();
return $sql->getOne("id", "`categories` where `url` = '" . $url . "';");
}
обычный бессмысленный говнокод. Mysql-функции просто обернуты в класс безо всякого смысла. Тот же PDO дает куда больше возможностей из коробки.ковыряю сейчас движок, написанный крутым программером
Ну ты понимаешь.если зп 120 т.р., которую он получал тогда показатель крутости