Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Некорректная работа функции substr().

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Строка, обрезанная функцией substr() выводится не той длинны и с симфолом в конце строки
mihon_kri
Отправлено: 14 Февраля, 2014 - 16:00:03
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Доброе время суток! Столкнулся с такой проблемой: вывожу из БД (mysql) данные в раздел новости на сайте. В разделе анонс, хотел обрезать строку до 80 знаков функцией substr(). В итоге при выводе анонса выводится число знаков в 2 раза меньше и в конце строки появляется символ - знак вопроса в ромбике (какой иногда выводится из-за несоответствия кодировок). Кодировки базы и php-файлика UTF-8. Сам кусок кода, которым вывожу инфу:


CODE (php):
скопировать код в буфер обмена
  1. $rezultat = mysql_query($sql) or die(mysql_error());
  2. while ($rez = mysql_fetch_assoc($rezultat)){
  3.         $id = $rez['id'];
  4.         $idate = $rez['iidate'];
  5.         $name = $rez['name'];
  6.         $announce = $rez['announce'];
  7.         $announce = substr($announce, 0, 80);
  8.         $text = $rez['text'];
  9.         echo "<p>";
  10.         echo "<span>$idate</span><br/>";
  11.         echo "<a title='".$name."' href='/news_".$id.".htm'>".$name."</a> <br/>";
  12.         echo $announce;
  13.         echo "</p>";
  14.         }

при коннекте с БД так же указал такие параметры для вывода в правильной кодировке:

PHP:
скопировать код в буфер обмена
  1. define("DB_HOST", "localhost");
  2. define("DB_LOGIN", "root");
  3. define("DB_PASSWORD", "");
  4. define("DB_NAME", "dreamnew");
  5.        
  6. $conn = mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die("Ошибка соединения с сервером баз данных");
  7.  
  8. mysql_query("SET NAMES 'UTF8'");
  9. mysql_query("SET CHARACTER SET 'UTF8'");


Что то подсказывает, что с кодировками какая то бага... В чём тут может быть дело?


Отредактировано модератором: Мелкий, 14 Февраля, 2014 - 16:04:49
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2014 - 16:05:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




substr оперирует байтами.
Вам нужна mb_substr


-----
PostgreSQL DBA
 
 Top
Tyoma5891
Отправлено: 14 Февраля, 2014 - 16:10:23
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


Помог: 5 раз(а)




mihon_kri пишет:
Доброе время суток! Столкнулся с такой проблемой: вывожу из БД (mysql) данные в раздел новости на сайте. В разделе анонс, хотел обрезать строку до 80 знаков функцией substr(). В итоге при выводе анонса выводится число знаков в 2 раза меньше и в конце строки появляется символ - знак вопроса в ромбике (какой иногда выводится из-за несоответствия кодировок). Кодировки базы и php-файлика UTF-8. Сам кусок кода, которым вывожу инфу:


CODE (php):
скопировать код в буфер обмена
  1. $rezultat = mysql_query($sql) or die(mysql_error());
  2. while ($rez = mysql_fetch_assoc($rezultat)){
  3.         $id = $rez['id'];
  4.         $idate = $rez['iidate'];
  5.         $name = $rez['name'];
  6.         $announce = $rez['announce'];
  7.         $announce = substr($announce, 0, 80);
  8.         $text = $rez['text'];
  9.         echo "<p>";
  10.         echo "<span>$idate</span><br/>";
  11.         echo "<a title='".$name."' href='/news_".$id.".htm'>".$name."</a> <br/>";
  12.         echo $announce;
  13.         echo "</p>";
  14.         }

при коннекте с БД так же указал такие параметры для вывода в правильной кодировке:

PHP:
скопировать код в буфер обмена
  1. define("DB_HOST", "localhost");
  2. define("DB_LOGIN", "root");
  3. define("DB_PASSWORD", "");
  4. define("DB_NAME", "dreamnew");
  5.        
  6. $conn = mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die("Ошибка соединения с сервером баз данных");
  7.  
  8. mysql_query("SET NAMES 'UTF8'");
  9. mysql_query("SET CHARACTER SET 'UTF8'");


Что то подсказывает, что с кодировками какая то бага... В чём тут может быть дело?

к тому же использование
mysql_query("SET NAMES 'UTF8'");
mysql_query("SET CHARACTER SET 'UTF8'")
не имеет никакого смысла, корректнее работает изь этих двух только mysql_query("SET NAMES 'UTF8'");
 
 Top
mihon_kri
Отправлено: 15 Февраля, 2014 - 12:35:09
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Спасибо, в понедельник на работке попробую с mb_substr
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB