Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Out of range value for column...

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Out of range value for column...

Сообщение Shredder »

Тестирую один мод, он мне пишет в лог какие-то непонятные ошибки. Причём, на самих страницах форума этих ошибок не видно, а только когда переходишь в "Лог ошибок" админки. Текст ошибки:

Код: Выделить всё

Произошла общая ошибка: General Error
» SQL ERROR [ mysqli ]

Out of range value for column 'session_speculative_test' at row 1 [1264]

SQL

UPDATE phpbb_sessions
SET session_speculative_test = (session_speculative_test | 2)
WHERE session_id = 'c8f3535f0a6795936d379d0eb321674d'
AND session_speculative_key = '8iznq6vgf2'

BACKTRACE

FILE: (not given by php)
LINE: (not given by php)
CALL: msg_handler()

FILE: [ROOT]/includes/db/dbal.php
LINE: 757
CALL: trigger_error()

FILE: [ROOT]/includes/db/mysqli.php
LINE: 182
CALL: dbal->sql_error()

FILE: [ROOT]/probe/probe.php
LINE: 212
CALL: dbal_mysqli->sql_query()

FILE: [ROOT]/probe/probe.php
LINE: 842
CALL: insert_ip()
Что значит сама эта ошибка - я знаю: выход данных за пределы ёмкости ячейки БД, но почему она происходит именно в этом случае и что при этом мод пытается записать в БД - не понятно. Выставив вручную через phpmyadmin, я проверил, что максимальный интервал значений ячейки session_speculative_test: от -2147483648 до 2147483647. Тип поля - int(5). И судя по коду мода, ячейка вообще НЕ должна принимать значение больше трёхзначной цифры.

Значение ячейки по умолчанию: -1
Запросы мода, изменяющие эту ячейку:

Код: Выделить всё

		$sql = 'UPDATE ' . SESSIONS_TABLE . "
			SET session_speculative_test = 0, session_speculative_key = '$speculative_key' 
			WHERE session_id = '{$user->data['session_id']}'";
		$db->sql_query($sql);

Код: Выделить всё

		$sql = 'UPDATE ' . SESSIONS_TABLE . " 
			SET session_speculative_test = -1 
			WHERE session_id = '" . $db->sql_escape($sid) . "' 
				AND session_speculative_key = '" . $db->sql_escape($key) . "'";
		$db->sql_query($sql);
И собственно тот запрос, который производит ошибку:

Код: Выделить всё

		$sql = 'UPDATE ' . SESSIONS_TABLE . " 
			SET session_speculative_test = (session_speculative_test | " . $db->sql_escape($mode) . ") 
			WHERE session_id = '" . $db->sql_escape($sid) . "' 
				AND session_speculative_key = '" . $db->sql_escape($key) . "'";
Это все запросы, изменяющие session_speculative_test, которые есть в моде.
Значение переменной $mode принимает значение любой из следующих констант:

Код: Выделить всё

//-- START: Proxy Revealer Olympus -----------------------------------------------------
// detection methods (they're in powers of 2 so that bitwise operations can be used)
define('X_FORWARDED_FOR',1);
define('XSS',2);
define('JAVA',4);
define('FLASH',8);
define('COOKIE',16);
define('TOR_DNSEL',32);
define('REALPLAYER',64);
define('PROXY_DNSBL',128);
define('QUICKTIME',256);
define('WMPLAYER',512);
// This is used in ACP (Internal IPs Log)
define('JAVA_INTERNAL', 3);
//-- END: Proxy Revealer Olympus -------------------------------------------------------
Поэтому, каким образом там могут быть ошибки из-за попытки изменить ячейку запросом SET session_speculative_test = session_speculative_test | " . $db->sql_escape($mode) . " (а конкретно - session_speculative_test = (session_speculative_test | 2) - см. текст ошибки) - для меня остаётся загадкой. У кого-нибудь есть идеи?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Out of range value for column...

Сообщение rxu »

Shredder писал(а):что при этом мод пытается записать в БД - не понятно
Так выведите значение $speculative_key непосредственно перед запросом.
Кстати, не понял, как у вас $speculative_key работает в одинарных апострофах: session_speculative_key = '$speculative_key'. По идее, запрос в таком случае пытается записать в поле сам текст $speculative_key, а не значение переменной.
Изображение
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Out of range value for column...

Сообщение Sheer »

Ну да, записываемое значение не соответствует типу. Например попытка записать значение 3.141592 в поле типа int
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Re: Out of range value for column...

Сообщение Shredder »

