Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> prepare 
:(
    Опции темы
box
Дата 19.5.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

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



пишу :
Код


my $query1 = "ALTER TABLE `trafic` ADD `?` INT( 10 ) NULL ;";
$query_handle1 = $connect->prepare($query1);

foreach my $k (keys %hash1) {
   $query_handle1->execute($k) ;
}



и получаю :

DBD::mysql::st execute failed: called with 1 bind variables when 0 are needed at /var/log/exe_new_new.pl line 51, <LOG> line 393.

что не так ? как исправить ?
PM MAIL   Вверх
ginnie
Дата 19.5.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



box, думаю, placeholders в таких запросах работать не будут. Можно попробовать убрать кавычки у ?, но это вряд-ли поможет.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
box
Дата 19.5.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

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



юез кавычек мускул не пускает запрос 
PM MAIL   Вверх
Pfailed
Дата 19.5.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



perldoc DBI
Цитата

With most drivers, placeholders can't be used for any element of a statement that would prevent the database server from validating the statement and creating a query execution plan for it. For example:  

  "SELECT name, age FROM ?"         # wrong (will probably fail)
  "SELECT name, ?   FROM people"    # wrong (but may not 'fail')




--------------------
PM MAIL   Вверх
dmitryk1
Дата 21.5.2010, 12:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 10.6.2008
Где: Новосибирск

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



А что мешает делать так:

Код



foreach my $k (keys %hash1) {

my $query1 = "ALTER TABLE `trafic` ADD `$k` INT( 10 ) NULL ;";
$query_handle1 = $connect->prepare($query1);

   $query_handle1->execute() ;
}



Тем более таким образом массово редактировать таблицы на рабочей базе, это всё-таки не ежеминутная операция. То есть это или редактор бд получается, один раз настроил и забыл, или неправильная структура бд, и надо переделывать и придумывать такую, при которой не требуются изменения таблиц.

Кстати placeholders придуманы. чтобы защититься от sql inject и должны использоваться именно так:
Код

select * from table1 t
where t.id=?
and t.date=?
and t.name like('?')




Это сообщение отредактировал(а) dmitryk1 - 21.5.2010, 12:07
PM MAIL GTalk Jabber   Вверх
ginnie
Дата 21.5.2010, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



dmitryk1
Цитата

Кстати placeholders придуманы. чтобы защититься от sql inject и должны использоваться именно так:


А я почему-то думал, что placeholders придумали для ускорения выполнения набора одинаковых запросов, чтобы для каждого запроса не строился план выполнения, а защита от SQL Injection идет как бонус :о)


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 21.5.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(ginnie @  21.5.2010,  14:26 Найти цитируемый пост)
А я почему-то думал, что placeholders придумали для ускорения выполнения набора одинаковых запросов, чтобы для каждого запроса не строился план выполнения, а защита от SQL Injection идет как бонус :о) 

Для единоразового разбора одинаковых запросов придумали prepared statements. Причем их использование не подразумевает обязательно placeholder.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 24.5.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, думаю, тебя не затруднит рассказать, как можно использовать prepared statements без placeholder'ов?

Это сообщение отредактировал(а) ginnie - 24.5.2010, 12:25


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 26.5.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



А чего рассказывать-то? Берешь и пишешь запрос без плейсхолдеров в prepare:
Код

my $sth= $dbh->prepare("select foo from bar where baz");



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ramus
Дата 26.5.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

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



Уважаемый KSURi

"Для единоразового разбора одинаковых запросов придумали prepared statements. Причем их использование не подразумевает обязательно placeholder. "

Использовать то можно. Но зачем нужно повторять одинаковый запрос без пласехолдеров (или bind переменных) ?
Можете привести примеры?

imho всегда надо либо что то передать в базу (IN), либо получить (INOUT) ...



Это сообщение отредактировал(а) ramus - 26.5.2010, 22:01
PM MAIL   Вверх
KSURi
Дата 27.5.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Могу, но не буду.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
mvsgt
Дата 27.5.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

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



когда придумали prepared, никаких sql ingection и в проекте не было...
PM MAIL   Вверх
dmitryk1
Дата 28.5.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 10.6.2008
Где: Новосибирск

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



Цитата(ginnie @ 21.5.2010,  14:26)

А я почему-то думал, что placeholders придумали для ускорения выполнения набора одинаковых запросов

Но используется так? 

Ну и я руководствовался только этим смыслом при использовании. Ну, разумеется и удобством.

Да и кэширование в новых версиях оракла идёт более интеллектуально и без использования всего перечисленного.

Добавлено через 13 минут и 17 секунд
Цитата(ramus @ 26.5.2010,  21:52)

Можете привести примеры?

imho всегда надо либо что то передать в базу (IN), либо получить (INOUT) ...

Конечно не меня просили, но...

Список активных подключений. 
Список товаров, проданных за текущие сутки.
Список вызовов врача на дом, за сегодня.
отчёт по приёмам врачей на сегодня.
текущее местонахождение транспортных средств.
мониторинг не переданных вызовов скорой помощи.
Мониторинг вызовов обслуживаемых более планового времени.
Мониторинг продолжительных разговоров диспетчеров
И т.д и т.п...

  smile 


PM MAIL GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




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


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

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