Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: PDO: prepare или прямые запросы в простых SELECT-ах?
Покинул форум
Сообщений всего: 57
Дата рег-ции: Май 2014
Помог: 0 раз(а)
Подскажите плиз, что в подобных запросах рациональнее использовать(что будет быстрее работать)? Делать такие запросы в PDO с prepare, либо делать их напрямую ->query() ?
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
чисто теоретически обычные запросы будут быстрее, но в подготовленных запросах код лучше выглядит, и иногда в цикле можно красиво добавлять или обновлять
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Anchor
Отправлено: 27 Мая, 2014 - 19:48:49
Новичок
Покинул форум
Сообщений всего: 57
Дата рег-ции: Май 2014
Помог: 0 раз(а)
OrmaJever пишет:
но в подготовленных запросах код лучше выглядит
Можно уточнить, в каком плане лучше выглядит, что под этим имелось ввиду? Не понял просто
Плэйсхолдеры, я правильно понимаю, здесь вообще нет смысла использовать? :
$mysqli->query('INSERT INTO table SET row1 = "'.$mysqli->escape_string($value).'", row2 = "'.$mysqli->escape_string($value).'" WHERE id = '.(int)$id);
}
// 2
$p=$mysqli->prepare('INSERT INTO table SET row1 = ?, row2 = ? WHERE id = ?');
foreach($arrayas$value){
$p->bind_param('ssi',$value,$value,$id);
$p->execute();
}
вот здесь возможно второй вариант будет работать быстрее, нужно протестить ради интереса
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Anchor
Отправлено: 28 Мая, 2014 - 04:15:14
Новичок
Покинул форум
Сообщений всего: 57
Дата рег-ции: Май 2014
Помог: 0 раз(а)
Ок, thanks. А выигрыш в скорости происходит только в рамках одного http-запроса? Т.е.: перешли по УРЛ(сделали http-запрос), далее при выполнении php, произошла подготовка SQL запроса (prepare); теперь (в рамках этого же http-запроса) делаем неск-ко execute() например в цикле. Вопрос: выигрываем по скорости только в рамках этого запроса? А если мы стали ходить, по страницам товаров, например (другие http-запросы), где меняется только $item_id в "WHERE id=$item_id" - мы не получаем выигрыша по скорости в этом случае? (там же вроде как кешируется шаблон SQL запроса на стороне СУБД)
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Anchor пишет:
(там же вроде как кешируется шаблон SQL запроса на стороне СУБД)
У mysql prepare кэшируется только в рамках одного соединения.
У нормальный СУБД - будет выигрыш. Правда, есть другие тараканы с кэшированием плана запроса. Но этим пусть сама СУБД и занимается.
Используйте всегда prepare для подстановки значений.
Напрямую query можно пнуть, если запрос константный и задаётся только в коде.
----- PostgreSQL DBA
ПТО
Отправлено: 28 Мая, 2014 - 10:01:38
Посетитель
Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012
Помог: 3 раз(а)
Если не ошибаюсь, с prepare будет быстрее только при > 1000 запросах (Добавление)
Как у OrmaJever:
foreach($array as $value) {
}
Stierus
Отправлено: 28 Мая, 2014 - 10:18:01
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
prepare используют не что бы повысить скорость, а что бы обезопасить свое приложение.
EuGen
Отправлено: 28 Мая, 2014 - 10:56:09
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Т.е экранирования во втором случае не было, и метод quote не тратил время на парсинг строки размеров в 20к символов.
esterio
Отправлено: 28 Мая, 2014 - 12:08:36
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
teddy
очень спороно. нужно делать тесты. но и ети тесты будут синтетическими. лично я делал тесты при простых запросах со вставкой рандомной строкы. екранирование дало вииграш на несколько тисячних секунд. как по мне економия на спичках. и да еще один нюанс. те же фреймворки кроме безопасности и скорости используют prepare ибо проще реализация типа такой (Пример с Yii)
Yii::app()->db->createCommand('SELECT * FROM table WHERE id=:id LIMIT 1')->queryRow(true,array(':id'=>$id));
тоесть запросы которые формируют всякие DAO, ActiveRecord и прочие абстракции и параметры для них. Как по мне такое проще реализировать на prepare нежели preg_replace
teddy
Отправлено: 28 Мая, 2014 - 12:24:44
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
esterio
Насчет тестов согласен, я не тестил, но если подумать логически то лучше не напрягать quote особенно тогда когда и без этого можно обойтись(да и если фигачить в цикле много запросов то выигрыш будет явный я думаю)+ подготовленные запросы дают нам возможность не беспокоиться об экранировании. Поэтому лично мой выбор - везде использовать именно подготовленные запросы.
Покинул форум
Сообщений всего: 57
Дата рег-ции: Май 2014
Помог: 0 раз(а)
Каков принцип работы плейсхолдеров? Я понимаю, если происходит подстановка строковых параметров. Тогда, да, как понимаю, там этот параметр, вылижут, отэкранируют, проверят, и пр. Со строковыми параметрами - безусловно удобнее.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.