powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Страшная история
13 сообщений из 13, страница 1 из 1
Страшная история
    #32055665
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть на моем интранет-сервере голосовалка “Рейтинг пива”. Крутится сия штука на ActivePerl+MS SQL+(WebSite 1.0 от O’Relly), через DBI (ADO). Короче, все стандартно до скуки.

Каждый желающий может внести в него новый сорт и поставить оценку любой марке из списка.

Имеются поля
ID int identity
Name char
Hit int default 0
Balls decimal default 0

Занесение нового сорта –
Insert into beer (Name) valuе (@name’)

Выставление оценки.
Для голосования из формы передается оценка @ball=(от -2 до +2) и @ID марки.
Update beer
Set balls=(balls*hit+@ball)/(hit+1),
Hit=hit+1
Where ID=@ID

До чего скучно все это излагать. Как будто букварь переписываю.

А теперь – страшное.
Прихожу я из отпуска, и обнаруживаю, что у одной марки поле balls = NULL
Причем я точно помню, что в этом поле первоначально было число (пиво - Балтика 7)
...
Рейтинг: 0 / 0
Страшная история
    #32055667
Фотография Сергей Тихонов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ворзможно, был передан параметр @ball = NULL...
Проверь структуру таблицы...
...
Рейтинг: 0 / 0
Страшная история
    #32055669
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю Сергей Тихонов прав.
...
Рейтинг: 0 / 0
Страшная история
    #32055682
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это Perl. Он интерпретирует пустые значения переменных как 0 или ‘’, в зависимости от контекста.

Запрос собирается из строки
$sql=’Update beer Set balls=(balls*hit+’.$ball.’)/(hit+1), Hit=hit+1 Where ID=’.$ID;

Если переменная $ball не определена, то я бы получил

Update beer Set balls=(balls*hit+)/(hit+1), Hit=hit+1 Where ID=100;

Вылетела бы ошибка, транзакция бы не проскочила, и все бы было путем.

Не думаете же вы, что строка собралась в таком виде:
Update beer Set balls=(balls*hit+NULL)/(hit+1), Hit=hit+1 Where ID=100;

Предположим, что я нифига не понимаю в перле, и он действительно присвоил $ball строковое значение ‘NULL’. И как ему тогда удалось присвоить ID из реального диапазона? А если бы ID был не из диапазона, или не определен, то то же проблем бы не было.

Да, все крутиться под виндами, и ActivePerl не равен pure Perl. Но не до такой же степени?

Хорошо, все сваливаем на веб-сервер. Он изловчлся передать ID, а на ball заткнулся, и решил вместо действительного значения передать строку ‘NULL’.

Но я ни разу не слышал, что бы так глюканулся продукт от O’Relly. И у меня за 5 лет проблем с ним не было.
...
Рейтинг: 0 / 0
Страшная история
    #32055777
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто нашелся умелец, который сумел пропихнуть "NULL" строку как value
группы радиокнопок. Или "левый" браузер какой-нить "подсуетился".
...
Рейтинг: 0 / 0
Страшная история
    #32055779
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. Он сидел в засаде за процессором, с полным мешком нулов, и в нужный момент заменил пустую строку на 'NULL'.

Передача параметров от формы на перл выполняется методом POST, так что никто некоректную строку вручную запустить не мог.

Я точно знаю, с каких броузеров ко мне лазят: IE 3-6, Netscape 5-6, Operа 5.3 -6, Mozilla 0-1.

Я все-таки думаю, что я влетел-таки в 0.00001% возможного сбоя.
...
Рейтинг: 0 / 0
Страшная история
    #32055795
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясняю. Умелец пишет свой html с правильными именами инпутов (как у тебя)
Типа:
<form name="fm" method="post" action="АДРЕС_ТВОЕЙ_ЦЕЛЕВОЙ_ПАГИ">
<input type="radio" name="r" value="0">
<input type="radio" name="r" value="NULL">
<input type="submit">
И запускает её на своём PWS (IIS)
...
Рейтинг: 0 / 0
Страшная история
    #32055796
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за последнюю строчку в моем постинге. Сказались мои
личные малоинтересные причуды в веб-строительстве. В нашем
случае это, конечно, смысла не имеет.
...
Рейтинг: 0 / 0
Страшная история
    #32055805
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример. Есть на америкосском сайте голосовалка в виде радиокнопок.
Беру из "В виде HTML" текст их паги. Сохраняю у себя как html файл. Вношу
поправки: одной из радиокнопок ставлю value="NULL", в action формы прописываю
полный путь. Естественно, у формы method="post". Открываю эту пагу и голосую за "NULL".
Получаю ответ:
Код: plaintext
1.
2.
3.
4.
5.
6.
Poll Results 
Microsoft OLE DB Provider for SQL Server error '80040e2f' 

Cannot insert the value NULL into column 'ChoiceID', table 'sqlteam.bgraziano.PollVotes';
column does not allow nulls. INSERT fails. 

/PollResults.asp, line  44  


Конечно, если бы NULL значения допускались (как у Кота2), то мой бы NULL туда попал.
Хотя, как я прикинул, там тоже нет проверки на вхождение "значений" радиокнопок в
правильный диапазон. Т.е. вполне можно инсертить "дурные" ChoiceID.
...
Рейтинг: 0 / 0
Страшная история
    #32055812
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего ты прав. Сегодня проверю.
...
Рейтинг: 0 / 0
Страшная история
    #32055899
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Cat2
"Ихняя" и твоя "пивная" голосовалки - это, конечно, чепуха.
А представь какой-нить важный сбор данных: писец тады наступает.
...
Рейтинг: 0 / 0
Страшная история
    #32055936
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зацените, какую я себе выбрал страну (в моём профиле). В списке её, конечно, нет.
New Country
...
Рейтинг: 0 / 0
Страшная история
    #32056149
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Все подтвердилось. Это самый вероятный вариант. Вставил проверку на корректные варианты.

Только вот не понятно, чем вредителю Балтика 7 не угодила?
=====
Приношу свои извинения MS SQL, которого я напрсно обвинял а глюках
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Страшная история
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]