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-ах? [2]
if($stmt=$mysqli->prepare("SELECT District FROM City WHERE Name=?")){
/* связываем параметры с метками */
$stmt->bind_param("s",$city);
/* запускаем запрос */
$stmt->execute();
/* связываем переменные с результатами запроса */
$stmt->bind_result($district);
/* получаем значения */
$stmt->fetch();
printf("%s находится в округе %s\n",$city,$district);
/* закрываем запрос */
$stmt->close();
}
Как видно там явно видно биндинг параметров
P.S. взято из офф докы дабы не придумивать пример.
OrmaJever
Отправлено: 28 Мая, 2014 - 12:43:18
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
caballero пишет:
prepare не имеет никого отношения к биндингу параметров
prepare statment это подготовленные запросы,
подготовленные запросы это когда в нем есть динамические части тобиш ? (where id = ?),
Если есть ? то на них нужно назначить некоторое значение,
Как? bind_param.
смысла никакого не имеет, поэтому лично для меня prepare ассоциируются с bind_param.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DelphinPRO
Отправлено: 28 Мая, 2014 - 14:04:21
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
в начале года делал проект. нужно было раз в сутки заносить в БД большие объемы статистических данных (я вроде даже тему тут создавал). Провел опыты с использованием PDO.
Были варианты
1. отдельные INSERT запросы
2. подготовленные запросы
3. объединенный INSERT INTO () ... VALUES ((...),(...),(...))
Первый как и ожидалось слишком медленный.
А вот второй оказался медленнее третьего.
Что касается одиночных запросов, не вижу особой разницы. Использую prepare из-за удобства.
Как говорит caballero - когда придет время писать высоконагруженные проекты, у программиста уже не будут возникать подобные вопросы. (или как-то так)
----- Чем больше узнаю, тем больше я не знаю.
esterio
Отправлено: 28 Мая, 2014 - 14:05:43
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
DelphinPRO пишет:
ак говорит caballero - когда придет время писать высоконагруженные проекты, у программиста уже не будут возникать подобные вопросы
Плюсую. А за статистику отдельно спасибо
caballero
Отправлено: 28 Мая, 2014 - 14:11:46
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
смысла никакого не имеет
кенешно не имеет - prepared предназначен для много кратного почвтороения того же запроса, возможно с разными параметрами. но на практике выиграша по скорости все равно особо нет - выборка данных все равно занимает больше времени чем компиляция запроса. может лет 30 -40 назад смысл был
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy пишет:
'Двадцать тысяч символов'
ну допустим
но все равно это синтетика
часто бывает необходимость сохранять такие рукописи? еще реже они приходят от пользователей наверное
и гораааздо реже случаи когда такие запросы случаются настолько часто что отказ от экранирования повлияет на что-то
ни дай боже столкнуться с таким проектом)))
удобство да...гарантия от инъекции да...не более
teddy
Отправлено: 28 Мая, 2014 - 14:33:49
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME пишет:
но все равно это синтетика
От части я согласен. Но с другой стороны представь что у тебя огромный проект где юзеры долбят БД инсертами миллион раз в секунду(образно) сообщениями различной длины или любую другую вставку где у тебя экранируется 5 значений одновременно. Ты пять раз вызовешь экранирующий метод а я нет. 5 раз вызовется метод при обращении Васей для инсерта, Пять раз Петя, 1 000 000 * 5 === вызов пять лямов раз одной функции в секунду + парсинг данных которые мы ей подсунули + увеличится затрата времени на синтаксический анализ кода ввиду того что кода стало больше.
П:С Понятное дело что такие проекты с такой нагрузкой могут никогда и не встретиться, цифру взял заведомо большую что бы более наглядно объяснить свою мысль.
Все это конечно в теории и делая запросы на локалхосте без реальной нагрузки сложно что то сказать, но несмотря на это я все же выкинул обычный query и сделал выбор в пользу подготовленных запросов. Причины уже писал и на этой и на прерыдущей странице )
LIME
Отправлено: 28 Мая, 2014 - 14:36:02
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy пишет:
пять лямов раз одной функции в секунду
или пять лямов отправки запроса на подготовку
что гораздо накладнее
Anchor
Отправлено: 28 Мая, 2014 - 14:37:43
Новичок
Покинул форум
Сообщений всего: 57
Дата рег-ции: Май 2014
Каков принцип работы плейсхолдеров? Я понимаю, если происходит подстановка строковых параметров. Тогда, да, как понимаю, там этот параметр, вылижут, отэкранируют, проверят, и пр. Со строковыми параметрами - безусловно удобнее.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Anchor пишет:
Или все же есть нюансы и здесь?
есть
рано или поздно забудешь валидировать/фильтровать (Добавление)
и кстати плейсхолдеры не отменяют валидацию
teddy
Отправлено: 28 Мая, 2014 - 14:48:22
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
Я не DBA поэтому не могу точно ответить на этот вопрос особенно потому что я мало знаком с хитростями производительности БД за исключением банальных подходов. Опять же скажу все это в теории - на практике я ещё не успел все это пощупать.
Anchor пишет:
Ведь 100% знаю, что $item_id теперь пролезет только ЧИСЛОВОЙ. Или все же есть нюансы и здесь?
При биндинге параметров можно явно указывать тип передаваемого значения
LIME
Отправлено: 28 Мая, 2014 - 14:55:04
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy пишет:
При биндинге параметров можно явно указывать тип передаваемого значения
а хотелось бы еще и границы значений например
это можно без ручной валидации?
teddy
Отправлено: 28 Мая, 2014 - 16:16:30
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME пишет:
или пять лямов отправки запроса на подготовку
не пять лимонов а лимон раз. пять лимонов раз будет вызвана функция/метод экранирования для 5 параметров подставляемых в один запрос каждый раз
LIME пишет:
это можно без ручной валидации?
Я упомянул про возможность задать явный тип передаваемого значения но не про полноценную валидацию сервером с возвратом ошибок для клиента
Вообще я думаю превращать этот разговор в большую дискуссию нет смысла хотя бы потому что в конечном счете решение относительно того как "оформить" тот или иной кусок кода/операцию решается исходя из самой задачи и нет единого решения на все случаи жизни.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.