После года разгильдяйничества, решил снова заняться своей библиотечкой для работы с MySQL.
Изменения в версии 1.1.3 незначительны, но, надеюсь, что вскоре будет что-нибудь поинтереснее.
Плейсхолдер ?e
?e
— экранированная (escape) часть строки. В отличии от простого ?
(целая строка) не заключается в кавычки.
Пример:
$search = '"Пыха" рулит'; $pattern = 'SELECT * FROM `table` WHERE `text` LIKE "%?e%"'; $data = array($search); $db->query($pattern, $data, 'assoc'); // SELECT * FROM `table` WHERE `text` LIKE "%\"Пыха\" рулит%" |
Плейсхолдер ?q
?q
— часть запроса. Вставляется напрямую без каких-либо изменений. Если нужно составить запрос из нескольких строк, а конкатентацию использовать не хочется.
$where = '`col`=12'; $pattern = 'SELECT * FROM `table` WHERE ?q ORDER BY `id` DESC'; $data = array($where); $db->query($pattern, $data, 'assoc'); // SELECT * FROM `table` WHERE `col`=12 ORDER BY `id` DESC'; |
Можно сделать с конкатентацией:
$pattern = 'SELECT * FROM `table` WHERE '.$where.' ORDER BY `id` DESC'; |
Отличие в том, что при конкатентации $where станет частью шаблона и в нём могут присутствовать плейсхолдеры. При вставке через ?q
никакой обработки значения не будет.
Метод countRows()
$db->countRows(string $table [, string $where [, array $data])
Получение количества строк в таблице.
Узкоспециализированные методы, конечно, не приветствуются, но слишком часто приходится писать одно и тоже.
$db->countRows('table'); // SELECT COUNT(*) FROM `table` $db->countRows('table', '`id`>10'); // SELECT COUNT(*) FROM `table` WHERE `id`>10 $db->countRows('table', '`id`>?i', array(10)); // SELECT COUNT(*) FROM `table` WHERE `id`>10 |
@todo: длинные плейсхолдеры
По сравнению с изначальной версией плейсхолдеров расплодилось: ?, ?i, ?n, ?s, ?v … Чёрт ногу сломит. В следующей версии собираюсь сделать «длинные» эквиваленты существующих:
?s - ?set ?v - ?values ?t - ?table ... |
Все предложения по этому и другим поводам можно оставлять здесь или на Пыхе.
Спасибо
dallone, 1.06.2010, 21:00
dallone, нема за що.
vasa_c, 1.06.2010, 21:02
countRows() излишен…
лучше бы сделал чтобы можно было использовать несколько раз одну и туже переменную
goDB::queryDB(»
INSERT INTO table (field) VALUES (?1) ON DUPLICATE KEY UPDATE field = ?1″,
array($var)
);
adw0rd, 1.06.2010, 22:42
По мне, параметры должны быть именованными. Так читабельнее.
«SELECT u.* FROM users AS u WHERE u.id=:userid»
artoodetoo, 2.06.2010, 5:27
А откуда брать этот «:userid»? Передавать данные ассоциативным массивом? В большинстве случаев от этого, имхо, будет больше гемороя, чем читабельности. Хотя как дополнительный вариант можно попробовать сделать.
vasa_c, 2.06.2010, 9:51
adw0rd>> лучше бы сделал чтобы можно было использовать несколько раз одну и туже переменную
С именованными параметрами это решается само.
@vasa_c: Ну да, ассоциативный массив и/или методы вроде bind(name, value)
artoodetoo, 2.06.2010, 13:18
а как же холдер ?m
CTAPbIu_MABP, 25.06.2010, 17:43
CTAPbIu_MABP, а что это?
vasa_c, 25.06.2010, 19:34
как что это сокращение для ?mabp
CTAPbIu_MABP, 25.06.2010, 19:42
Никаких Мавров в запросах!
Они всю базу порушат.
vasa_c, 25.06.2010, 21:56