MySQL →
Обрезаем строку в юникоде
Практически на всех блогах сейчас есть блоки на главной странице где выводятся последние события из жизни сайта — к примеру последние комментарии. Поскольку комментарии могут быть длинными и весь комментарий выводить на главной не эстетично, перед выводом его нужно обрезать до нужных размеров.
В PHP4 есть такая замечательная функция substr
substr() возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Вся проблема в том что для кодировки unicode эта фунция работает некорректно.

Эту проблему я решил с помощью mysql. Поскольку данные хранятся в базе, логично было бы делать выборку и возвращать уже обрезанные данные. К тому же это будет значительно производительнее, чем выполнять эту операцию средствами php.
В MySQL есть такая же функция SUBSTR которая прекрасно работает со всеми кодировками. Единственный подводный камень — в MySQL строка начинается не с 0 как в php а с 1. Если вы вторым параметром укажите 0 то в результате получите пустую строку.
Теперь при выводе нужно дать понять пользователю что комментарий обрезан, т.е проставить '...' за обрезанными комментариями.
Для этого используем конструкцию IF из синтаксиса MySQL. Если строка до обрезания не равна строке после обрезания то нужно добавить '...' к этому комментарию. Получим вот такой запрос:
В результате получаем как раз то что нам нужно:

Потом просто выводим уже готовые username и comment в нужном нам месте на странице.
В PHP4 есть такая замечательная функция substr
string substr ( string $string , int $start [, int $length ] )
substr() возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Вся проблема в том что для кодировки unicode эта фунция работает некорректно.

Эту проблему я решил с помощью mysql. Поскольку данные хранятся в базе, логично было бы делать выборку и возвращать уже обрезанные данные. К тому же это будет значительно производительнее, чем выполнять эту операцию средствами php.
В MySQL есть такая же функция SUBSTR которая прекрасно работает со всеми кодировками. Единственный подводный камень — в MySQL строка начинается не с 0 как в php а с 1. Если вы вторым параметром укажите 0 то в результате получите пустую строку.
SELECT SUBSTR(username, 1, 20) username, SUBSTR(comment, 1, 20) comment FROM comments
Теперь при выводе нужно дать понять пользователю что комментарий обрезан, т.е проставить '...' за обрезанными комментариями.
Для этого используем конструкцию IF из синтаксиса MySQL. Если строка до обрезания не равна строке после обрезания то нужно добавить '...' к этому комментарию. Получим вот такой запрос:
SELECT uniq_id, IF(SUBSTR(username, 1, 20)=username, username, CONCAT(SUBSTR(username, 1, 20), '...')) username, IF(SUBSTR(comment, 1, 20)=comment, comment, CONCAT(SUBSTR(comment, 1, 20), '...')) comment FROM comments
В результате получаем как раз то что нам нужно:

Потом просто выводим уже готовые username и comment в нужном нам месте на странице.



Только зарегистрированные и авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста, или зарегистрируйтесь, если не зарегистрированы.