моя оберточка под mysql

Духовность™

Продвинутый новичок
моя оберточка под mysql

http://intercomp-global.com/etc/database.rar

покритикуйте это решение! :D

примеры приведены в index.php

PHP:
$db->query('SELECT first_name FROM test WHERE id = ?i', $_GET['id'])->getOne(); // Маша

$db->query('SELECT "?s"', 'символ \ называется "backslash", а символ _ называется "underscore"')->getOne();

$db->query('SELECT * FROM test WHERE text LIKE "?S"', $str)->getOne();

$array = array('first_name' => 'хрен', 'last_name' => 'с горы', 'text' => $str);
$db->query('INSERT INTO test SET ?a', $array);
чего бы ещё надо добавить?
 

tf

крылья рулят
str_replace_once может сделать приватной?
и подумай над этим
PHP:
class DB_MysqlStatement {
    public function __destruct() {
        $this->free();
    }
}
 

AmdY

Пью пиво
Команда форума
triumvirat
где-то у котерова это уже было ;)
никогда не понимал, зачем делают лишний вызов
$db->query($sql)->getOne() вместо $db->getOne($sql)
и именования методов постарайся сделать стандартным как в pear и zf
 

Духовность™

Продвинутый новичок
str_replace_once может сделать приватной?
вообще это тема для отдельной дискуссии. я вот ума не приложу, что делать в ОО с такими вот "одноразовыми" функциями. С одной стороны они могут повторно где-то понадобиться и включать их в класс как-то не хочется. С другной - врядли. Конечно, наилучшим бы решение было бы сделать функцию частью объекта Строка, но такого объекта в PHP нет.

и подумай над этим
угу, сделаю.

никогда не понимал, зачем делают лишний вызов
query() возвращает объект результата, именно там находится $result.
 

tf

крылья рулят
вообще это тема для отдельной дискуссии. я вот ума не приложу, что делать в ОО с такими вот "одноразовыми" функциями. С одной стороны они могут повторно где-то понадобиться и включать их в класс как-то не хочется. С другной - врядли. Конечно, наилучшим бы решение было бы сделать функцию частью объекта Строка, но такого объекта в PHP нет.
у тебя сделано что она возможно где то уже определена
как минимум бред - она переопеделена будет не так - как вывод она не находится в пакете с Database
вот если ты сделаеш пакет string и будеш вызывать string::str_replace_once вопросов вознинуть не должно
 

The employer

Новичок
Re: моя оберточка под mysql

Автор оригинала: triumvirat

чего бы ещё надо добавить?
Это движение в правильном направлении. Наше решение той же задачи сделано аналогично, но с тремя важными расширениями:

1. Плейсхолдеры именованные.

То есть не "insert into t(name, salary) values(?s, ?d)", а "insert into t(s) values(?s(name), ?d(salary))". Соответственно, массив передается ассоциативный, вида array( "name" => $name, "salary" => $salary ) а не просто array( $name, $salary ).

Повышает читаемость, при изменении запроса не нужно отслеживать расположение значений в массиве биндингов.

2. Именованные плейсхолдеры позволяют иметь кросс-давижковые функции.

Даже если ты ставишь себе целью писать кроссдвижковый код, то все равно ты неизбежно столкнешься с двумя вещами, которые придется переписывать при переносе между разными движками БД. Первая вещь - это работа с датами.

Именованные плейсхолдеры позволяют делать такое: "insert into t(created) values( ?f(now) )", что на mysql разворачивается в вызов now(), а на MS SQL - в вызов getdate().

3. Постраничная выборка.

Просто в query() добавлено два параметра - с какой записи и сколько вернуть. На разных движках применяются разные методы.


Но общее направление мысли верное, удачи.
 

dimagolov

Новичок
The employer, именование имеет смысл только в insert-ах, где есть строгая пара. при более сложных запросах именование может мешать
 

The employer

Новичок
Автор оригинала: dimagolov
The employer, именование имеет смысл только в insert-ах, где есть строгая пара. при более сложных запросах именование может мешать
Нет, есть еще параметры выборки, условия соединения.

Да, и можно пример, когда именованный плейсхолдер мешает, а неименованный в такой же ситуации подходит лучше?
 

dimagolov

Новичок
PHP:
$sql = "select * from t where id in( ?a(ip_addr) );"
Ок, согласен, если вводить массив как тип, то да. Но возникает другая проблема, элементы массива тоже ведь надо типизировать. И куда ее впихивать? Тапа ?aS ?aI ? ИМХО двухбуквенных указателей типа быть не должно, это усложняет подстановку, плейсхолдеры в идеале должны состоять из одинакового кол-ва символов (хотя скобки все равно обязаны идти следом с именем, так что может и нормально 2 символа). А если впихивать в один символ, то ухудшается читаемость.
PHP:
$sql= "insert into t(s) values(?s(name), ?d(salary))";
Тут синтаксически непонятен кульбит с into t(s).
 

The employer

Новичок
Автор оригинала: dimagolov
PHP:
$sql = "select * from t where id in( ?a(ip_addr) );"
Ок, согласен, если вводить массив как тип, то да. Но возникает другая проблема, элементы массива тоже ведь надо типизировать.
Зачем?
?a предназначен для однородных массивов, именно для подстановки в in().

Больше я в SQL DML как-то не припомню конструкций, где массивы пригодились бы.

Автор оригинала: dimagolov
PHP:
$sql= "insert into t(s) values(?s(name), ?d(salary))";
Тут синтаксически непонятен кульбит с into t(s).
Это просто ошибка, должно быть t(name, salary) - когда пример писал, на ходу передумал, а потом забыл исправить :)
 

DiMA

php.spb.ru
Команда форума
откуда берется $db?

class {

function {

Если так:
global $db;
или
$db=...

}

}

Это - костыль.

Во-первых, все запросы нужно отделять от кода в отдельный класс. Во-вторых, в нем $this->db()->... должно само наследоваться (и все, что касается общения с базой или иными типами данных) .


> Ок, согласен, если вводить массив как тип, то да. Но возникает другая проблема, элементы массива тоже ведь надо типизировать. И куда ее впихивать? Тапа ?aS ?aI ?

Элементратно, Ватсон

WHERE status @str(status) AND id @int(id)

Если status не существует (NULL), то шаблонизатор делает так:
WHERE status=status

Если значение
WHERE status='123'

Если массив
WHERE status IN ('1', '2', '3')

Небольшой костыль "status=status" нужен, чтобы с AND не заморачиваться, если статус не передали.
 

Духовность™

Продвинутый новичок
The employer
Спасибо за высказанное мнение, но "Плейсхолдеры именованные" мне пока как-то не очень нужны. Как-то хватает с головой того, что есть :)

-~{}~ 24.07.09 23:36:

откуда берется $db?
В смысле откуда берется $db в ИНОМ классе? Дык это уже зависимости...


2ALL вы как-то заморачиваетесь. Вы пытаетесь придумать мегасложную по своему синтакису систему. Лично я уже испугался того, что вы тут понаписали.
 

DiMA

php.spb.ru
Команда форума
Я не про зависимость, а о костыле, что в начале каждой функции нужно подключать $db.

> 2ALL вы как-то заморачиваетесь.

Не, пример, что я привел, весьма приятен в работе и универсален (по сравнению с голыми SQL запросами)
 
Сверху