Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Взаимодействие phpBB с MySQL [4.1]

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Аватара пользователя
Гога
phpBB 2.0.0
Сообщения: 220
Стаж: 18 лет 9 месяцев
Откуда: Архангельск

Взаимодействие phpBB с MySQL [4.1]

Сообщение Гога »

Сам я пока доки курю и, похоже, долго курить буду. Но не мог бы кто пробвинутый в PHP и MySQL разъяснить, как взаимодействуют phpBB и MySQL.

Что именно интересует:
  • Кодировки на стороне сервера MySQL и на стороне браузера. Что происходит, если MySQL работает в cp1251 (например, для одного поля в таблице (MySQL 4.1)), а браузер отсылает данные в koi8-r? Я не вижу в исходника phpBB, чтобы он трепыхался на этот счёт, типа

    Код: Выделить всё

    SET NAMES 'charset_name'
    SET CHARACTER SET charset_name
    Достоверно известно, что сейчас я имею проблемы с сортировкой, например, по именам пользователей. На домашней машине, где везде koi8-r, проблем нет.
  • Как перевести базу данных на другую кодировку? (c phpBB это, мягко говоря, слабо связано)
Ссылки приветсвуются.

Вообще, я сам не понимаю, чего я не понимаю... :roll:
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5266
Стаж: 19 лет 1 месяц
Откуда: Питер
Благодарил (а): 187 раз
Поблагодарили: 785 раз

Сообщение Siava »

Гога
Я тоже не понимаю, как это всё работает, наверно что-то из шаманства..
Изначально пользовался MySQL 4.0.*, там всё ясно. Потом перешёл на MySQL 4.1.*.. не всякими дампами, а просто переносом каталога data (благо сервак мой). И всё. Проблем с кодировкой никаких не было, даже при установленной по-умолчанию в MySQL 4.1.* latin1..
Время идёт, теперь у меня наверно все таблицы в БД в кодировке latin1.. но проблем нет, кроме как при просмотре содержимого через phpmyadmin.
Интересно, что обратный процесс тоже работает без проблем - то есть, если перенести всю data обратно в MySQL 4.0.*, то всё работает и в phpmyadmin тоже всё русское отображается как и должно быть =)

P.S.
Никаких настроек в my.cnf нового MySQL я не делал.. его у меня даже нет :mrgreen:
Дампами не пользуюсь и сплю спокойно.. пока :lol:
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Аватара пользователя
Гога
phpBB 2.0.0
Сообщения: 220
Стаж: 18 лет 9 месяцев
Откуда: Архангельск

Сообщение Гога »

Ещё фишка (недавний дамп)

Код: Выделить всё

Universal transformation format 8 bits; UTF-8
  Doubly-encoded to UTF-8 from CP1251
И я пока не могу привести дамп к читаемому виду.
зПЗБ -- UTF8
п╥п÷п≈п▒ -- koi8r
Гога -- на самом деле

Добавлено спустя 10 минут 36 секунд:

(у меня koi8-r)

Код: Выделить всё

>echo Гога | iconv -f cp1251 -t utf8
п╥п÷п≈п▒

Код: Выделить всё

>echo Гога | iconv -f koi8-r -t utf8
п⌠п╬пЁп╟
Добавлено спустя 2 часа 41 минуту 31 секунду:

Ой, робяты! Ого! Шо я сделал!

Короче. MySQL 4.1

Скачал дамп.
"Расшифровал" (весь текст был koi8r, phpMyAdmin думал, что cp1251, да ещё перекодировал в utf8)
Перекодировал в 100% koi8r.
Везде в дампе заменил cp1251 на koi8r (напр., CHARACTER SET)

Осталось импортировать... но как? Файл офигенного размера, ни сам phpBB, ни phpMyAdmin (с большим memory_limit) не смогли. А до завтра ждать не охота.

Ладно. На своём домашнем компе я этот файл разбил на кусочки, причём не абы как, а по несколько (по 200, вроде) SQL запросов.

Закачал все кусочки (327) по FTP на сервер.
И, открывая эти кусочки в нужном порядке, импортировал всё 8)

И ничего не изменилось.... (проблемы с сортировкой, phpMyAdmin тарабарщину даёт ту же самую). Потому что по дефолту соединение устанавливается в cp1251 (у нас же все веб-мастера виндузятники)

Ладненько, думаю.
Перед командами импорта пишу:

Код: Выделить всё

mysql_query("SET NAMES koi8r") or die(mysql_error());
mysql_query("SET CHARACTER SET koi8r") or die(mysql_error());
Повторяю импорт... мама! теперь на форуме тарабарщина... :shock:

Ну, мля, думаю...
В includes/db.php (методом грубой силы, без финтов):
После

Код: Выделить всё

// Make the database connection.
$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false);
if(!$db->db_connect_id)
{
   message_die(CRITICAL_ERROR, "Could not connect to the database");
}
Пишу:

Код: Выделить всё

