Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс для работы с базой, Обсуждаем, делаем... 
V
    Опции темы
IZ@TOP
Дата 6.9.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Вполне возможно что я незнаю всех возможностей PDO, но:

Код

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
foreach($_POST['inserts'] as $key => $insert)
    $stmt->execute($insert);


В данном случае происходит вставки раз за разом выполняя запрос.
Есть множественные вставки, которые представляют из себя VALUES через запятую:
Код

...(:name, :value), (:name, :value), (:name, :value), (:name, :value)...

Должен сказать что это работает гораздо быстрее. И как я уже сказал, на уровне конструктора мы сокращаем время на просмотр SQL ошибок которые появляются из-за опечаток в коде.

Добавлено @ 12:40 
Цитата(Wowa @  6.9.2006,  13:12 Найти цитируемый пост)
имхо очень редко множественные ставки нам нужны будут. 

Я опять цитирую "и я бы еще даже добавил: сокращает время на отладку SQL запросов, так как конструктор не способен забыть вставить скобку, кавычку или запятую."


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 6.9.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



А я что то различия не нашел, между моим кодом и твоим, разве что у тебя в цикле, у меня последовательно, тем более у тебя ошибка smile)
PM MAIL Skype   Вверх
IZ@TOP
Дата 6.9.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Opik, это пример а не ошибка. Это и есть экономия на отклике базы при отправке пакетов. У тебя будут каждый раз отправляться а у меня один раз и сама вставка будет быстрее.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 6.9.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



IZ@TOP
Объясни мне в чем отличие:
Код

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
foreach($_POST['inserts'] as $key => $insert)
    $stmt->execute($insert);

от
Код

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->execute($array1);
$stmt->execute($array2);
$stmt->execute($array3);


В плане последовательности и скорости вставки?
PM MAIL Skype   Вверх
IZ@TOP
Дата 6.9.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Opik
Цитата(IZ@TOP @  6.9.2006,  13:39 Найти цитируемый пост)
код PHP
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
foreach($_POST['inserts'] as $key => $insert)
    $stmt->execute($insert);

В данном случае происходит вставки раз за разом выполняя запрос.


Это я писал пример с PDO.  А разница с твоим примером в том, что $array1, $array2 тон плохого кода - это раз, а если ты не знаешь сколько записей тебе нужно вставить, что и имелось ввиду в данном случае, то естественно цикл. Если же использовать конструктор, мы за один запрос вставляем все пришедшие к нам записи!

Прям разжевывать все нужно! Ей богу!  smile 

Opik, ты знаешь чем отличаются вставки

Код

INSERT INTO `table` VALUES ('a',3,3,1);
INSERT INTO `table` VALUES ('a',4,4,1);
INSERT INTO `table` VALUES ('a',5,5,1);
INSERT INTO `table` VALUES ('a',6,6,1);
INSERT INTO `table` VALUES ('a',7,7,1);
INSERT INTO `table` VALUES ('a',8,8,1);
INSERT INTO `table` VALUES ('b',2,10,1);
INSERT INTO `table` VALUES ('b',2,11,0);
INSERT INTO `table` VALUES ('b',4,12,0);
INSERT INTO `table` VALUES ('b',4,13,1);
INSERT INTO `table` VALUES ('b',6,14,1);
INSERT INTO `table` VALUES ('b',11,16,0);
INSERT INTO `table` VALUES ('b',20,17,1);
INSERT INTO `table` VALUES ('b',20,18,0);
INSERT INTO `table` VALUES ('b',20,19,0);


и

Код

INSERT INTO `table` VALUES ('a',3,3,1), ('a',4,4,1), ('a',5,5,1), ('a',6,6,1), ('a',7,7,1), ('a',8,8,1), ('b',2,10,1), ('b',2,11,0), ('b',4,12,0), ('b',4,13,1), ('b',6,14,1), ('b',11,16,0), ('b',20,17,1), ('b',20,18,0), ('b',20,19,0);

?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 6.9.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



IZ@TOP
Я понял, что ты имел в виду, знаю. Но я не понимаю где отличие (в этом плане) в этих 2-ух кусках кода? И давай не будем про тон плохого кода, как я тебе уже писал, твой код тоже никуда не годиться  smile))))
Цитата(IZ@TOP @  6.9.2006,  15:20 Найти цитируемый пост)
Если же использовать конструктор, мы за один запрос вставляем все пришедшие к нам записи!

констуктор?
PM MAIL Skype   Вверх
Wowa
Дата 6.9.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Спор на пустом месте. Я считаю, что необходимость вставки в одну таблицу нескольких строк - это довольно редкая задача и задача эта будет вряд ли где-то в ядре системы. (ну разве, что создание бэкапа базы и восстановление).

PM WWW   Вверх
IZ@TOP
Дата 6.9.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Wowa, уверяю что в административной панели при работе с модулями будет очень много необходимости делать множественные вставки!
И это не спор))) Он просто издевается, притворяясь маленьким несмышленым мальчиком  smile 

