Выполнение запроса
Запрос выполняется с помощью метода query():
mixed $db->query(string $pattern [, array $data [, string $fetch [, string $prefix]);
Это один из немногих методов mysqli, переопределенный в goDB. Впрочем, вы можете использовать его по старинке без каких либо различий:
$result = $db->query("select * from `table` where `id`=10");
Единственное различие при таком формате вызова: при возникновении ошибки, она не тихо оседает в каком-то внутреннем поле, а вываливается в виде исключения.
Основные различия начинаются при указании второго параметра.
В этом случае $pattern рассматривается как шаблон запроса, а
$data, как массив входных данных. На основании этих двух аргументов и формируется запрос.
Note: в PHP 5.3 и выше, можно не вызывать метод query а использовать вызов самого объекта:
$result = $db($pattern, $data, $fetch);
Формат шаблона запроса
Шаблон запроса, представляет собой «почти SQL», только место вставки очередного данного помечается особой последовательностью: плейсхолдером. Пример:
$pattern = 'INSERT INTO `table` (`a`,`b`,`c`) VALUES (?, ?, ?)';
$data = array('раз', '2 ("два")', 'три');
$result = $db->query($pattern, $data);
В результате будет выполнен запрос:
INSERT INTO `table` (`a`,`b`,`c`) VALUES ("раз", "2 (\"два\")", "три")
Как видно, данные из массива последовательно вставились в шаблон на место знаков «?» (плейсхолдеров). При вставке данные экранируются и заключаются в кавычки.
Список плейсхолдеров
Для вставке данных можно использовать отнюдь не только простой ?.
Полный список доступных плейсхолдеров и поддерживаемых форматов данных приведён ниже.
Большинство плейсхолдеров имеют, как краткий формат (?v), так и "длинный" (?values).
Перечеркнутые плейсхолдеры не рекомендуются к использованию и оставлены для обратной совместимости.
? ?string |
Общий вид данных, обрабатывается как строка: специальные символы экранируются, вся строка заключается в кавычки. Пример см. выше. |
?n ?null |
Итог: Единственное отличие от Подобные два варианта имеют место также для |
?i ?int |
Вставка числа: Итог: Очередное данное вставляется, как число. Если там строка — приводится к числу. Несмотря на название, обрабатывает не только int, но и float. Предотвращение SQL-инъекций: В принципе, простой плейсхолдер |
?in ?ni ?int-null |
Аналогичен |
?bool |
Вставка значения для столбца типа Несмотря на то, что в mysql BOOL на самом деле представлен числом,
|
?l ?list ?a |
Список значений в виде порядкового массива: Итог: Все элементы массива обрабатываются как строки (могут также содержать null). |
?li ?list-int ?ai ?ia |
Аналог Запрос: |
?s ?set |
Ассоциативный массив "столбец"=>"значение" (для секций типа Запрос: |
?v ?values |
Двумерный массив — список из нескольких строк: Запрос: |
?t ?table |
Вставка имени таблицы: Запрос: Как видно, первое применение: указание таблицы, чьё имя хранится где-то. Плюс ещё удобная фишка: использование префиксов. Запрос: То есть, если мы хотим использовать префиксы для таблиц, мы можем один раз в начале вызвать Также префикс можно указать в сразу конфигурации базы (см. раздел про подключение). Ещё префикс можно указывать непосредственно для одного запроса в соответствующем аргументе метода Ну и если префиксы использовать хочется, а хранить имена таблиц отдельно нет, есть дополнительный синтаксис:
|
?c ?col |
Имя столбца. Используется, когда имя столбца по каким-то причинам лежит в переменной. В других случаях злоупотреблять им не следует. Дополнительно возможен формат Запрос: |
?e ?escape |
Вставка части строки (экранируются спецсимволы): Запрос: |
?q ?query |
Вставка части запроса. Запрос: В отличии от варианта |
?; ?set; ... |
В случае возникновения неоднозначностей, плейсхолдеры можно заканчивать точкой с запятой " |
?? |
Для вставки напрямую знака вопроса, удвойте его. |
В случае, если количество плейсхолдеров не совпадает с количеством входных данных (размером массива $data), а также,
если указан неизвестный плейсхолдер, генерируются исключения.
Если входных данных нет, вместо пустого массива можно указать NULL: $db->query($pattern, null, 'el');.