Поиск пользователей по городу

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Поиск пользователей по городу

Сообщение Sheer »

MIT писал(а):Всё дело в collation`е — там вроде бинарное сравнение по умолчанию
Совершенно верно, COLLATION вообще не нужно.
Я же написал, надо вот так

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

SELECT *  FROM `phpbb_users` WHERE `user_from` LIKE  'рига' 
Спаси и сохрани тебя и твой форум. Аминь.

От SQL инъекций защищаться собираешься?
А что там не так, просветите, плз.
Я вот в вопросах безопасности не очень....
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Поиск пользователей по городу

Сообщение MIT »

Sheer писал(а):Я вот в вопросах безопасности не очень....
Надо срочно исправляться, иначе твой форум с такой дыркой упадёт от первого любопытного школьника.
Советую изучить http://ru.wikipedia.org/wiki/Внедрение_SQL-кода, погуглить по mysql_escape_string, mysql_real_escape_string и addslashes и раскурить какую-нибудь функцию движка, которая обрабатывает входящие данные.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3365
Стаж: 17 лет 6 месяцев
Благодарил (а): 37 раз
Поблагодарили: 1455 раз

Re: Поиск пользователей по городу

Сообщение Nekstati »

Я же написал, надо вот так
Именно так у меня и не работает, а с COLLATION работает. Как на Денвере, так и на Линукс-сервере (MySQL 5.0.77, PHP 5.2.12). Система в обоих случаях х64, может, в этом дело. ))
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Поиск пользователей по городу

Сообщение Sheer »

MIT писал(а):Надо срочно исправляться
Так праильно будет?
Найти

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

$sql_where .= ($icq) ? ' AND u.user_icq ' . $db->sql_like_expression(str_replace('*', $db->any_char, $icq)) . ' ' : ''; 
После вставить

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

            if ($from)
            {
                $i = 0;
                $pieces = explode(" ", $from);
                $sql_where = "AND (u.user_from ";
                do
                {
                    if ($i == 0) $sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[$i]));
                    else
                    {
                      $sql_where .= " OR u.user_from ";
                      $sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[$i])); 
                    }
                    $i++;
                } while ($pieces[$i]);
            $sql_where .= ")";
            } 
Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Стаж: 21 год 1 месяц
Откуда: Новосибирск
Поблагодарили: 37 раз

Re: Поиск пользователей по городу

Сообщение Alek$ »

Sheer
Я не слишком вникал в логику вашего кода, но вот тут, кажется есть место для XSS уязвимости:
Sheer писал(а):'LOCATION' => $from,
А с запросом теперь лучше, да.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
Erlang
phpBB 2.0.15
Сообщения: 1033
Стаж: 22 года 2 месяца
Откуда: Москва
Благодарил (а): 293 раза
Поблагодарили: 7 раз

Re: Поиск пользователей по городу

Сообщение Erlang »

А может кто-то оформит в виде мода?
С уважением,
Сергей
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 16 лет 9 месяцев
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза

Re: Поиск пользователей по городу

Сообщение Alecto »

Поставил.
поиск сработал, но вывалил вот такую ошибку:

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

[phpBB Debug] PHP Notice: in file /memberlist.php on line 1113: Undefined offset: 1
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4796: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3914)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4798: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3914)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4799: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3914)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4800: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3914)
первоначальную инструкцию заменил вот этой:
Поиск пользователей по городу

Добавлено спустя 10 минут 56 секунд:
поставил первоначальную инструкцию - та же ошибка но в строке 1120

вот
код +/- одна строка.

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

					$i++;
				} while ($pieces[$i]);
			$sql_where .= ")";
можно поправить?

Добавлено спустя 3 минуты 39 секунд:
еще, вот здесь:

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

'L_EXPLAIN'	=> Вы можете задавать несколько аргументов...
наверно " пропущено перед русским текстом?
потому что такой в этом варианте получился белый экран с ошибкой.
так - работает нормально

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

'L_EXPLAIN'	=> "Вы можете задавать несколько аргументов...
Аватара пользователя
HAMMER663
Former team member
Сообщения: 2032
Стаж: 16 лет 5 месяцев
Откуда: Зеленоград
Благодарил (а): 77 раз
Поблагодарили: 249 раз

Re: Поиск пользователей по городу

Сообщение HAMMER663 »

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

'EXPLAIN'	=> 'Вы можете задавать несколько аргументов',
вот так
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 16 лет 9 месяцев
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза

Re: Поиск пользователей по городу

Сообщение Alecto »

HAMMER663
спасибо, поправил.
но, ошибка в строке 1120 по прежнему появляется при выполнении поиска.

Добавлено спустя 28 минут 3 секунды:
попробовал еще вот этот вариант:
Поиск пользователей по городу

он работает и ошибок не вызывает, но смущает эта фраза:
MIT писал(а):Надеюсь ты не на реальном форуме эту штуку поставила?
Добавлено спустя 2 часа 7 минут 24 секунды:
без ошибки работает и вот этот вариант:

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

			$sql_where .= ($from) ? ' AND u.user_from ' . $db->sql_like_expression(str_replace('*', $db->any_char, $from)) . ' ' : ''; 
но, в отличии от COLLATE utf8_general_ci - поиск регистро-зависимый.
пожалуйста, помогите довести до ума.
с привязкой к регистру очень не удобно.

забыл добавить: форум версии 3.0.9
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Поиск пользователей по городу

Сообщение Sheer »

А кто COLLATE utf8_general_ci мешает воткнуть.
Найти

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

$sql_where .= ($icq) ? ' AND u.user_icq ' . $db->sql_like_expression(str_replace('*', $db->any_char, $icq)) . ' ' : ''; 

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

После вставить
            if ($from)
            { //если поле "Откуда" заполнено
                $pieces = explode(' ', $from);
                $sql_where = 'AND (u.user_from ';
                $sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[0]));
                for ($i = 0; $i < sizeof($pieces); $i++)
                {
                    $sql_where .= ' OR u.user_from ';
                    $sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[$i]));
                }
                $sql_where .= ' COLLATE utf8_general_ci)';
            } 
$db->any_char затыкает дыру безопасности. А без COLLATE у меня работало, потому что я тип сравнения в поле user_from поменял с utf8_bin на utf8_general_ci. Просто забыл про это...
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 16 лет 9 месяцев
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза

Re: Поиск пользователей по городу

Сообщение Alecto »

Sheer
спасибо, ваш последний вариант работает и ошибки пропали.

Добавлено спустя 5 минут 42 секунды:
Скажите пожалуйста, где используется эта языковая переменная?

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

'EXPLAIN'	=> 'Вы можете задавать несколько аргументов поиска, разделив их пробелами, например указать: <b>rig* риг*</b>. Используйте * в качестве шаблона. Обратите внимане, что можно использовать такие шаблоны, например <b>*пляв*,
запомните, что поиск по аргументам <b>*пляв, пляв* и *пляв*<b>, выдаст различные результаты.',
у меня это пояснение нигде не отображается.
или его надо самому добавить в шаблон, в нужном месте?

Добавлено спустя 4 минуты 54 секунды:
и, вот касательно этого:
Sheer писал(а):rig* риг*
что-то никак не могу въехать...
если я все правильно понял, например, аргумент поиска харьков* kharkov* должен отображать результаты поиска для харьков* и для kharkov*?
с двойным аргументом я получаю в результате поиска только 5 строк, только те, что содержут kharkov - то же самое, что искать по одному слову kharkov*.
если я отдельно ищу харьков* - в результате получается 312 строк.

т.е. выходит, что поиск работает ТОЛЬКО для второго (или последнего) аргумента, игнорируя первый.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Поиск пользователей по городу

Сообщение Sheer »

FomenkoAndrey писал(а):или его надо самому добавить в шаблон, в нужном месте?
Есессно... Поиск пользователей по городу
FomenkoAndrey писал(а):что-то никак не могу въехать...
И я... все должно работать.
Найти

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

$db->sql_query_limit($sql, $config['topics_per_page'], $start); 
после вставить

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

print "$sql<br />"; 
Должен получиться такой SQL

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

SELECT u.user_id FROM phpbb_users u WHERE u.user_type IN (0, 3) AND (u.user_from LIKE 'харьков%' OR u.user_from LIKE 'харьков%' OR u.user_from LIKE 'kharkov%' COLLATE utf8_general_ci) ORDER BY u.user_regdate ASC
Засунуть его в PMA и посмотреть, что найдет

PS. Похоже это строка лишняя

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

$sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[0])); 
Хотя работает как с ней, так и без нее. Запрос короче получается

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

SELECT u.user_id FROM phpbb_users u WHERE u.user_type IN (0, 3) AND (u.user_from OR u.user_from LIKE 'харьков%' OR u.user_from LIKE 'kharkov%' COLLATE utf8_general_ci) ORDER BY u.user_regdate ASC
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 16 лет 9 месяцев
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза

Re: Поиск пользователей по городу

Сообщение Alecto »

спасибо, с использованием языковой переменной разобрался.

добавил строку print "$sql<br />"; согласно вашей инструкции, получил ошибку:
SELECT u.user_id FROM phpbb_users u WHERE u.user_type IN (0, 3) ORDER BY u.user_regdate ASC
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4796: Cannot modify header information - headers already sent by (output started at /memberlist.php:1546)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4798: Cannot modify header information - headers already sent by (output started at /memberlist.php:1546)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4799: Cannot modify header information - headers already sent by (output started at /memberlist.php:1546)
[phpBB Debug] PHP Warning: in file /includes/functions.php on line 4800: Cannot modify header information - headers already sent by (output started at /memberlist.php:1546)
удаление указанной вами строки никак не повлияло на результаты поиска.

через PMA оба предложенных вами в предыдущем посте запроса дали одну и ту же выборку в 5 строк:

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

Отображает строки 0 - 4 ( 5 всего, запрос занял 0.0205 сек.)
в то время как вхождение по харьков* = 312, по kharkov* =5

Добавлено спустя 18 минут 10 секунд:
попробовал вот что:

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

SELECT u.user_id FROM phpbb_users u WHERE u.user_type IN (0, 3) AND (u.user_from OR u.user_from LIKE 'Харьков%' OR u.user_from LIKE 'Kharkov%') ORDER BY u.user_regdate ASC
поиск стал регистрозависимым, но вернул как и положено - 317 строк.

Добавлено спустя 44 минуты 33 секунды:
похоже разобрался
вот такой запрос является регистронезависимым, похоже collate надо ставить после каждого условия:
SELECT u.user_id FROM phpbb_users u WHERE u.user_type IN (0, 3) AND (u.user_from OR u.user_from LIKE 'харьков%' COLLATE utf8_general_ci OR u.user_from LIKE 'kharkov%' COLLATE utf8_general_ci) ORDER BY u.user_regdate ASC
к вашему последнему варианту я добавил небольшой кусочек, теперь поиск стал выполняться по ИЛИ
if ($from)
{ //если поле "Откуда" заполнено
$pieces = explode(' ', $from);
$sql_where = 'AND (u.user_from ';
$sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[0]));
for ($i = 0; $i < sizeof($pieces); $i++)
{
$sql_where .= ' COLLATE utf8_general_ci OR u.user_from ';
$sql_where .= $db->sql_like_expression(str_replace('*', $db->any_char, $pieces[$i]));
}
$sql_where .= ' COLLATE utf8_general_ci)';
}
Sheer, что скажете?
Так корректно? Еще что-то нужно исправлять?
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Поиск пользователей по городу

Сообщение Sheer »

Похоже, что так. Ну работает и ладно. Хотя проще было в базе поменять тип сравнения поля user_from

Добавлено спустя 48 секунд:
А какая версия мускула?
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 16 лет 9 месяцев
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза

Re: Поиск пользователей по городу

Сообщение Alecto »

Sheer писал(а):поменять тип сравнения поля
не будет ли проблем при обновлениях сайта или с другим функционалом?
Версия MySQL 5.1.56
Добавлено спустя 2 минуты:
похоже сейчас сравнение для этого поля установлено utf8_bin

Вернуться в «Запросы модов для phpBB 3.0.x»