Цитата(Opik @  6.9.2006,  18:26 Найти цитируемый пост)
И давай не будем про тон плохого кода, как я тебе уже писал, твой код тоже никуда не годиться

У меня вообще кода не было кроме того что с PDO. Внимание вопрос:
Что быстрее, один запрос к базе данных или 30?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Wowa
Дата 6.9.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(IZ@TOP @  6.9.2006,  17:31 Найти цитируемый пост)
Wowa, уверяю что в административной панели при работе с модулями будет очень много необходимости делать множественные вставки!

Несколько примеров - в студию! smile
PM WWW   Вверх
IZ@TOP
Дата 6.9.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Wowa, голосование, тесты, привязка к разделам, привязка типов, жанров и т.п.
Достаточно или продолжить?
ЗЫ  я щас работая над проектом типа афиши, там этого добра ой-ой-ой сколько. 

И кстате, почему 
Цитата(IZ@TOP @  6.9.2006,  13:39 Найти цитируемый пост)
... и я бы еще даже добавил: сокращает время на отладку SQL запросов, так как конструктор не способен забыть вставить скобку, кавычку или запятую." 

На этот момент вообще у всех ноль внимания?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 6.9.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Цитата(IZ@TOP @  6.9.2006,  17:39 Найти цитируемый пост)
На этот момент вообще у всех ноль внимания? 

никогда не считал пропущенную запятую большой ошибкой, все правиться за пару секунд


Цитата(IZ@TOP @  6.9.2006,  17:31 Найти цитируемый пост)
Что быстрее, один запрос к базе данных или 30? 

так реч то не об этом.
PM MAIL Skype   Вверх
Wowa
Дата 6.9.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(IZ@TOP @  6.9.2006,  17:39 Найти цитируемый пост)
На этот момент вообще у всех ноль внимания? 


Цитата(Opik @  6.9.2006,  18:35 Найти цитируемый пост)
никогда не считал пропущенную запятую большой ошибкой, все правиться за пару секунд

лично я даже запятую пропускаю крайне редко, поэтому это и не аргумент для меня.
PM WWW   Вверх
Sardar
Дата 7.9.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(IZ@TOP @  6.9.2006,  09:32 Найти цитируемый пост)
Или же исполним один простой метод - конструктор SQL запросов:

Млин, а как же обернуть всё это в логику, что бы не сразу со странички формы в базу, а что то подобное:

Код
//пришли новые курсы со страницы, там JS собирает таблицу и каждые 40 секунд отсылает все изменившиеся строки.

//класс Course представляет собой набор всех курсов в базе
//Course::get(id); - достать по ID, не кешируеться
//foreach(Course::select(aray("cdate"=>Date::interval("2006-09-01", "2006-11-01"))) as $course)
//и т.д.

$cu = Course::update(); //открывает транзакцию

foreach($cupd as $upd) { //в $upd лежит Course::updater() - простейший клас умеет править/создавать новые Course обьекты
  //апдейтеры строяться автоматом с инфы присылаемой от пользователя аяксом
  $course = $upd->process($cu); //не делает обращений в БД, собирает апдейты
  //существует ли строка или это новая известно с инфы которую юзеру отослали, 
  //$upd либо даёт команду на insert, либо update.
}

try {
  $cu->commit(); //если надо открываеться фактическая транзакция в БД, поднимаеться шаблон
  //запроса, формируеться запрос, по возможности всё комбинируеться в единый INSERT/UPDATE
} catch(DBAccessException e){....}

Прикол в том что такие классы очень просты, сами устроены по принципу PEAR: DB_DataObject, расшаривают общий код, но пользовать их одно удовольствие потом smile

Нет прямой связи с БД, захотели сделать откат, не меняя публичный API сделали.

P.S. это я к тому что на слое абстракции PEAR: DB/PDO народ сразу логику ставит, делая прямые запросы... тоже можно, но ИМХО не красиво.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Wowa
Дата 7.9.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(IZ@TOP @  6.9.2006,  17:39 Найти цитируемый пост)
Wowa, голосование, тесты, привязка к разделам, привязка типов, жанров и т.п.
Достаточно или продолжить?

неа, недостаточно. Во всех перечисленных тобою вещах множественную вставку - редко где придется делать, да и не будет она большой(ну самый максимум 20 строк) и выполняться будет крайне редко. Поэтому тут совершенно очевидно, что должен использоваться тот код, который более понятен потом при разборке будет, тот код - который удобнее разработчику писать.
PM WWW   Вверх
IZ@TOP
Дата 7.9.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Цитата(Opik @  6.9.2006,  20:35 Найти цитируемый пост)
так реч то не об этом. 

Речь как раз об этом!

Sardar, как раз об этом я и говорю! Хотя в чистом виде DataObjects я бы использовать не стал, именно тот что PEAR - ибо тормоз, а вот что-то вроде твоего варианта вполне может подойти. Но далее уже с разных точек нужно рассмотреть что к чему.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Vingrad CMS | Следующая тема »


 




[ Время генерации скрипта: 0.1727 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.