$db->sql_query("SET CHARACTER SET koi8r");
И опа! Всё орбайт! Сортировка на месте, голова на месте :D
Гога писал(а):Я не вижу в исходника phpBB, чтобы он трепыхался на этот счёт, типа
Теперь вижу

Добавлено спустя 2 минуты 11 секунд:

Вот код для разбивки (выдран из админки изначально):

Код: Выделить всё

<?php
include('./includes/sql_parse.php');

$backup_file_tmpname = '/var/www/htdocs/forum.svn/trunk/babel.sql';
$sql_query = fread(fopen($backup_file_tmpname, 'r'), filesize($backup_file_tmpname));

if($sql_query != "")
{
	// Strip out sql comments...
	$sql_query = remove_remarks($sql_query);
	$pieces = split_sql_file($sql_query, ";");

	$sql_count = count($pieces);
	$j=0;
	$out=fopen("./tmp/$j.sql", 'w');
	for($i = 0; $i < $sql_count; $i++)
	{
		if (!($i % 200))
		{
			echo "Ok: $j\n<br>";
			$j++;
			fclose($out);
			$out=fopen("./tmp/$j.sql", 'w');
		};

		$sql = trim($pieces[$i]);
		fwrite($out, "$sql;\n\n");
	}
}
echo "Ok: $j";
fclose($out);
?>
А это для импорта:

Код: Выделить всё

<?php
include('config.php');
include('./includes/sql_parse.php');
mysql_connect($dbhost,$dbuser,$dbpasswd) or die("Oops!");
mysql_select_db($dbname) or die(mysql_error());

$fcount = 327;
mysql_query("SET NAMES koi8r") or die(mysql_error());
mysql_query("SET CHARACTER SET koi8r") or die(mysql_error());
for ($f = 1; $f <= $fcount; $f++)
{
	$filename_tmpl = "./tmp/$f.sql";
	echo "$filename_tmpl<br>";
	$in = fopen($filename_tmpl, 'r');
	$sql_query = fread($in, filesize($filename_tmpl));
	fclose($in);

	if($sql_query != "")
	{
		// Strip out sql comments...
		$sql_query = remove_remarks($sql_query);
		$pieces = split_sql_file($sql_query, ";");

		$sql_count = count($pieces);
		for($i = 0; $i < $sql_count; $i++)
		{
			$sql = trim($pieces[$i]);
			mysql_query("$sql") or die(mysql_error());
		}
	}
}
?>
Добавлено спустя 3 часа 9 минут 16 секунд:

Ещё после этих манипуляций таблицы поиска раскорячило (???)
Пришлось скоропостижно ставить reindex_mod и приводить их в порядок.

Получилось :)
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Стаж: 19 лет 7 месяцев
Откуда: Бердск

Сообщение crash »

Гога если инет не диалап, хотя и при нем можно, и доступ к бд есть с другого хоста, например с домашнего компа, то можно и большой файл бэкапа восстановить, правда время займет.
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
Гога
phpBB 2.0.0
Сообщения: 220
Стаж: 18 лет 9 месяцев
Откуда: Архангельск

Сообщение Гога »

crash писал(а):не диалап, хотя и при нем можно, и доступ к бд есть с другого хоста
Не диалап, а доступа к БД нет, зато есть доступ к админу :)
Но
Гога писал(а):до завтра ждать не охота.
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Стаж: 19 лет 7 месяцев
Откуда: Бердск

Сообщение crash »

Гога писал(а):А до завтра ждать не охота.
я про будущее. ну а если cpanel у хостера, то там можно сделать доступ). так а дамп по фтп не влазит?)
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
Гога
phpBB 2.0.0
Сообщения: 220
Стаж: 18 лет 9 месяцев
Откуда: Архангельск

Сообщение Гога »

crash писал(а):так а дамп по фтп не влазит?
Влазит. Но его ж бить надо, а для этого загрузить целиком,
а memory_limit обломает.
А на своей машине я ка-а-ак поставил 100Мб...
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Стаж: 19 лет 7 месяцев
Откуда: Бердск

Сообщение crash »

Гога зачем бить? если есть доступ по ssh то и бит не надо)
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
andrew_pp
phpBB 1.2.1
Сообщения: 27
Стаж: 18 лет 6 месяцев

Сообщение andrew_pp »

Вы так интересно обсуждате, что просто слюньки текут, что бы помочь. Но к сожалению, не могу, не знаю программирования на этом уровне. Но проблема у меня та же, и все гуру замолчали по поводу моего поста http://www.phpbbguru.net/community/viewtopic.php?t=4509, и я не могу даже эксперементировать с хостером. Что дальше делать? Хостер хочет мне помочь, но видимо сам не знает как. А, видимо, проблема в них. Вот бы в сем миром справиться. Я готов оплатить решение этой моей проблемы. У моего хостера на всех форумах проблема с сортировкой на русском языке. Они мне все предлагают использовать команду "SET OPTION CHARACTER SET CP1251_KOI8", так как mySQL работет у них в KOI8-R. Но куда ее пристроить не могут сказать.

