![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| morpheyushka |
|
||||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Мой скрипт ловит почту, вытягивает из письма все что нужно и ложу в БД (MS SQL Server 2000).
Если сохранять тело письма таким способом:
то в базу заносится ровно аж 80 символов...остальное нагло обрезает (длина поля установлена нормальная). Кстати, если через bind_param - результат аналогичен. Но если сделать так:
то весь текст отлично ложится в БД. В книжках написано, что экранирование обеими способами эквивалентно. Но выходит что не совсем. Кто нибудь может объяснить подобное...хочется все таки разобраться почему так. |
||||
|
|||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
первое - это не экранирование, кстати.
Напишите как таблица описана. Один из вариантов, когда напишете, будет проверить - как bind_param воспринимает данные. По правилам надо указать тип данных, может быть автоопределение типа ошибается. Это сообщение отредактировал(а) mvsgt - 11.2.2010, 12:42 |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Может быть...я с Perl на Вы и шепотом. А как явно указать на требуемый тип? Id int 4 Subject varchar 8000 FromAddress varchar 8000 Body varchar 8000 |
|||
|
||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
NULL-байт случайно в данные не попадает?
|
|||
|
||||
| mvsgt |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Например
Какие доступны типы - покажет программка:
Я нарывался на похожие проблемы с типами. Вообще то что у Вас действительно очень похоже на нулевой байт, но откуда он в почте может взяться? Посмотрите, по какому символу режется. |
||||
|
|||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
А как проверить на его наличие. не поверите - по любому, четко после 80 символа. Предложеный вариант не помог - то же самое, не больше 80 символов, остальное отрезает |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Ну в принципе, раз уже работает через quote - это тоже хорошо. Запросы четко составлены, изменяться не будут.
Меня другое интересует - хватит ли quote для экранирования строки в запросе...ничего плохого не пройдет через нее? |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Не пройдёт, только производительность может быть несколько ниже - на порядок-два, в зависимости от базы.
вообще такое поведение bind_param совершенно неправильное, я бы на Вашем месте попытался понять в чём дело. |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Я это и пытаюсь сделать...руки еще не опустил. Просто проект нужно доделывать - делаю help desk. Для разработки остальных модулей системы и такой скрипт сойдет. А там как разберусь - исправлю А как можно это проверить? |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
||||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
||||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Я так понимая, что NULL-байт будет иметь вид - 00. Так вот таких нет...проверил
|
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
А Вы не пробовали перед копированием в базу просто тупо порезать все ненужные символы? Это тупой и надёжный способ.
$body =~ s/[^0-9A-Za-zА-Яа-яЁё.....]//sg; # вместо ..... дописать нужные символы Если Вам нужен только текст, то это самый оптимальный вариант и давно проверенный вариант. Иначе можете порезать все непечатаемые/управляющие символы. |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Вот что тупой - это точно. Ну можно лечить болезнь "насморк" исключением его из списка болезней. А можно найти окно, из которого дует. Если из тела письма что-то исключать, то это уже не то письмо, которое было вначале. Да и нету в письмах обычно никаких спецсимволов. |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
mvsgt,
А это зависит от назначения копирования в базу, если нужен только тект писем -- то это оптимальный способ. Полностью письмо редко нужно. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |