За последние 24 часа нас посетили 17582 программиста и 2075 роботов. Сейчас ищут 867 программистов ...

Регистронезависимый поиск Mysql PDO

Тема в разделе "PHP и базы данных", создана пользователем Anguis, 17 сен 2011.

  1. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Здравствуйте. Уже пять лет занимаюсь программированием в php, а вот с такой проблемой столкнулся впервые. Обычно как-то по гуглу полазиешь, и находится решение, а тут даже на данном форуме зарегиться пришлось..
    Потому прежде чем заявлять что про регистронезависимый (а может дело не в этом, попытаемся разобраться!?) поиск написано уже две "Война и мир", ознакомьтесь с сутью проблемы.
    Собственно суть.
    В базе есть записи:
    contry:
    Россия
    США
    Великобритания

    PHP:
    1.  
    2. ....
    3. define('SQLCHARSET','utf8',true);
    4. $db = new PDO('mysql:host='.SQL_S.';dbname='.SQL_B, SQL_L, SQL_P);
    5.   $db->query ( 'SET character_set_connection = ' . SQLCHARSET . ';' );  
    6.   $db->query ( 'SET character_set_client = ' . SQLCHARSET . ';' );  
    7.   $db->query ( 'SET character_set_results = ' . SQLCHARSET . ';' );
    8.   $db->query ( 'SET NAMES ' . SQLCHARSET . ';' );
    9.   $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // Коннектимся с базой и устанавливаем кодировку.
    10.   $obj = $db->prepare('SELECT `contry` FROM `table` WHERE `contry` LIKE ?');
    11.   $obj->execute(array($_POST['str'].'%'));
    12.   $tobj = $obj->fetchObject()
    13.   echo mb_detect_encoding($_POST['str'], "auto");
    14.   echo $tobj->contry;
    15.  
    Если $_POST['str'] == 'В', то скрипт выводит - UTF-8 Великобритания
    Если $_POST['str'] == 'в, то скрипт выводит - UTF-8
    т.е. во втором случае название страны не выводится, т.е. в базе строка не найдена. Явная зависимость от регистра.
    НО!!! если меняем запрос немного вот так:
    PHP:
    1.  
    2.   $obj = $db->prepare('SELECT `contry` FROM `table` WHERE `contry` LIKE ?');
    3.   $obj->execute(array('в%'));
    4.  
    то скрипт выводит название страны вне зависимости от регистра.
    Следовательно, проблема в передаче данных методом POST
    Но echo mb_detect_encoding($_POST['str'], "auto"); выводит UTF-8 - значит правильная кодировка
    Все html-файлы в utf-8, meta указан как utf-8 яваскриптом форма не обрабатывается
    Кодировка базы и записей - utf8_general_ci

    Вот такая проблема. Помогите разобраться?
     
  2. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Ну что, неужто перевелись тру прогеры?
    еще одна деталь, когда $_POST['str'] == 'sdjjwuy' (т.е. не русские символы, а латинские), то echo mb_detect_encoding($_POST['str'], "auto"); выводит ASCII
    Как блин сие понимать?...
     
  3. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    Anguis
    Это `живой` поиск? Или по первому символу?
     
  4. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    alexfer
    живой
    Может быть и "в", а может и "велик", а может и "венесу", может быть все что угодно. $_POST['str'] вводится пользователем, а он может ввести все что угодно и как угодно.
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ты имеешь представление, как определение кодировки работает изнутри? А? Пятилетний программист?
    Не, забавно, когда кто-то говорит, что у него вагон опыта, а засыпается на базовых вещах =))
     
  6. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Apple
    А по существу есть чего сказать?
    Т.е. предложить чего нибудь для решения проблемы? А? Гуру программист?
    Не, забавно, когда кто-то кого-то в чем-то уличает при этом не говоря ни чего конструктивного =))
     
  7. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    так я и думал.. пустозвонство одно.
    Ну что ни кто не знает?
     
  8. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Anguis
    Всё так запущено, что даже приходится пользоваться моим словарным запасом? =)

    Тут несомненно сидят только безработные люди без семьи и друзей, у которых только и есть время на то, чтобы сиюминутно отвечать на ваши вопросы, о господин!

    Ты не пробовал строку $_POST['str'] прогнать через тот же iconv для принудительного приведения к UTF-8?
    Более того, самый простой способ проверки - попробовать функцию strlen. Она должна вернуть 2 для буквы "в".
    Я тебе гарантирую, что код ниже, сохраненный в кодировке Windows-1251, выведет тебе UTF-8:
    PHP:
    1. <?php
    2.  
    3. header('Content-type: text/plain; charset=utf-8');
    4. echo mb_detect_encoding("в", 'auto');
    5.  
    6. ?>
     
  9. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Да, благодарствую за столь богатый запас, коим воспользоваться мне выпала великая честь!

    Однако высер запостить времени хватило ;)

    Пробовал, сударь, все я пробовал. И UCASE всякие в запросы ставил, и iconv, и mb_convert_encoding пробовал..
    Может еще что-то есть? Давайте поперечисляем, может я действительно упустил какой момент.
    Однако как я уже выше отмечал, я имею кое-какой опыт в программировании, и насколько это было в моих силах - я испробовал все. Я бы не стал регится ради проблемы, которую можно решить иным способом, благо гуглом пользоваться умею.

    З.Ы. А чего вы мне "тыкаете", позвольте осведомиться? Я с вами на брудершафт пил? Или может мы в Ялте в 94-м девченок кадрили? Нет. Вот и не надо грубить! Будто у меня нет семьи и мне захотелось от безделья троллей тутошних подамахивать идиотскими вопросиками.. Имейте уважение к людям, не все в нашем мире школоло!
     
  10. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    If you try to use mb_detect_encoding to detect whether a string is valid UTF-8, use the strict mode, it is pretty worthless otherwise.

    <?php
    $str = 'áéóú'; // ISO-8859-1
    mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
    mb_detect_encoding($str, 'UTF-8', true); // false
    ?>
     
  11. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    karlozzz, благодарствую, однако проблема не в определении кодировки, а в поиске по базе. В любом случае echo mb_detect_encoding($_POST['str'], "auto", true); дает UTF-8...
     
  12. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    В лепешку уже разбился... Ни хрена не понимаю!!
    PHP:
    1. $fg = mb_convert_encoding(mb_convert_case($_POST['str'], MB_CASE_LOWER, "utf8"), "utf8", "auto");
    2.   $sql = "SELECT `contry` FROM `table` WHERE `contry` LIKE '$fg%'";
    3.   echo $sql;
    4.   $obj = $db->query($sql);
    5.   $tobj = $obj->fetchObject()
    6.    echo $tobj->contry;
    7.  
    Вот так модифицировал скрипт. Результаты.
    Код (Text):
    1.  
    2. //Если $_POST['str'] == 'в'
    3.  
    4. SELECT `contry` FROM `table` WHERE `contry` LIKE 'в%'
    5.  
    6. //Если $_POST['str'] == 'В'
    7.  
    8. SELECT `contry` FROM `table` WHERE `contry` LIKE 'в%' Великобритания
    Т.е. после переконвертирования и привидения к нижнему регистру в обоих случаях запрос одинаков, однако результат разный! Оо В случае, когда используется заглавная буква - запрос находит запись, а когда маленькая - не находит, хотя в любом случае в запрос поступает маленькая буква.
     
  13. Anguis

    Anguis Активный пользователь

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Всё, товарищи, я разобрался. Всем спасибо. Решилось обновлением mysql сервера.
    Три дня блин просидел над ней, а оказалось проблема не в коде ;) Хотя более чем странный глюк...
     
  14. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Слушай, а тип кодировки в базе не менял? МБ регистрозависимая стояла?