Юрий Л.
124 сообщения
#16 лет назад
Здравствуйте, Коллеги =) Возникла маленькая проблемка, кто подскажет решение?

База данных в uft, текст добавляется в uft.

Выполняется запрос:


$database->database_query("
INSERT INTO se_actions (
action_actiontype_id,
action_date,
action_user_id,
action_text,
action_object_owner,
action_object_owner_id,
action_object_privacy
) VALUES (
'{$actiontype_info}',
'{$nowdate}',
'{$user->user_info}',
'{$action_text}',
'{$action_object_owner}',
'{$action_object_owner_id}',
'{$action_object_privacy}'
)
");

$action_text содержит такую информацию:
a:7:{i:0;s:5:\"Yuriy\";i:1;s:11:\"Юрий FT\";i:2;s:1:\"6\";i:3;s:1:\"4\";i:4;s:49:\"РћС?РёР±РєРё найденные РІ сети FxNow\";i:5;s:3:\"190\";i:6;s:250:\"Что касается С…РѕРґРёРј РїРѕ РєСЂСѓРіСѓ: недавно был проведен эксперемент РІ поле Рё выяснилось РґРІРµ вещи:<br>1. Р РђРґРёСѓСЃ РєСЂСѓРіР° зависит РѕС‚ масС?таба прострР...\";}


В базу же данных попадает всего часть строки $action_text а именно:
a:7:{i:0;s:5:"Yuriy";i:1;s:11:"Юрий FT";i:2;s:1:"6";i:3;s:1:"4";i:4;s:49:"Ошибки найденные в сети FxNow";i:5;s:3:"190";i:6;s:250:"Что касается ходим по кругу: недавно был проведен эксперемент в поле и выяснилось две вещи:<br>1. РАдиус круга зависит от масштаба простр

В общем обрезается строка по не известной причине, и так происходит только с некоторыми текстами.

Тип поля в БД в который пишется $action_text - TEXT
Вадим Т.
3240 сообщений
#16 лет назад
Скорее всего это случается потому, что строка UTF-8 у Вас некорректно обрезается (в Вашем примере перед заключительным троеточием IMHO лишь первый байт кода буквы "а".

Далее, это не относится к данной проблеме, но хочу обратить внимание, что такой метод передачи параметров в SQL запрос категорически неприемлем, пожалуйста используйте биндинг параметров.
Юрий Л.
124 сообщения
#16 лет назад
Большое спасибо за отклик, я уже и не надеялся. Насчет обрезания не очень понял, т.е получается что буква "а" не до конца сформировалась? За обрезание строки отвечает данный код:

if( strlen($topic_body_encoded) > 250 )
$topic_body_encoded = substr($topic_body_encoded, 0, 245)."...";

Такой способ видимо не корректен?

Погуглил не нашел ничего относительно биндинга параметров, что это за зверь?
Фрилансер У.
248 сообщений
#16 лет назад
Substr для utf8???
Будет вопросик или кубик.
Используйте это -


Цитата:
Погуглил не нашел ничего относительно биндинга параметров, что это за зверь?

Это когда на место плейсхолдеров ставятся значения в кавычках, при этом значение экранируется.
Юрий Л.
124 сообщения
#16 лет назад
Цитата ("werewolf"):
Substr для utf8???
Будет вопросик или кубик.
Используйте это -


Цитата:
Погуглил не нашел ничего относительно биндинга параметров, что это за зверь?

Это когда на место плейсхолдеров ставятся значения в кавычках, при этом значение экранируется.
]http://www.php.net/manual/en/mysqli-stmt.bind-param.php

Все понятно, видимо изначально все спроектировано для анг символов, отсюда и поголовное использование Substr, буду разбираться значит. Спасибо.
Андрей К.
1172 сообщения
#16 лет назад
Поэтому и ждем php6.
Можно попробовать извратиться, при операциях над строкой выполнить сначала
$var=iconv('utf-8','windows-1251',$var);
а перед записью в базу или выводом обратно
$var=iconv('windows-1251','utf-8',$var);
Юрий Л.
124 сообщения
#16 лет назад
Цитата ("Lisio"):
Поэтому и ждем php6.
Можно попробовать извратиться, при операциях над строкой выполнить сначала
$var=iconv('utf-8','windows-1251',$var);
а перед записью в базу или выводом обратно
$var=iconv('windows-1251','utf-8',$var);

Ага вот это в первую очередь попробовал, не помогло, а точнее строка превратилась в пустую =)
Вадим Т.
3240 сообщений
#16 лет назад
Цитата ("nolesxp"):
Все понятно, видимо изначально все спроектировано для анг символов, отсюда и поголовное использование Substr, буду разбираться значит. Спасибо.

Не совсем так, substr не "спроектировано для анг символов", а предназначено для работы с однобайтовыми кодировками.
Для работы с многобайтовыми кодировками, в состав которых входит и UTF-8, используются другие способы, например, как указали выше, PHP extension mbstring (Multibyte String).

Если по какой-то причине Вам нельзя использовать в проекте mbstring, то посмотрите как можно выкрутиться с substr: (там в комментариях есть примеры кода).
Юрий Л.
124 сообщения
#16 лет назад
Цитата ("tvv"):
Цитата ("nolesxp"):
Все понятно, видимо изначально все спроектировано для анг символов, отсюда и поголовное использование Substr, буду разбираться значит. Спасибо.

Не совсем так, substr не "спроектировано для анг символов", а предназначено для работы с однобайтовыми кодировками.
Для работы с многобайтовыми кодировками, в состав которых входит и UTF-8, используются другие способы, например, как указали выше, PHP extension mbstring (Multibyte String).

Если по какой-то причине Вам нельзя использовать в проекте mbstring, то посмотрите как можно выкрутиться с substr: (там в комментариях есть примеры кода).


Понятно, действительно функция:

<?php
function str_stop($string, $max_length){
if (strlen($string) > $max_length){
$string = substr($string, 0, $max_length);
$pos = strrpos($string, " ");
if($pos === false) {
return substr($string, 0, $max_length)."...";
}
return substr($string, 0, $pos)."...";
}else{
return $string;
}
}
?>


Как раз встала как положено, вместо substr, проблема решилась спасибо!