Небольшая проблемка с записью в базу
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 сообщений
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, проблема решилась спасибо!