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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> экранирвоать dbi prepare 
:(
    Опции темы
gcc
Дата 4.1.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



не работает, пробовал по разному:
Код

 $sth = $dbh->prepare( "SELECT count(*) FROM table where $self->{SQL}->{LIKE}");
$sth->execute();


в других классах примерно так формируется:
Код

$self->{SQL}->{LIKE} = join (" AND ", map { "text LIKE ".$dbh->quote('%'.$_.'%') } @search );


кстате никто не видел идеальный поисковик? на cpan много модулей, может быть там есть, найти сложновато

Это сообщение отредактировал(а) gcc - 4.1.2009, 16:33
PM WWW ICQ Skype GTalk Jabber   Вверх
tolkien
Дата 4.1.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Офф топ!
Что значит 'экранировать' ? Это что то вроде сделать интерфейс для удобного вызова?
PM MAIL   Вверх
gcc
Дата 4.1.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



не экранировать, но если поставить так 

Код

 where $self->{SQL}->{LIKE}");


 не работает... сделал так:
Код

my $where = $self->{SQL}->{LIKE};


Код

 where $where ");


Добавлено @ 20:20
Цитата(tolkien @ 4.1.2009,  20:13)
Это что то вроде сделать интерфейс для удобного вызова?

да, именно для удобства и экономии кода (если что-то захочется изменить, то чтобы не переписывать несколько раз одно и тоже)

Это сообщение отредактировал(а) gcc - 5.1.2009, 12:31
PM WWW ICQ Skype GTalk Jabber   Вверх
nitr
Дата 7.1.2009, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

$sth = $dbh->prepare( "SELECT count(*) FROM table where ".$self->{SQL}->{LIKE});


Добавлено через 1 минуту и 16 секунд
но лучше продумать код... 
$self->{SQL}->{LIKE} вдруг с ошибкой будет... ;)


--------------------
PM   Вверх
Шуранов
Дата 8.1.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А, сделать так:
Код

my $sth = $dbh->prepare( "SELECT count(*) FROM table where ?");
$sth->execute($self->{SQL}->{LIKE});

вроде оно?   smile 
PM MAIL WWW ICQ   Вверх
nitr
Дата 8.1.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



и так smile Способов много, это ж Perl.
gcc, что скажите?


--------------------
PM   Вверх
gcc
Дата 9.1.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



Цитата(nitr @ 8.1.2009,  17:47)
и так smile Способов много, это ж Perl.
gcc, что скажите?

я пометил что решил давно

пользуюсь случаем:

если не использовать prepare, а экранирвоать qq() и использовать через do selectall_*  selectrow_* инъекции не будет?

qq()  эскепит кавычки от инъекции?




Это сообщение отредактировал(а) gcc - 9.1.2009, 16:57
PM WWW ICQ Skype GTalk Jabber   Вверх
nitr
Дата 9.1.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



gcc, а зачем спрашивать smile ? Можно ведь самому увидеть вывод qq() или сами запросы.
Так даже бывает интереснее, попытаться самому проверить.


--------------------
PM   Вверх
ginnie
Дата 11.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Шуранов, боюсь, предложенный Вами вариант будет работать только в случае, если сервер не поддерживает placeholders (когда подстановка значений происходит в модуле DBI), иначе запрос не пройдет синтаксический контроль.


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


Агент алкомафии
****


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

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



ginnie,  я все время использую так через prepare и $sth->execute('bind')

DBI,  DBD::MySQl должны стоять всегда,  (или в чем проблема эти модули поставить... ?)

Добавлено через 8 минут и 17 секунд
nitr

я нашел:
Код

my $name = $dbh->quote("can't");
my $sql = qq/select * from table where column = $name/;


http://www.easysoft.com/developer/language...ial_part_2.html

тогда значит qq() не достаточно

проверить на 100 я не смогу потомучто регулярные выражения perl не полностью знаю...

Это сообщение отредактировал(а) gcc - 11.1.2009, 20:31
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 11.1.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



ginnie, А как тогда использовать по другому через  quote()?
PM WWW ICQ Skype GTalk Jabber   Вверх
nitr
Дата 11.1.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



gcc, верно начинаете думать...
можно открыть кукбук, там про экранирование строк есть (где про БД), и как раз ваш вопрос с qq{} есть ;).

Добавлено через 1 минуту и 10 секунд
ginnie, ваш ответ я не понял, т.е. вы меня запутали smile .

Добавлено через 9 минут и 16 секунд
gcc, в вашем модуле можно продумать метод, сразу извиняюсь за название, надеюсь придумает, а я передам идею ;).

будем считать у вас свой dbh возвращается $self->{dbh}, или подобие такой функции (она только подобие smile ).
Код
sub dbh {
    my $self = shift;

    return $self->{DBH};
}


Вот наш метод (тоже не совершенство):
Код
sub for_like {
    my $self = shift;
    
    my $like = $self->{SQL}->{LIKE};
    # различная проверка и т.п.
    
    return $self->{dbh}->quote($like);
}

...
    # а далее использовать примерно так вдругом методе:
    $sth = $dbh->prepare( "SELECT count(*) FROM table where ".$self->for_like);
    $sth->execute;
...



--------------------
PM   Вверх
ginnie
Дата 12.1.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



nitr, приношу извинения за сумбурное изложение мыслей  smile 

СУБД может поддерживать prepared statements, а может не поддерживать (для MySQL см. Prepared statement support (server side prepare)). Если СУБД их поддерживает, то запросы с placeholders проходят синтаксический контроль на стороне сервера и вариант

Код

SELECT count(*) FROM table where ?


его не пройдет. Если сервер не поддерживает prepared statements, то подстановка значений осуществляется модулем DBI (без синтаксического контроля), при этом указанный вариант может сработать (не проверял).


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


Агент алкомафии
****


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

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



ginnie, не много не понял,  если не будет включено mysql_server_prepare=1, то экранироватся через execute() не будет? 

Код

$dbh = DBI->connect( "DBI:mysql:database=test;host=localhost;mysql_server_prepare=1", "", "", { RaiseError => 1, AutoCommit => 1 } );


у меня везде MySQL 5.0, а как точно проверить работает ли синтаксический контроль? 

Это сообщение отредактировал(а) gcc - 12.1.2009, 18:36
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 12.1.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



gcc, экранироваться будет в любом случае. Не всегда будет работать prepared statement (используется для ускорения выполнения запросов).

Добавлено @ 18:56
По поводу проверки, попробуйте включить trace в DBI и выполнить запрос с placeholder'ами, посмотрите что передается в СУБД.
Кроме того, попробуйте указанный выше вариант (замените названия таблицы и поля на свои)

Код

my $sth = $dbh->prepare( "SELECT count(*) FROM table where ?");
$sth->execute('id = 10');


и приведите здесь сообщение об ошибке.

P.S. Посмотрел сейчас код и понял, что он даже при непосредственной подстановке в DBI не сработает из-за экранирования.

Это сообщение отредактировал(а) ginnie - 12.1.2009, 19:02


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


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

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


 




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


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

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