С уважением,
Андрей
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5266
Стаж: 19 лет 1 месяц
Откуда: Питер
Благодарил (а): 187 раз
Поблагодарили: 785 раз

Сообщение Siava »

Решил я проблемку с кодировками MySQL 4.1.*

Сначала пользовался MySQL 4.0.* - там с кодировкой проблем не было, сервер работал под виндой и установлено было всё по дефолту на cp1251.
Шло время, поставил себе MySQL 4.1.* и тут-то кодировка сервера сменилась на Latin1. Все новые таблицы форума создавались и наполнялись в этой кодировке. С русским в принципе проблем не было, за исключением неправильной сортировки.

Сегодня решил подвести черту и сравнять все кодировки к единой cp1251! :twisted:
И вот как это было:

1. Собрал исходники MySQL 4.1.18 используя кодировку cp1251 как основную

Код: Выделить всё

./configure --with-mysqld-user=mysql --with-charset=cp1251 --with-collation=cp1251_general_ci --with-extra-charsets=all
2. Затем в /etc/my.cnf помимо существующих (кстати, до этого о кодировке там не было ни строчки) добавил следующие строки:

Код: Выделить всё

[client]
..........
character-sets-dir=/usr/local/share/mysql/charsets

Код: Выделить всё

[mysqld]
...........
character-sets-dir=/usr/local/share/mysql/charsets
default-character-set=cp1251
character_set_server=cp1251
collation_server=cp1251_general_ci

Код: Выделить всё

[mysqldump]
..........
character-sets-dir=/usr/local/share/mysql/charsets
default-character-set=cp1251
(Сервер на Slackware Linux)

3. Далее начались пляски с бубном..
Скопировал каталог с базами данных и запустил Mysql-сервер.
В phpmyadmin в переменных сервера конечно же появились нужные кодировки:

Код: Выделить всё

character set client	utf8	cp1251
character set connection	cp1251	cp1251
character set database		cp1251	cp1251
character set results		utf8	cp1251
character set server		cp1251	cp1251
character set system		utf8	utf8
character sets dir		/usr/local/share/mysql/charsets	/usr/local/share/mysql/charsets
collation connection		cp1251_general_ci	cp1251_general_ci
collation database		cp1251_general_ci	cp1251_general_ci
collation server		cp1251_general_ci	cp1251_general_ci
Но при открытии форума те русские названия, которые хранились в таблицах с Latin1 отображались как ????? :(
Пробовал делать дампы из консоли, но с любыми кодировками получалась лажа.. Пришлось полезть в гугл.

И вот оно решение!!!
http://dev.mysql.com/doc/refman/4.1/en/ ... rsion.html

Здесь есть скрипт, выполнив который, получаем схему. С помощью неё можно конвертировать все базы в нужную кодировку! :D

Переконвертировав все таблицы в cp1251 теперь имею нормальную русскую базу данных и больше нет проблем с сортировками и прочей гадостью :)


Скрипт я немного изменил, так как стандартный в некоторых схемах не добавлял знак ; в конце строки.


Думаю идея моя понятна. Юзайте! :D


P.S.
в нём есть один небольшой баг.
Когда пытаешься переконвертировать таблицу с индексом FULL TEXT, то натыкаешься на ошибку. Я удалял сначала индекс, затем применял схему конвертации, а затем создавал индекс заново.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
green_forest
phpBB 1.0.0
Сообщения: 1
Стаж: 17 лет 10 месяцев

Сообщение green_forest »

Siava

Привет!
А можно поподробнее про удаление / создание индексов.
Не получается....

mysql>show index from search_wordlist;
Key_name
PRIMARY
word_id

mysql> drop index PRIMARY on search_wordlist;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PRIMARY on search_wordlist' at line 1

Туплю?
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5266
Стаж: 19 лет 1 месяц
Откуда: Питер
Благодарил (а): 187 раз
Поблагодарили: 785 раз

Сообщение Siava »

green_forest
Все операции с MySQL я проводил через PHPMyAdmin.. там всё наглядно и понятно :roll:
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Iftin
phpBB 2.0.7
Сообщения: 573
Стаж: 18 лет 9 месяцев
Откуда: Moscow

Сообщение Iftin »

выполнил скрипт, тот что в архиве. в пхпМайАдмин сделал MySQL запрос с данными, которые получились от работы скрипта mysqlupgrade. Теперь весь форум в ??????? что ещё нужно сделать? 8)
Iftin
phpBB 2.0.7
Сообщения: 573
Стаж: 18 лет 9 месяцев
Откуда: Moscow

Сообщение Iftin »

никто не знает :((
Iftin
phpBB 2.0.7
Сообщения: 573
Стаж: 18 лет 9 месяцев
Откуда: Moscow

Сообщение Iftin »

Siava
я на сколько понял скрипт только в таблице базы меняет кодировку, а содержимое не конвертит!!! :twisted:



p.s.
перед процедурами, сохраняйте копии баз, а то потеряете все!

Вернуться в «Поддержка phpBB 2.0.x»