rxu писал(а):Кстати, не понял, как у вас $speculative_key работает в одинарных апострофах: session_speculative_key = '$speculative_key'. По идее, запрос в таком случае пытается записать в поле сам текст $speculative_key, а не значение переменной.
Попробовал на тестовом скрипте, сделав похожий запрос:

Код: Выделить всё

$speculative_key = '1tyxkkanqm';

$sql = 'UPDATE ' . SESSIONS_TABLE . "
	SET session_speculative_test = 0, session_speculative_key = '$speculative_key' 
	WHERE session_id = 'c075c835779d002a14609f4caa4d1aba'";
$db->sql_query($sql);
Отработало нормально. Может, дело в двойных кавычках после SESSIONS_TABLE и в самом конце?

Sheer писал(а):Например попытка записать значение 3.141592 в поле типа int
В этом случае записывает просто тройку, без вывода каких-либо ошибок. А если это же число будет не с точкой, а с запятой, то тоже запишет тройку, но выведет при этом другое предупреждение - Data truncated for column 'session_speculative_test' at row 1. Но это всё в phpmyadmin.
rxu писал(а):Так выведите значение $speculative_key непосредственно перед запросом.
Сделал немного по-другому: установил на время тип поля VARCHAR(1000), чтобы точно уместилось. Оказалось, что в определённый момент приходят значения типа 18446744073709551615 или 9223372036854775807. И похоже, что ошибка вызывается при участии запроса:

Код: Выделить всё

		$sql = 'UPDATE ' . SESSIONS_TABLE . " 
			SET session_speculative_test = -1 
			WHERE session_id = '" . $db->sql_escape($sid) . "' 
				AND session_speculative_key = '" . $db->sql_escape($key) . "'";
		$db->sql_query($sql);
Потому что если его убрать, то таких длинных значений не записывается и ошибок (в случае int(5)) не бывает. Проверил многократно, раз 10 наверное. Снова загадка, даже ещё хуже.

Добавлено спустя 13 минут 41 секунду:
Опытным путём в phpmyadmin выяснил, что когда значение ячейки session_speculative_test равняется -1, то попытка выполнения запроса:

Код: Выделить всё

UPDATE phpbb_sessions SET session_speculative_test = (session_speculative_test | 2) WHERE session_id = '7f88f6bb7db62716530463e46c0fbe21' AND session_speculative_key = '2wfkalzl7v'
- даёт результат 2147483647. Что аналогично переполнению (ошибке).
Этим я сымитировал два запроса, последовательно выполняющиеся в моде.

Запустил тестовый php-скрипт:

Код: Выделить всё

<?php

$a = -1;
$b = $a | 2;

print $b;

?>
И результат работы равняется -1, а не 2147483647. Ерунда какая-то.

Добавлено спустя 1 час 2 минуты 21 секунду:
Видимо, всё дело в двоичном представлении отрицательных чисел:
http://blog.kislenko.net/show.php?id=907

И с этим выходят какие-то баги в SQL-запросах с побитовыми операциями.

Добавлено спустя 16 минут 37 секунд:
Пока защитился изменением проблемного запроса на:

Код: Выделить всё

		$sql = 'UPDATE ' . SESSIONS_TABLE . " 
			SET session_speculative_test = (session_speculative_test | " . $db->sql_escape($mode) . ") 
			WHERE session_speculative_test >= 0 AND session_id = '" . $db->sql_escape($sid) . "' 
				AND session_speculative_key = '" . $db->sql_escape($key) . "'";
Похоже, что это не должно влиять на положительную работу мода. Посмотрим.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Out of range value for column...

Сообщение Sheer »

Shredder писал(а):В этом случае записывает просто тройку, без вывода каких-либо ошибок. А если это же число будет не с точкой, а с запятой, то тоже запишет тройку
Не обязательно, зависит от настроек режима SQL http://dev.mysql.com/doc/refman/5.0/en/ ... rflow.html
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Пчелкин
phpBB 3.3.0
Сообщения: 11234
Стаж: 14 лет 2 месяца
Откуда: fotovideoforum.ru
Благодарил (а): 1782 раза
Поблагодарили: 1340 раз
Контактная информация:

Re: Out of range value for column...

Сообщение Пчелкин »

Извините что встреваю... мужики, я вас уважаю... какие высокие материи... Рассуждаете тут так просто о чем то заоблачном как о...... хм... ну например.... как я о том, как построить защиту по иску с планом на перед, вплоть до кассации... одним словом - точно ГУРУ...
Читаю и гордяк распирает что знаком с такими людьми...

И чего некоторые тут еще дергаются в темах....с кем? ...
Закрыто

Вернуться в «Для авторов (phpBB 3.0.x)»