Здравствуйте. Уже пять лет занимаюсь программированием в php, а вот с такой проблемой столкнулся впервые. Обычно как-то по гуглу полазиешь, и находится решение, а тут даже на данном форуме зарегиться пришлось.. Потому прежде чем заявлять что про регистронезависимый (а может дело не в этом, попытаемся разобраться!?) поиск написано уже две "Война и мир", ознакомьтесь с сутью проблемы. Собственно суть. В базе есть записи: contry: Россия США Великобритания PHP: .... define('SQLCHARSET','utf8',true); $db = new PDO('mysql:host='.SQL_S.';dbname='.SQL_B, SQL_L, SQL_P); $db->query ( 'SET character_set_connection = ' . SQLCHARSET . ';' ); $db->query ( 'SET character_set_client = ' . SQLCHARSET . ';' ); $db->query ( 'SET character_set_results = ' . SQLCHARSET . ';' ); $db->query ( 'SET NAMES ' . SQLCHARSET . ';' ); $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // Коннектимся с базой и устанавливаем кодировку. $obj = $db->prepare('SELECT `contry` FROM `table` WHERE `contry` LIKE ?'); $obj->execute(array($_POST['str'].'%')); $tobj = $obj->fetchObject() echo mb_detect_encoding($_POST['str'], "auto"); echo $tobj->contry; Если $_POST['str'] == 'В', то скрипт выводит - UTF-8 Великобритания Если $_POST['str'] == 'в, то скрипт выводит - UTF-8 т.е. во втором случае название страны не выводится, т.е. в базе строка не найдена. Явная зависимость от регистра. НО!!! если меняем запрос немного вот так: PHP: $obj = $db->prepare('SELECT `contry` FROM `table` WHERE `contry` LIKE ?'); $obj->execute(array('в%')); то скрипт выводит название страны вне зависимости от регистра. Следовательно, проблема в передаче данных методом POST Но echo mb_detect_encoding($_POST['str'], "auto"); выводит UTF-8 - значит правильная кодировка Все html-файлы в utf-8, meta указан как utf-8 яваскриптом форма не обрабатывается Кодировка базы и записей - utf8_general_ci Вот такая проблема. Помогите разобраться?
Ну что, неужто перевелись тру прогеры? еще одна деталь, когда $_POST['str'] == 'sdjjwuy' (т.е. не русские символы, а латинские), то echo mb_detect_encoding($_POST['str'], "auto"); выводит ASCII Как блин сие понимать?...
alexfer живой Может быть и "в", а может и "велик", а может и "венесу", может быть все что угодно. $_POST['str'] вводится пользователем, а он может ввести все что угодно и как угодно.
Ты имеешь представление, как определение кодировки работает изнутри? А? Пятилетний программист? Не, забавно, когда кто-то говорит, что у него вагон опыта, а засыпается на базовых вещах =))
Apple А по существу есть чего сказать? Т.е. предложить чего нибудь для решения проблемы? А? Гуру программист? Не, забавно, когда кто-то кого-то в чем-то уличает при этом не говоря ни чего конструктивного =))
Anguis Всё так запущено, что даже приходится пользоваться моим словарным запасом? =) Тут несомненно сидят только безработные люди без семьи и друзей, у которых только и есть время на то, чтобы сиюминутно отвечать на ваши вопросы, о господин! Ты не пробовал строку $_POST['str'] прогнать через тот же iconv для принудительного приведения к UTF-8? Более того, самый простой способ проверки - попробовать функцию strlen. Она должна вернуть 2 для буквы "в". Я тебе гарантирую, что код ниже, сохраненный в кодировке Windows-1251, выведет тебе UTF-8: PHP: <?php header('Content-type: text/plain; charset=utf-8'); echo mb_detect_encoding("в", 'auto'); ?>
Да, благодарствую за столь богатый запас, коим воспользоваться мне выпала великая честь! Однако высер запостить времени хватило Пробовал, сударь, все я пробовал. И UCASE всякие в запросы ставил, и iconv, и mb_convert_encoding пробовал.. Может еще что-то есть? Давайте поперечисляем, может я действительно упустил какой момент. Однако как я уже выше отмечал, я имею кое-какой опыт в программировании, и насколько это было в моих силах - я испробовал все. Я бы не стал регится ради проблемы, которую можно решить иным способом, благо гуглом пользоваться умею. З.Ы. А чего вы мне "тыкаете", позвольте осведомиться? Я с вами на брудершафт пил? Или может мы в Ялте в 94-м девченок кадрили? Нет. Вот и не надо грубить! Будто у меня нет семьи и мне захотелось от безделья троллей тутошних подамахивать идиотскими вопросиками.. Имейте уважение к людям, не все в нашем мире школоло!
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 ?>
karlozzz, благодарствую, однако проблема не в определении кодировки, а в поиске по базе. В любом случае echo mb_detect_encoding($_POST['str'], "auto", true); дает UTF-8...
В лепешку уже разбился... Ни хрена не понимаю!! PHP: $fg = mb_convert_encoding(mb_convert_case($_POST['str'], MB_CASE_LOWER, "utf8"), "utf8", "auto"); $sql = "SELECT `contry` FROM `table` WHERE `contry` LIKE '$fg%'"; echo $sql; $obj = $db->query($sql); $tobj = $obj->fetchObject() echo $tobj->contry; Вот так модифицировал скрипт. Результаты. Код (Text): //Если $_POST['str'] == 'в' SELECT `contry` FROM `table` WHERE `contry` LIKE 'в%' //Если $_POST['str'] == 'В' SELECT `contry` FROM `table` WHERE `contry` LIKE 'в%' Великобритания Т.е. после переконвертирования и привидения к нижнему регистру в обоих случаях запрос одинаков, однако результат разный! Оо В случае, когда используется заглавная буква - запрос находит запись, а когда маленькая - не находит, хотя в любом случае в запрос поступает маленькая буква.
Всё, товарищи, я разобрался. Всем спасибо. Решилось обновлением mysql сервера. Три дня блин просидел над ней, а оказалось проблема не в коде Хотя более чем странный глюк...