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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dbh->execute($param) vs sth->quote($param), Почему так происходит 
:(
    Опции темы
morpheyushka
Дата 11.2.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Мой скрипт ловит почту, вытягивает из письма все что нужно и ложу в БД (MS SQL Server 2000).
Если сохранять тело письма таким способом:
Код

my $query = "insert into mail (body) values (?)";
my $sth = $dbh->prepare($query);
$sth->execute($body);

то в базу заносится ровно аж 80 символов...остальное нагло обрезает (длина поля установлена нормальная).
Кстати, если через bind_param - результат аналогичен.

Но если сделать так:
Код

$body = $dbh->quote($body);
my $query = "insert into mail (body) values ($body)";
my $sth = $dbh->prepare($query);
$sth->execute();

то весь текст отлично ложится в БД.

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


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
mvsgt
Дата 11.2.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



первое - это не экранирование, кстати. 
Напишите как таблица описана.

Один из вариантов, когда напишете, будет проверить - как bind_param воспринимает данные. По правилам надо указать тип данных, может быть автоопределение типа ошибается.

Это сообщение отредактировал(а) mvsgt - 11.2.2010, 12:42
PM MAIL   Вверх
morpheyushka
Дата 11.2.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(mvsgt @  11.2.2010,  12:41 Найти цитируемый пост)
может быть автоопределение типа ошибается.

Может быть...я с Perl на Вы и шепотом. А как явно указать на требуемый тип?

Цитата(mvsgt @  11.2.2010,  12:41 Найти цитируемый пост)
Напишите как таблица описана.


Id                     int              4
Subject            varchar       8000
FromAddress   varchar       8000
Body                varchar       8000


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
krypt3r
Дата 11.2.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



NULL-байт случайно в данные не попадает?
PM MAIL   Вверх
mvsgt
Дата 11.2.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Например 
Код

my $query = "insert into mail (body) values (?)";
my $sth = $dbh->prepare($query);
$sth->bind_param(1, $body, { TYPE => SQL_VARCHAR });
$sth->execute();


Какие доступны типы - покажет программка:
Код

use DBI;
foreach (@{ $DBI::EXPORT_TAGS{sql_types} }) {
  printf "%s=%d\n", $_, &{"DBI::$_"};
}


Я нарывался на похожие проблемы с типами. Вообще то что у Вас действительно очень похоже на нулевой байт, но откуда он в почте может взяться? Посмотрите, по какому символу режется.



PM MAIL   Вверх
morpheyushka
Дата 11.2.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(krypt3r @  11.2.2010,  14:12 Найти цитируемый пост)
NULL-байт случайно в данные не попадает? 

А как проверить на его наличие.


Цитата(mvsgt @  11.2.2010,  16:03 Найти цитируемый пост)
Посмотрите, по какому символу режется.

не поверите - по любому, четко после 80 символа.

Предложеный вариант не помог - то же самое, не больше 80 символов, остальное отрезает


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
morpheyushka
Дата 12.2.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Ну в принципе, раз уже работает через quote - это тоже хорошо. Запросы четко составлены, изменяться не будут.
Меня другое интересует - хватит ли quote для экранирования строки в запросе...ничего плохого не пройдет через нее?


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
mvsgt
Дата 12.2.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не пройдёт, только производительность может быть несколько ниже - на порядок-два, в зависимости от базы.
вообще такое поведение bind_param совершенно неправильное, я бы на Вашем месте попытался понять в чём дело. 
PM MAIL   Вверх
morpheyushka
Дата 12.2.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(mvsgt @  12.2.2010,  13:55 Найти цитируемый пост)
я бы на Вашем месте попытался понять в чём дело.  

Я это и пытаюсь сделать...руки еще не опустил. Просто проект нужно доделывать - делаю help desk.
Для разработки остальных модулей системы и такой скрипт сойдет. А там как разберусь - исправлю

Цитата(krypt3r @  11.2.2010,  14:12 Найти цитируемый пост)
NULL-байт случайно в данные не попадает? 

А как можно это проверить?


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
mvsgt
Дата 12.2.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(morpheyushka @  12.2.2010,  13:59 Найти цитируемый пост)
Цитата(krypt3r @  11.2.2010,  14:12 Найти цитируемый пост)
NULL-байт случайно в данные не попадает? 

А как можно это проверить? 


посмотреть исходники того, что кладётся в базу. В фаре или hex-редакторе любом.
PM MAIL   Вверх
morpheyushka
Дата 12.2.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(mvsgt @  12.2.2010,  15:30 Найти цитируемый пост)
посмотреть исходники того, что кладётся в базу. В фаре или hex-редакторе любом. 

Извеняюсь, за тупой вопрос, но как я их определю там?


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
morpheyushka
Дата 12.2.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Я так понимая, что NULL-байт будет иметь вид - 00. Так вот таких нет...проверил


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
vadiml
Дата 17.2.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А Вы не пробовали перед копированием в базу просто тупо порезать все ненужные символы? Это тупой и надёжный способ.

$body =~ s/[^0-9A-Za-zА-Яа-яЁё.....]//sg; # вместо ..... дописать нужные символы

Если Вам нужен только текст, то это самый оптимальный вариант и давно проверенный вариант.
Иначе можете порезать все непечатаемые/управляющие символы.
PM MAIL Jabber   Вверх
mvsgt
Дата 18.2.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Цитата(vadiml @  17.2.2010,  23:10 Найти цитируемый пост)
А Вы не пробовали перед копированием в базу просто тупо порезать все ненужные символы? Это тупой и надёжный способ.


Вот что тупой - это точно.

Ну можно лечить болезнь "насморк" исключением его из списка болезней. А можно найти окно, из которого дует.

Если из тела письма что-то исключать, то это уже не то письмо, которое было вначале. Да и нету в письмах обычно никаких спецсимволов.


PM MAIL   Вверх
vadiml
Дата 18.2.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mvsgt, 

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


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

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


 




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


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

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