За последние 24 часа нас посетили 26470 программистов и 1545 роботов. Сейчас ищут 795 программистов ...

Заглавная "Р" возвращается как "?"

Тема в разделе "PHP для новичков", создана пользователем desertFox, 11 янв 2014.

  1. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Добрый вечер. Что-то у меня с кодировкой не то.. Весь сайт в UTF-8 без BOM, база данных естественно тоже в UTF-8. Всё отображается хорошо. Но когда я ввожу в поиск по сайту русскую заглавную букву "Р" то на выходе приходит "?". В нижнем регистре проблем нет. Только одна заглавная "Р" капризничает.
    В чём может быть проблема такого поведения?
    [​IMG]
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ты забыл сказать, что буква приходит из базы, не?

    проблема имеет название "set names". только ты думаешь, что в базу пишутся данные "как есть", на самом деле в связке клиент-сервер может происходить перекодирование данных. чтобы этого не происходило, надо сообщить mysql что твоё приложение работает с utf-8.

    для расширения mysqli правильный способ mysqli_set_charset, для PDO начиная с PHP 5.3 кодировка соединения задается в строке соединения типа "mysql:host=$host;dbname=$db;charset=utf8"
     
  3. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    как знак вопроса она возвращается не из базы, а после проверки.. из-за знака вопроса до базы дело не доходит

    слово из формы поиска обрабатывается так:
    Код (Text):
    1.             function strip_data($text)
    2.             {
    3.                 $quotes = array ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!" );
    4.                 $goodquotes = array ("-", "+", "#" );
    5.                 $repquotes = array ("\-", "\+", "\#" );
    6.                 $text = trim( strip_tags( $text ) );
    7.                 $text = str_replace( $quotes, '', $text );
    8.                 $text = str_replace( $goodquotes, $repquotes, $text );
    9.                 $text = ereg_replace(" +", " ", $text);
    10.                                                
    11.                 return $text;
    12.             }
    13.             $s_text = strip_data($_GET['s_text']);
    14.             $s_text = htmlspecialchars($s_text);
    15.             $s_text = mysql_real_escape_string($s_text);
    затем идёт проверка на совпадения:
    Код (Text):
    1.     $query = "SELECT articles.`id`, articles.`title`, articles.`meta_k`, articles.`mini_img`, articles.`discription`, articles.`date`
    2.             FROM `articles`
    3.             WHERE articles.`title` LIKE '%$s_text%' OR articles.`meta_k` LIKE '%$s_text%'
    4.             OR articles.`discription` LIKE '%$s_text%' ORDER BY articles.`date` DESC";
    5.     $result = mysql_query($query);
    6.     if(!$result) {
    7.         exit(mysql_error());
    8.     }
    Далее если есть совпадения то вывод статей.. и т.п.

    Добавлено спустя 1 минуту 35 секунд:
    с базой соединяюсь так:
    Код (Text):
    1.         $this->db = mysql_connect(HOST,USER,PASSWORD);
    2.         if(!$this->db) {
    3.             exit('Ошибка соединения с базой данных'.mysql_error());
    4.         }
    5.         if(!mysql_select_db(DB,$this->db)) {
    6.             exit('Нет такой базы данных'.mysql_error());
    7.         }
    8.         mysql_query("SET NAMES 'UTF8'");
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    По теме хз. искать надо.

    Не по теме (не удержался):
    1.
    Устарела функция
    2.
    Ты ж в базу передаешь а не пользователю. зачем?
    3.
    Зачем в случае ошибки показывать сообщение? Есть плохие люди которые этим могут воспользоваться
    4.
    Читай что написал artoodetoo. Потом здесь
    php.net/manual/ru/mysqlinfo.concepts.charset.php
     
  5. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    smitt, это очень хорошо что (не удержался),
    1. ereg_replace заменил, теперь стало так - $text = preg_replace("/ +/", " ", $text);
    2. htmlspecialchars - удалил, использовал так как во многих примерах в блогах видел рекомендации типа для лучшей безопасности
    3. mysql_error - удалил, не знал что это очень опасно
    4. php.net/manual/ru/mysqlinfo.concepts.charset.php, прочитал, добавил ещё это - mysql_query("SET CHARACTER SET 'UTF8'"); но не помогло, и наверное причина не в этом, описал ниже..

    Прошу прощения, я сразу не сказал что сайт тестируется на локальном сервере Open Server v 4.8.2 . Наверное причина в нём. Только что проверил на рабочем сайте, там проблем с заглавной буквой "Р" нет. На копии сайта тестировал разные штучки, поиск не трогал, потом заметил вот эту беду.. но сразу не проверил как на рабочем сайте, думал там также. Оказывается работать сайт в интернете и на локальном сервере может по разному.

    Всех благодарю за помощь.