![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Gold Dragon |
|
||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Читаю литературу и везде один и тот же пример.. Общую теорию освоил:
- т.е. мы готовим запрос ->prepare() с вопросительными знаками - далее связываем типы с данными ->bind_param() - и выполняем запрос ->execute() На первый взгляд очень всё понятно, наглядно и безопасно. Но возникло несколько вопросов, которые я так и не могу реализовать.. Допустим у меня есть "обёртка" MySQLi. Где-то в начале я подключаюсь в базе.. Далее при необходимости я делаю два вызова метода класса обёртки: первый - формирую сам запрос, второй - то что хочу получить. Например
Т.е. отправляю запрос, строку с типами (число и строка) и массив с данными Следующим запросом я хочу получить допустим ассоциативный массив с объектами в формате
И соответственно делаю запрос
И тут возникают проблемы.. Во-первых, в bind_param нужно перечислять переменные, а значит массив не покатит. Во-вторых, не совсем понятно как мне доставать результат. Кто уже активно работает с этим прошу научить ;) а если есть готовая обёртка, то буду просто рад Это сообщение отредактировал(а) Gold Dragon - 27.10.2012, 11:15 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||
|
|||||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 3 Всего: 137 |
Или я не очень понял сути, или все зависит от фреймворка, не?
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Я делаю CMS в том числе сейчас пишу обёртку для MySQLi. Вернее у меня уже есть класс для работы с mysqli, но хочу её переделать чтобы использовать mysqli_stmt. Но что-то пока не могу понять как этим вообще пользоваться. На простых примерах всё просто, а вот сделать что-то универсальное пока не получается. Т.е. когда не известно сколько и каких данных поступает в запросе и в каком формате выдать результат
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 3 Всего: 137 |
У Котерова в книге PHP5 можно прочитать про placeholders, впервые я это увидел там (еще до появления многих фрейморков). Вообще не очень понятно зачем что-то возвращать, или имеется ввиду внутренний механизм? Если так, то там просто идет замена ? на значения массива.
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Может не совсем понятно объяснил... В общем чтобы получить какой-либо результат мне нужно вызвать два метода "обёртки"
Первый формирует сам запрос, т.е. всё подставляет: меняет префиксы таблицы в соответствии с настройками движка, проверяет входные данные на соответствие и т.п. и т.д. Сейчас использую простое экранирование для строк (mysqli_real_escape_string). А вот этот подход должен меня избавить от подобного и сам запрос будет безопаснее, да и работать с ним проще. А вот второй метод (вернее их множество) должен возвращать данные в том виде в котором я их хочу получить. Допустим, только первую строку или весь результат в ассоциативном массиве или же объектом или только первое значение первой строки и т.п. -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Aliance, спасибо за книжку.. кажется есть по моей теме.. бегло пробежал, наверное именно то что я ищу. Правда я хочу это реализовать по другому.. но хотя бы будет от чего отталкиваться..
PS документации по mysqli_stmt практически вообще нет :( -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Вообще-то она есть, и называется PDO. Во всяком случае- методы именно оттуда. В нем есть, разной степени удобства, механизм подстановки параметров. Вместе с bindParam или прямо в execute массивом. Именованные параметры или вопросики по порядку и так далее... Другое дело, если ли в этом pdo поддержка mysqli_stmt? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
мне нужен не монстр, а маленький, удобный, понятный, простой класс
В принципе DbSimple это то что мне нужно, но немного не то что я хочу получить в идеале.. попробую сначала его поломать и посмотреть... -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
||||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Если не смущают конструкции типа
на которые ругается синтаксически анализатор, начиная с 5-го php, то почему бы и нет. А вообще, вместе с Котеровской debugConsole - достаточно удобная штука. Хотя я от нее недавно отказался в пользу класса из instantCMS. Он там совсем никакой, даже сам не эскейпит параметры и его еще нужно допиливать, зато маленький и понятный -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
а разве его (DbSimple) не допилили до 5-й? А вообще. я уже не рассматриваю всё что ниже PHP5.3
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
В общем нашёл обёртку, практически то что мне нужно.. сделана как утверждает автор на основе DbSimple.
Правда стиль написания очень своеобразный: всё на ссылках, вызовах пользовательских функций и callback.. Да и как-то наследуемый класс получается вспомогательным для основного.. Очень не привычно... Честно говоря пока очень путаюсь... Но главное всё работает и отлично работает вот SVN http://code.google.com/p/simple-mysqli-class/ Выборку можно делать как так
так и вот так
Основные выборки Выборка строки: selectRow() Выборка ячейки: selectCell() Выборка столбца: selectCol() Выборка всего: select() Вставка данных: insert() Удаление: delete() Замена: replace() Очень маленький и ничего лишнего... Но вот пока думаю как туда своё добавить, очень непонятный и запутанный стиль написания кода, не люблю передавать ссылки на переменные, не понятно что и где берётся тогда Это сообщение отредактировал(а) Gold Dragon - 23.10.2012, 18:11 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
В общем вот собрал класс-обёртку. Прошу посмотреть, оценить, покритиковать, дополнить, улучшить... в общем вы всё знаете сами
Постарался всё полностью прокомментировать.
Класс пишу для конкретного проекта, так что основные настройки получаю через псевдо-функцию по типу такой
Это сообщение отредактировал(а) Gold Dragon - 24.10.2012, 10:40 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Вопрос. как ты планируешь обращаться к свойству класс с именем ''? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
НУ это я чисто для примера привёл, т.е. в этой функции заложено получение переменных конфигурации... Функция это всего лишь короткая форма. Так что в классе все "непонятные" значение превратятся в NULL, т.е. в расширенной версии и функции и класса всё это предусмотрено. Это сообщение отредактировал(а) Gold Dragon - 25.10.2012, 07:37 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Так что по Классу скажите? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Класс на 400 строк с экрана оценить? На первый взгляд - там слишком много завязок на stmt реализацию. Вроде бы сам класс достаточно гибок, чтобы подключать к нему и другой транспорт. Просто прикинуть, как будет выглядеть это-же при pdo или нормальном mysql и выкинуть частные функции в транспортный класс или в отдельный массив настроек. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Ну там большая часть комментарии
А почему плохо что лишком много завязок на stmt реализацию? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Тем, что стандартный (для меня) класс - mysql. Иногда нужен mysqli. Один раз встречался pdo. Если привыкать к какому-то единому интерфейсу, то лучше, чтобы класс минимальными телодвижениями превращался в то что нужно, без правки окружающего кода. В идеале - просто конфигурацией . -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
В принципе согласен
Добавлено @ 12:11 чуть изменил один метод.. Добавил обработку исключений когда количество маркеров в запросе не совпадает с количеством входных данных
Это сообщение отредактировал(а) Gold Dragon - 25.10.2012, 12:13 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Скажете это фейсбуку и вконтакту? "а мужики-то не знают..." -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ну так у нас ВАЗ до сих пор 7-ку выпускает
Для меня вообще-то это не авторитеты.. Да это достаточно мощные и супер раскрученные системы. Но с точки зрения движка - я бы не сказал что уж супер-пупер Добавлено через 3 минуты и 8 секунд да и если создавать CMS с нуля, то уж лучше сразу ориентироваться на самое новое -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 3 Всего: 137 |
[holywar]А кто тогда для вас авторитеты?[/holywar] |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Вот когда я ставлю тебе плюс в репу, вот тогда ты для меня авторитет ;) Думаю мысль мою понял...
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 4 Всего: 91 |
Смешно... |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
что именно?
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| gta4kv |
|
|||
![]() Walking around mad. ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1868 Регистрация: 25.7.2006 Репутация: 4 Всего: 91 |
Смешно, что не показатель. Смешно и это:
А что вы о них знаете? А вообще о построение систем из тысяч серверов? Что с ними не так? Особенно контакт, кстати, страницы открываются - моментально. Чем фейсбук не может похвастаться. |
|||
|
||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ну хотя бы потому
Если даже сами разработчики говорят отказаться от использования MySQL Добавлено через 1 минуту и 54 секунды
Добавлено через 6 минут и 10 секунд ладно, спор тупиковый ;) Лучше класс посмотри.. Если нужны примеры как использовать класс, то могу выложить... Кстати, я ещё ещё сделал возможность кэшировать результаты, правда отдельным классом, но в качестве эксперимента могу отдельным методом в этот подцепить Это сообщение отредактировал(а) Gold Dragon - 25.10.2012, 20:18 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Смешно... Я бы даже сказал обхохочешься. Что вы знаете о топологии интернета и инфраструктуре контакта и фейсбука? Gold Dragon,
Объясни логику этого метода? Вот почему явно не получить параметры в виде массива? Почему, опять же явно, не передать их напрямую в s_query? -------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Вызывается некий общий метод (s_query), которому единственному дозволено вызывать сакральный метод query транспортного класса. По форме - непонятно накой было вызывать его через call_user_func_array. Зачем нужно вписывать _mysqliFetchAssoc. Лучше вписать слово 'select', а в s_query получить этот самый _mysqliFetchAssoc из массива настроек транспорта (их еще нужно вписать). Так может получится еще забавней -
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Fortop, по первой твоей цитате я уже ответил
А вот по второй части... можно и нужно поговорить.. Если ты внимательно читал сначала, то я сказал что код не мой и со многим не согласен и что этот код прямая противоположность к чему я привык, да и вообще полная противоположность моему стилю... НО(!) это работает, это полностью удовлетворяем моим потребностям, а значит этот "стиль" уже можно адаптировать "под себя"... Я собрал класс, уже внедрил в свою систему, работает идеально (особенно в совокупности с кэшем, правда файловым) Логику ты и сам видишь, не глупее же паровоза честно говоря, я бы так и сделал. Но начав переделывать использовать, то понял, что иногда это не нужно делать. И как ни странно, мне это понравилось. Конечно во мне до сих пор существует противоречие, которая явно против такого стиля, т. е. я всегда хочу знать что посылаю и что получаю... Но тут есть один нюанс: нам не нужно знать как это будет работать, но нам нужно знать как это нужно отсылать. А значит если класс отлажен то всё равно как он принимает параметры. А для пользователя очень будет удобно делать и так
и так
Согласись, очень удобно сам в шоке PS вот по этому мне и нужна серьёзная критика Добавлено @ 09:33 Да, скорее всего так и переделаю... т.е. нафига столько "транспорта"... нужно напрямую делать вызов Это сообщение отредактировал(а) Gold Dragon - 27.10.2012, 09:35 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
В первой цитате вопрос был к gta4kv, который настолько одарен, что не знает что сигнал распространяется не мгновенно. И до фейсбука от меня примерно 20 хопов и 130мс соответственно. А до контакта всего 12 и 30мс. В первом случае коннект идет к серверу в США, во втором случае в России. К примеру, у нас европейские сервера имеют +0.2+0.4с задержки при обращении к яху, в сравнении с серверами в Техасе. Я пользуюсь IDE поэтому phpDoc решает вопрос с числом параметров. А вот явное указание их для меня уменьшает вероятность случайной ошибки => я могу сосредоточить внимание на более важных моментах. Гибкость в параметрах полезна в рамках фреймворка, когда решаются некие абстрактные общие задачи и гибкость важна. Но чаще мы уже точно знаем что мы делаем. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
А что касается ошибок, то в данном случае первый параметр всегда запрос, всё остальное - параметры -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Тогда непонятно удобство. Наоборот лишняя чехарда, массив или список параметров... Вообще я за список. Массив плохо поддается контролю со стороны IDE А городить отдельный класс параметров для этого случая.... ну можно, но лениво.
Это для использования. А для модификации этого класса? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Согласен, мне понадобилось послать отдельный параметр для кэширования, а в данном случае нужно менять код полностью или посылать команду отдельно.
Списком передавать хорошо, но вот только их количество всегда разное Это сообщение отредактировал(а) Gold Dragon - 29.10.2012, 07:17 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Что-то я не догоняю. Идет речь про вот такое?
Fortop, утверждает, что это плохо и неудобно, так как фиг его знает какие параметры указывать, а IDE даже и не сможет подсказать. Ну так можно написать так
ничего не меняя внутри метода и IDE будет доволен. Дополнять ассоциативный массив новыми фичами для кэширования можно сколько угодно и каким угодно дополнитеным количеством параметров. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||
|
|||||||
| Gold Dragon |
|
||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
по тому что IDE скажет в данном случае я не заморачиваюсь, и именно так и сделал как указал ksnk. Правда это не только массив, но может быть и список переменных... вот в этом может быть загвоздка..
Но суть в другом.. У меня есть метод для кэширования результатов запросов
суть в том, что напрямую я передать не могу, т.к. у меня первым идёт сам запрос. а дальше данные для постановки. И чтобы добавить мне какой-либо параметр, мне нужно всем методам сказать, что есть ещё один параметр... Т.е. это не проблема, но гибкость меняется.. Вот по этому мне пришлось написать новый метод.. Хотя может оно и лучше... Т.е. вызов будет с кэшированием такой
а без кэширование такой
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||
|
|||||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
может так? Насколько умный алгоритм расшивающий параметры в строке sql? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Ну и смысл тогда в func_get_args и прочем? Я про это и говорю. Массив тут крайне неинтересен поскольку плохоинформативен и начинает содержать неоднородные параметры (одни для подстановки в запрос, другие для кеширования) Я из-за похожей методики туго перевариваю Yii - он заставляет помнить кучу ненужного материала или постоянно лезть в мануал. Подошел бы такой вариант,
но он трудоемок (хотя если код не консистентный, то можно сделать только для этого случая, а в других местах использовать что-то другое). -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Смысл? Процедура транспортного уровня - приватная и как она устроена - никого не должно волновать. Так что пусть получает один параметр - массив. Почему бы и нет? Зачем многократно перекладывать из массива в параметры и обратно, как это было в коде ? Обсуждаемая функция (select) - просто обертка над транспортом. Она должна выглядеть удобно для писателя, а внутренняя - удобно для исполнения.
В принципе - согласен. Можно предложить еще один способ "впихнуть невпихуемое".
к инстанцируемому объекту привязывается опция. Вообще, считаю что у Котерова была замечательная идея в DBSimple про то, что нужно явно указывать способ приведения параметров к типу прямо в SQL запросе - макроподстановки при пустом параметре и макры типа ?d, ?#, ?a . Правда использование "массивных" макр не совершенно, иногда приходится выписывать лишние array_keys и array_values
У pdo есть не менее замечательная идея, что можно использовать "именованные" параметры в строке sql. А вот для указания типа параметра прямо в запросе - не догадались, приходится городить отдельный бинд каждого параметра с указанием типа. Так что если объединить пару идей, то может получится что-то близкое к совершенству. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||
|
|||||||
| ksnk |
|
||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Придумалось, что новый огород городить смысла нет, можно воспользоваться "шаблонными" идеями. Из твига, например. При этом элегантно решается проблема использования вопросиков в неожиданных местах запроса.
Это будет - вставить первый параметр, проверить на "массивность". Обычный вопросик без цифры - следующий по порядку параметр.
Это - именованный параметр. "фильтры" видятся в таком наборе - key, value - массивные строковые списки с дефолтным escape'ом строковых параметров у keys - int, float - проверка параметра на целость - дробность, без escape - noescape - не ескейпить параметры Макры для условной генерации
Хотя с IF'ом, вероятно, несколько перегружено, есть ли необходимость в еще каких-нибудь контрольных операторах? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||
|
|||||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
||||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Ну, про немонстра, вероятно, действительно несбыточное желание. А вот про маленького монстрика - вполне.
Что-то написалось. На мой взгляд - довольно гибко и прилично. Вот кусочек юнит тестов
Смысл шаблонизатора - строка sql-twig шаблона, парсится в строку и из нее собирается функция с помощью create_function. Функция САМА эскейпит параметры и всячески над ними издевается. Способ работы с ней, вероятно, какой-то такой
Сейчас поддерживаются только ?\d* параметры, без именования. Писано за пару часов, так что не обессудьте. Но вдруг кого заинтересует... https://github.com/Ksnk/sql_template -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| Gold Dragon |
|
||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ksnk, а вот впихнуть кэширование в инициализацию - мысль очень даже интересная. Можно что угодно докручивать кстати. Вот только ...
да, идея интересная, но с другой стороны, а не излишняя?
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||
|
|||||
| ksnk |
|
||||||||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
30.10.2012, 09:12 - первый пост, начало мысли, а в 30.10.2012, 13:36 уже проект на гитхабе. Не пара, конечно, но все равно довольно быстро. Ну и допиливал понемногу в течении дня. Сейчас, кстати, он сравнивается с pdo и не особенно значительно проигрывает в скорости. По большому счету - можно пренебречь... А в удобстве, imho, будет превосходить. Там в test/spl_templaterTest.php есть немножко примеров традиционных запросов. Это части phpUnit, но понять что и как исользуется - можно.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||||||||
|
|||||||||||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ты фанат шаблонов
ksnk, а не получится так что к твоему творчеству придётся справочник писать? Ты практически новый язык придумал -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Синтаксис от Твига. Точнее от Django-template. Так что если есть опыт использования таких темплейтов - нет ничего сложного, просто пару новых слов запомнить ;) Несколько непривычно для twig'а используется знак вопросика, но это остаточек от традиционного sql-плейсхолдинга, вроде должно быть относительно привычно. Вот насчет условных операторов сложнее, если их использовать, то оттранслировать это с помощью только строковых операций уже не удастся, получится тяжелее и дольше по времени трансляции. Хотя IF'ы, в принципе, не помешали бы. Да и циклам нашлось бы применение для монтажа простыней из insert values... Впрочем, обойдусь, пока. ;) Пока я попробую наладить и потестировать систему перехвата ошибок трансляции, она там пока просто никакая. А вообще-то получилось забавно, и вроде, вполне работоспособно... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
кстати, по ходу... не могу отловить исключение при создании объекта
знаний не хватает. Вылетает варнинг по типу
А нужно чтобы всё грамотно было типа так
Это сообщение отредактировал(а) Gold Dragon - 31.10.2012, 07:32 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||
|
|||||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
А что перехватывать-то надо? Неправильные параметры в _config? или проблемы с созданием объекта mysqli? Вроде в php.net про это какие-то примеры есть. не подойдет?
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Ну да, если ошибка в пароле, пользователе, названии базы....
Т.е. не чтобы ошибка вылетала, а именно исключение -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
вот, довольно кошерный пример по моей ссылке. Там еще есть разной степени применимости. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
|
||||
|
|||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
baldina, а разве несколько раз можно объявлять подобную конструкцию? Просто у меня это класс уже в этой констукции.... т.е. в index.php
Добавлено через 4 минуты и 34 секунды ksnk, что-то как-то не то... В том то и дело что всё остальное отлично ловит исключения, и даже после new, но вот если ошибка в new, то выдаёт и ошибку и исключение на connect_error друг за другом Это сообщение отредактировал(а) Gold Dragon - 31.10.2012, 20:34 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
какую именно? Добавлено через 3 минуты и 40 секунд если try...catch, то сколько угодно. поймается исключение там, где первый блок catch соответствует по типу. но вообще стратегию ловли исключений продумывать надо, это же часть архитектуры. исключения хороши там, где требуется обработать ошибку не на том уровне, где она возникла, плюс управлять обработкой: не нужно тащить вверх коды ошибок, не нужно лишних if Добавлено через 7 минут и 33 секунды вообще, как я понял, проблема была не в обработке исключений, а что они не генерятся. решение - mysqli_report (MYSQLI_REPORT_STRICT); |
|||
|
||||
| Gold Dragon |
|
||||||||||||||||||||||||||||||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Так, всё закачал на GitHub
https://github.com/GoDr/GDLDatabase Попытался всё здраво описать... (wiki пока не создавал) в файле index.php приведены все примеры Вот описание всех методов Дамп тестовой таблицы
select() - Вывод всех значений
selectRow() - Вывод первой строки
selectCol() - Вывод первого столбца запроса
selectCell() - Вывод первой ячейки первого столбца запроса
update() - Обновление записи
insert() - Вставка записи
replace() - Перезапись записи
delete() - Удаление записи
getCacheSql() - Вывод всех значений (метод selectRow) при использовании кэширования
Транзакция
simpleQuery() - Простое выполнение запроса
getQueryInfo() - Получение дополнительной информации о последнем запросе
getError() - Описание ошибки последнего запроса
getErrno() - Описание номера ошибки последнего запроса
showProfiles() - Показать профилирование запросов
getObject() - Возвращает обьект класса mysqli для нереализованных операций
Добавлено через 6 минут и 19 секунд Жду обсуждений по этому классу... Это сообщение отредактировал(а) Gold Dragon - 5.11.2012, 16:23 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Чуть изменил метод getQueryInfo(). Теперь может выводит как ассоциативный массив с дополнительной информацией, так и значение конкретного ключа если передать имя ключа
Например:
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Gold Dragon, еще не наигрался?
http://framework.zend.com/manual/2.0/en/index.html#zend-db http://framework.zend.com/manual/1.12/en/zend.db.html -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
нет конечно. И я как-то говорил что мне не нужен супер-монстр, а нужен маленький монстрёнок
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
ну если для тренировки только, то наверно полезно.
жаль, поторопился, мог бы сэкономить время, если бы лучше продумал архитектуру: сплошной copy-paste и интерфейс получился не слишком интуитивный, зачем мне вызывать специальную функцию delete или update, если я все-равно должен этот delete или update продублировать на sql? тем более что реализовано оно, мягко говоря, не разнообразно
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
baldina, замечая в тему и уже были озвучены. Функции разделены, т.к. в ближайшее время исправлю ситуацию с
То что код получился не слишком интуитивный, согласен. Сейчас конечно мне он понятен, но раньше пришлось по ломать голову. Я ранее писал что за основы и идею взял чужой код, который был работоспособен и отвечал моим "хочу". Но весь код построен на ссылках, я а это очень не люблю..Начал исправлять - полезли ошибки. Т.ч. пока оставил так. В конечно итоге конечно все постараюсь переделать. Для конечного пользователя это никоем образом не скажется Сейчас задача избавится от лишнего.. т.е. если insert и ему подобные, то в sql-запросе этого не должно быть -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Хотя бы по тому, что обработка результатов запроса разная. Для инсерта нужно выдать last_insert_id, а для Delete - количество удаленных строк. Вообще - довольно полезно иметь selectCell, selectRow, insert, delete, update, и т.д. для разных вариантов возвращаемых данных. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sanchezzz |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 1 Всего: 60 |
Я как то месяца 4 назад страдал такой же ерундой только в стиле PDO страдал чисто для себя и иза того что нужно было узнать предварительный результат сформулированного запроса в PDO с этим беда.
Мне вот с кешем не понравилось как у вас сделано я сделал у себя просто вызов метода до выполнения prepare и execute query просто как метод Цель метода указать использовать каширование
В данном случаи это просто установка флага в классе и инициализация через конфиг адаптера под каширование
В методах execute query реализована обычная проверка на наличие включения включенного кеша. В методах feach() реализован схожий функционал PDO получения результата кеша как будто из базы работаем feachAll работает по прицепу отдать все В данный момент пишу обучалку ИИ для этого дела что бы медленные запросы система сама кашировала. Спасибо knsk за идею с шаблонными запросами Я ток одном месте их использовал при наличии в название таблицы {{table}} подставлять прификс таблицы ( понравилась мне эта фишка в Yii ). Чуть не забыл почему я выбрал PDO: Гибче, абстракнее, приятный синтаксис написания, по скорости: проигрывает капельку mysqli (где то видел тест но сам не проверял). А именованные плэйсхолдеры повышает наглядность и эффективность использования в отличии от mysqli где просто "?" где иногда просто заставляет считать вопросики... Хоть сам PDO и поддерживает плэйсхолдеры в стиле "?" (честно не пользовался).... Планов у меня много и идей хоть отбавляй ( вот времени всегда мало) -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
||||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
В смысле? писать
Так? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
да
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
baldina, На мой взгляд - первое из этих слов ->select необходимо, так как оно определяет формат ожидаемого мной оответа. Второе, если эстетические чувства протестуют - можно подставлять внутри функции. Мои эстетические чувства не протестуют. А вот подстановка в некоторых(не всех) функциях - странное и не совсем логичное действие.
Можно делать как DBSimple - выяснять результат, анализируя начало строки запроса. На мой взгляд - это непроизводительная потеря и так нерезинового времени. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
можно сделать много чего, в т.ч. красиво и эффективно.
я всего лишь указал на сей недостаток (и Gold Dragon согласился) |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Ok! Согласен. Пусть решает дракон -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
||||||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Тут я поразмышлял малость и прикинул... Допустим я всё упрощаю и удаляю "повторы" в этом ...->insert("INSERT... Тогда мне нужно передавать не строкой запроса, а переменными Возьмём запрос для вставки.
Сейчас тут 1 - Запрос 2 - массив с переменными Если мы хотим избавится от "избыточности", то нам нужно передавать 1 - имя таблицы 2 - массив с именами полей 3 - массив с переменными и вызов будет примерно такой
Теперь если взять "обновление" и сделать по подобию
То нам нужно передавать 1 - имя таблицы 2 - массив с именами полей 3 - массив с переменными 4 - массив с именами полей в условии 5 - массив с переменными условия И получается что-то типа такого
Вот тут то и вопрос: "А не слишком это всё усложняет и загромождает систему?" Добавлено через 2 минуты и 41 секунду и это если запросы простые без вложенности Это сообщение отредактировал(а) Gold Dragon - 19.11.2012, 14:33 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||||||
|
|||||||||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
По-моему поздно пить боржоми -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
адсолютно не поздно.. В крайнем случае можно сделать дополнительные методы
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Тут обсуждается построитель запросов? Как показывает практика, строить достаточно адекватно удается только простые запросы. Всякая сложность потребует неадекватного усложнения построителя. Можно посмотреть на сложность activeRecord в Yii, например.
Тонкость в том,что вся эта сложность нужна ТОЛЬКО для генерации строки SQL. Зачем ее генерировать, если можно просто ее явно записать? Строка SQL может зависеть от конкретного sql-транспорта и незначительно меняться в зависимости от него. Почему бы не пойти по пути "многоязыковых" приложений и не сделать словарь SQL запросов, если действительно нужно работать в нескольких местах? Запросов в приложении не может быть уж очень много, так что словарь вполне реален. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ksnk, не совсем уловил мысль.. На примере покажи
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
можно сделать построитель для любых по сложности запросов, такой, что сложность построения не превышает сложности sql, но возможен контроль типов, а также генерация sql, зависимая от драйвера.
уверен, внутри за счет полиморфизма и пр. все будет выглядеть коротко и ясно, а результат для использования - что-то типа такого:
есть например такая библиотека http://www.notorm.com/, поглядите исходники. Это сообщение отредактировал(а) baldina - 19.11.2012, 16:59 |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Про что? Про "многоязыковые" словари?
Вот, что-то на коленке накропалось ;) -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 2 Всего: 101 |
а вообще, мне кажется, нужно начинать с целей: чего хочется достичь. Gold Dragon хотел маленькую библиотеку, удобную для него лично, но результат стал естественным образом разрастаться - по мере понимания проблем и способов решения.
видимо можно было прийти к пониманию несколько иным путем - сформулировав требуемый интерфейс к бд. а для начала - познакомиться с тем, что есть. вот например: http://sql-cross-queries.freexit.eu/ не удивлюсь, если в результате ТС поймет концепцию некоторых ранее виданных библиотек, что-то ему понравится, и он бросит свой велосипед. хотя велосипеды изобретать полезно: начинаешь понимать как оно работает |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
ksnk, это же самое можно реализовать без словарей
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ksnk, очень сложная система получается, да и не нужная на мой взгляд... Нужно как минимум ещё и "словари" знать
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |