Instantly share code, notes, and snippets.

Embed
What would you like to do?
Преобразование сериализованных массивов в базе данных Битрикс после изменения кодировки
<?
/* Массив таблиц и стобцов с сериализованными данными которые удалось найти */
$arDB = array(
'b_component_params' => 'PARAMETERS',
'b_event' => 'C_FIELDS',
'b_event_log' => 'DESCRIPTION',
'b_event_message' => 'ADDITIONAL_FIELD',
'b_group' => 'SECURITY_POLICY',
'b_iblock_element_property' => 'VALUE',
'b_iblock_fields' => 'DEFAULT_VALUE',
'b_iblock_property' => 'USER_TYPE_SETTINGS',
'b_option' => 'VALUE',
'b_rating' => 'CONFIGS',
'b_rating_rule' => 'CONDITION_CONFIG', // два столбца 1
'b_rating_rule' => 'ACTION_CONFIG', // два столбца 2
'b_undo' => 'CONTENT',
'b_user_field' => 'SETTINGS',
'b_user_option' => 'VALUE',
'b_uts_user' => 'UF_SOCIAL_NETWORKS',
'b_xml_tree' => 'ATTRIBUTES',
);
global $DB;
foreach($arDB AS $k => $v):
$q1 = "SELECT `$v` FROM `$k`";
$res = $DB->Query($q1);
while ($row = $res->Fetch()):
$val = $row[$v];
if(empty($val) OR substr($val, 0, 2) != 'a:') continue;
// Если уже перевели базу в UTF-8 меняем данные обратно в win
$val = $APPLICATION->ConvertCharset($val, 'utf-8', 'windows-1251');
/* Конвертируем обратно */
$val = @unserialize($val);
if ($val === false) continue;
/* Преобразуем массив в кодироку UTF-8 */
$val = $APPLICATION->ConvertCharsetArray($val, 'windows-1251', 'utf-8');
/* По новой сериализуем */
$val = serialize($val);
/* Пишем в бд */
$q2 = "UPDATE `$k` SET `$v` = '$val' WHERE `$v` = '".$row[$v]."'";
$DB->Query($q2);
endwhile;
endforeach;
?>
В продложении статьи: http://dev.1c-bitrix.ru/community/blogs/howto/1466.php
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment