Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

«Кракозябры» в БД либо когда «Думать нужно было прежде»

Anna | 31.05.2014 | нет комментариев
На днях столкнулся с глупейшей обстановкой. Запустили один веб-план, все работает, код пишется и дополняется, базы данных наполняются. Разработка идет на тестовом хосте, после этого метаморфозы заливаются на сервер, каждая проверка сводится к заходу на сам сайт и тесту каждого и всея. Внезапно, выясняется, что буква «ш» не отображается на сайте, а взамен неё два ничего не значащих символа.

Та же история оказалась с буквой «И». Здесь же заходим в СУБД на сервере и видим… сплошные «кракозябры», взамен кириллицы. Но латиница записывается типично.Безусловно все подумали на задачи с кодировками и безусловно это так. Глядим подробнее… Кодировка таблицы — UTF-8, кодировка надобных столбцов — UTF-8, кодировка в заголовках страницы — UTF-8, кодировка в браузере — UTF-8. Ну и безусловно подвело промежуточное звено, кодировка соединения — cp1251. А все лишь потому, что не проверили идентичность настроек тестового и рабочего сервера БД. Глупая оплошность, но данных в БД теснее полно и нужно как-то их воротить. Прогуглив все, что дозволено, было обнаружено несколько увлекательных sql-запросов, методы с шаманством кодировок в дампах, с поддержкой блокнота, и один php-скрипт, тот, что отработав точно, легко выдал те же иероглифы. Что то не помогло, что то легко не подходит.

Моё решение тривиальное, но я не обнаружил сходственного на просторах сети.
Пишем небольшой php скрипт перегона надобных таблиц в необходимый формат.

<?php
define('BD_HOST','localhost');
define('BD_PASS','password');
define('BD_LOGIN','login');   //доступ к БД
define('BD_FROM','bd1');   //исходная БД
define('BD_IN','bd2');   //конечная БД

$tables = array (	'table1',
					'table2',
					'table3',
					'table4',
					'table5');   //список  необходимых таблиц для конвертирования, эти таблицы обязаны быть как в начальной, так и в финальной БД(в финальной, обязаны быть пустыми)

foreach ($tables as $table) {
	mysql_connect(BD_HOST,BD_LOGIN,BD_PASS);
	mysql_select_db(BD_FROM);

	$query_select_from = "SELECT * FROM $table;";
	$result = mysql_query($query_select_from);

	mysql_close();   //запросили все косячные данные и закрыли соединение

	mysql_connect(BD_HOST,BD_LOGIN,BD_PASS);
	mysql_select_db(BD_IN);
	mysql_query('set character_set_client="utf8"');
	mysql_query('set character_set_results="utf8"');
	mysql_query('set collation_connection="utf8_general_ci"');
	mysql_query("set names utf8");   //открыли новое соединение, но теснее указав все недостающие настройки, из за которых случилось такое недопущение

	while ($t = mysql_fetch_assoc($result)) {
		$values = '';
		$f = false;
		foreach($t as $val) {
			$p = ($f)?',':'';
			$f = true;
			$add = (is_int($val))?"$val":"'$val'";
			$values.= "$p $add";
		};
		$insert_in = "INSERT $table VALUES($values)";
		mysql_query($insert_in);   //запись прочтенной строки, теснее в типичном соединении
	};
	mysql_close();   //закрываем соединение, что бы открыть его теснее для иной таблицы.
};

?>

Вот и все. Скрипт сделал именно то, что было необходимо и писался за пару минут, следственно могут быть изумления, что это же дозволено сделать больше эластичным и оптимизированным, а еще и ООП хорошо прикрутить бы.

Верю, что данный скрипт сгодится кому-либо.
Спасибо за внимание.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB