Модераторы: 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   Вверх
mvsgt
Дата 18.2.2010, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(vadiml @  18.2.2010,  10:41 Найти цитируемый пост)
Полностью письмо редко нужно. 


Это как это? Что такое текст письма? То есть мне пишут письмо, а какая-то программа определяет что мне надо а что нет? Это при том, что сохранить можно всё?
PM MAIL   Вверх
vadiml
Дата 18.2.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



"какая-то программа" текст от вложения (картинки, архива, ...) думаю отличить-таки сможет.

А для хранения в писем базе есть два основных повода: 
1. это почтовая система и тут нужно всё письмо
2. это система автоматического разбора писем, типа модулей Mail::Lite, и для неё обычно нужен только текст письма

Вот 2й вариант наиболее частый, да и автор темы пишет что ему нужно только тело письма.

В других случаях хранить письма в базе обычно не оптимально, даже во многих мануалах по оптимизации баз пишут что бинарные данные лучше хранить в отдельных файлах, а в базе хранить только путь к ним.
PM MAIL Jabber   Вверх
gcc
Дата 18.2.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



dbmail еще есть smile

удобно хранит в pgsql, на триггерах можно спам резать использовать белые/серые/черные списки, и даже есть веб-интерфейс чтобы почту получить без pop и imap, а именно из базы

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


Бывалый
*


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

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



Цитата(vadiml @  18.2.2010,  14:15 Найти цитируемый пост)
"какая-то программа" текст от вложения (картинки, архива, ...) думаю отличить-таки сможет.


Это, конечно, оффтопик, но если в почтовом файле две части - text и html  ? Кто из них тело письма а кто вложение?
PM MAIL   Вверх
vadiml
Дата 18.2.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А это зависит от того, как собирать письмо.

Но для авторазбора писем всегда известно в каком виде будут идти письма, т.к. изначально берутся 2-3 письма для создания шаблона для каждого типа писем, даже когда приходят письма из сотни разных мест.
Разбирать "сферического коня в вакууме" с неизвестными целями никто не будет.

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


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


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

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



Цитата(mvsgt @  18.2.2010,  16:40 Найти цитируемый пост)
Это, конечно, оффтопик, но если в почтовом файле две части - text и html  ? Кто из них тело письма а кто вложение? 

Кстати...это как раз в точку.
Очень часто письма состоят из нескольких частей - текст и html.
Поправте меня, если я не прав. Я так понимаю, что одна часть письма содержит что то одно. То есть в этом случае будет две части:
1. текст
2. html

Если будет вложение - то это еще будет отдельная часть письма.
И еще - всегда ли текст идет в первой части?

Для примера:
Код

if($entity->is_multipart) {
    for(my $i = 0; $i < $entity->parts(); $i++) {
    my $part = $entity->parts($i);
    my $IO = $part->bodyhandle->open("r") or die "open body: $!";
    while(defined($_ = $IO->getline)) {
        $body .= $_;
    }
    }
} else {
    $body = $entity->body_as_string;
}

Так вот...пока что в 0-ой части всегда текст попадает. Просто html  мне не к чему.


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


Создатель
***


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

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



А как увидеть пример письма, которое режет?
У меня что-то так не получается, чтобы резало, только целиком в БД попадает.

Может, баг в версии DBI?
PM MAIL ICQ Skype   Вверх
morpheyushka
Дата 24.2.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tishaishii @  24.2.2010,  18:00 Найти цитируемый пост)
А как увидеть пример письма, которое режет?

Да я даже пытаюсь просто строчку положить
Код

my $str = 'asd'x50;

и заносится только первые 80 символов


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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