Migrate a phpBB3 forum to Discourse

여기서 글을 올리는 사람이 나뿐인 것 같네요…

새로운 디스코urses 포럼을 출시하려던 바로 그 순간, 아주 이상한 문제를 발견했습니다! 이 문제로 인해 난감한 상황인데, 여기서 누군가가 이 문제를 해결해 줄 수 있기를 바랍니다…

상황: 저는 phpbb3에서 두 개의 데이터베이스를 디스코urses로 가져왔습니다. 첫 번째는 아카이브로, 15년 전에 현재 포럼을 두 개로 나누어 동결한 것입니다. 포럼의 나머지 절반은 계속 활동하며 성장했습니다. 저는 가져오기 도구가 가져오기 시 이 두 개를 병합해 줄 것으로 기대했고, 실제로 그렇게 되었습니다! :smiley:

하지만 이제 한 사용자의 사례를 발견했는데, 이것이 유일한 사례인지 아니면 다른 사용자들에게도 영향을 미쳤는지, 그리고 다른 사례들을 어떻게 검색할 수 있는지 알아야 합니다.

해당 사용자는 두 개의 계정을 생성했습니다. 모두 현재 포럼에서 생성한 것입니다. 편의상 기존 계정은 OldName, 새 계정은 NewName이라고 하겠습니다.

가져온 디스코urses에는 이제 두 명의 사용자가 있습니다. 하나는 OldName이고, NewName이어야 할 사용자는 OldName1로 이름이 변경되었습니다. 또한 OldName의 게시글이 OldName1에 병합되었습니다.

다른 이중 계정 사용자들이 이 영향에서 벗어나 있는 것 같기 때문에, 왜 이 사용자에게만 이런 일이 발생했는지 전혀 알 수 없습니다.

여기서 무슨 일이 일어났을지 아시는 분 계신가요?
다른 사례들을 검색할 수 있는 방법이 있을까요?

1개의 좋아요

하지만 아마도 여러분이 생각하는 방식과는 다를 것입니다. 단순히 가져오기 도구를 두 번 실행했다면, 모든 import_id 사용자 정의 필드가 충돌하여, 첫 번째 데이터베이스의 userid 123 사용자는 이제 새 데이터베이스의 userid 123 사용자와 동일한 사용자가 됩니다. 주제와 게시물도 마찬가지입니다.

구 데이터베이스와 새 데이터베이스 양쪽에 존재하는 모든 userid(그리고 주제, 게시물, 그리고 아마도 카테고리)가 구 데이터베이스의 항목과 병합된다고 확신합니다.

import_id가 충돌하지 않도록 확인하는 조치가 필요합니다(기존 항목을 삭제하거나, 각 가져오기마다 고유하도록 가져오기 스크립트를 수정하는 것 등이 있을 수 있습니다).

4개의 좋아요

음… 어쨌든 둘은 같은 거 아닌가요??
내 말은, 기본적으로 동일한 포럼인데 한쪽은 계속 운영되었고, 다른 한쪽은 시간 속에 얼어붙어 있었다는 겁니다. 그래서 사용자 ID 123은 여전히 사용자 ID 123이고, 게시글과 주제 ID도 마찬가지인가요?

import_id 커스텀 필드라는 게 무슨 뜻인가요?

포럼은 정상적으로 보이고, 모든 주제, 게시글 등이 제자리에 있습니다. 그것들이 병합된 것이 일반적인 개념인가요?

그 한 가지 예외적인 사용 사례를 제외하고는 다른 사용자/게시글/주제에서 다른 문제를 찾을 수 없어요.

아마 상황을 더 잘 설명하기 위해서.

처음에는 하나의 phpbb 포럼이었어요. 어느 시점에 그것을 복제(클론)했습니다. 한쪽 복본은 폐쇄되어 아카이브가 되었고, 다른 한쪽에서는 가장 오래된 게시글들(아카이브에 이미 있는 것들)을 삭제하고 계속 운영했습니다. 그 쪽에서는 사용자, 주제, 게시글 등이 단순히 증가했을 뿐, ID 측면에서는 변경된 적이 없었습니다. 그래서 제 생각에는 가져오기(import) 스크립트가 아카이브와 현재 포럼을 동일한 데이터베이스의 두 부분으로 인식할 거라고 생각했어요. 실제로 그렇게 되었고… 그리고 그렇게 처리된 건가요?

그래서, 제발 제 관점에서 무엇이 잘못되었는지 이해하는 데 도움을 주세요. 왜냐하면 당신이 지적하는 부분이 바로 제가 원했던 동작이거든요…

두 번째 포럼이 첫 번째 포럼의 상위 집합이었다면, 왜 두 포럼 모두를 가져왔는지 이해하기 어렵습니다. 하지만 새로운 포럼이 첫 번째 포럼과 동일한 사용자, 게시물, 주제 ID를 사용하지 않는 한 문제가 없어야 합니다.

사용자, 주제, 게시물이 가져와지면 "import_id"라는 이름의 XxxCustomField가 생성되어, 기존 포럼에서 새 포럼으로의 매핑을 확인할 수 있습니다.

일부 가져오기 도구는 사용자 이름이 변경되는 경우 import_username 사용자 지정 필드도 생성합니다. 다음과 같이 실행할 수 있습니다.

cd /var/discourse
rails c
u=User.find_by_username('username-youwant')
u.custom_fields

이렇게 하면 해당 필드를 확인할 수 있습니다.

1개의 좋아요

왜냐하면 두 개의 "절반"으로 나뉜 하나의 포럼을 유지하기보다, 아카이브된 부분을 전체 포럼에 다시 통합하고 싶었기 때문입니다. 이제 어떤 방식으로든 Discourse로 변환해야 했던 고대 phpbb2 아카이브를 별도로 관리할 필요가 없습니다… 이제 다시 하나로 통합되었습니다 :slight_smile: (당시에는 서버 부하를 줄이기 위해 아카이브를 만들었습니다).

질문하신 쿼리를 시도해 보았습니다. 감사합니다.
제 게시물에 있는 사용 사례의 경우 NewName은 {"import_id"=>"21293"}를 반환했고,
OldName1의 경우
{"import_id"=>"8800", "import_username"=>"OldName"}를 반환했습니다.
즉, 여기서 무슨 일이 일어났는지 보여주는군요… 왜 import_id8800이 import username NewName에 속한다고 판단했을까요? 두 값은 서로 다른 import_ID를 가지고 있는데 말입니다.

어떤 사용자가 영향을 받는지 알 수 없으므로, 더 일반적인 검색을 수행하는 방법이 있을까요? 제가 파악하려고 하는 것이 바로 그 부분입니다. 즉, username-youwant 부분을 알 수 없습니다.

이를 수행하는 방법 중 하나는 다음과 같습니다:

  • 아카이브 가져오기를 완료한 직후 만든 백업으로 복원합니다.
  • 게시글, 주제, 카테고리, 사용자의 import_id 값을 지웁니다.
  • 현재 포럼 가져오기를 수행합니다.

이렇게 하면 사용자는 이메일 기준으로 매칭 및 병합되어야 합니다.

4개의 좋아요

맞습니다. import_id는 서로 다르지만, 사용자 이름은 동일합니다. 두 계정을 같은 사용자로 취급하려면 사용자 이름을 동일하게 해야 합니다(또는 import_id를 동일하게 만들 수 있는 방법을 강구할 수도 있습니다).

아래와 같이 검색해 볼 수 있습니다.

User.where("username like '%1'")

이 방법은 단순히 사용자 이름 끝에 1을 붙이고 싶었던 사용자들도 함께 포착하게 됩니다. .

그리고 그것은 완벽하게 작동할 것입니다… 단, 이메일 주소가 변경된 경우를 제외하고는요.

어떤 방식으로 처리하든, 수동으로 해결해야 할 사항이 몇 가지 있을 것입니다.

1개의 좋아요

꽤 유용합니다. 제 게이밍 포럼을 디스코드로 이전할 예정입니다. 사용하던 PHPbb 호스팅(이곳: https://www.cloudways.com/en/phpbb-hosting.php )은 PHP 외의 앱을 지원하지 않아, 해당 용도로 다른 플랫폼을 알아보고 있습니다.

phpBB 3.2.9 포럼을 discourse로 마이그레이션하려고 합니다. 약 2,800명의 사용자와 거의 36,000개의 게시물이 있습니다. 가져오기에는 @gerhard의 Git 저장소에서 phpbb3 브랜치를 사용하고 있습니다.

사용자와 개인 메시지(PN) 마이그레이션은 잘 작동합니다. 하지만 게시물에서는 문제가 발생합니다. 마이그레이션된 게시물이 약 2,800개뿐입니다. 다음과 같은 메시지를 받았습니다:

    12201 / 35281 ( 34.6%)  [68323 items/min]  Failed to map post with ID 14742
undefined method `name' for nil:NilClass
/var/www/discourse/script/import_scripts/phpbb3/support/bbcode/xml_to_markdown.rb:57:in `visit'
/var/www/discourse/script/import_scripts/phpbb3/support/bbcode/xml_to_markdown.rb:25:in `convert'
/var/www/discourse/script/import_scripts/phpbb3/support/text_processor.rb:41:in `process_raw_text'
/var/www/discourse/script/import_scripts/phpbb3/support/text_processor.rb:68:in `process_post'
/var/www/discourse/script/import_scripts/phpbb3/importers/post_importer.rb:35:in `map_post'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:130:in `block (2 levels) in import_posts'
/var/www/discourse/script/import_scripts/base.rb:491:in `block in create_posts'
/usr/local/lib/ruby/gems/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/mysql2.rb:8:in `each'
/usr/local/lib/ruby/gems/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/mysql2.rb:8:in `each'
/var/www/discourse/script/import_scripts/base.rb:490:in `create_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:128:in `block in import_posts'
/var/www/discourse/script/import_scripts/base.rb:870:in `block in batches'
/var/www/discourse/script/import_scripts/base.rb:869:in `loop'
/var/www/discourse/script/import_scripts/base.rb:869:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:186:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:122:in `import_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
/var/www/discourse/script/import_scripts/base.rb:47:in `perform'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
./script/import_scripts/phpbb3.rb:33:in `<module:PhpBB3>'
./script/import_scripts/phpbb3.rb:14:in `<module:ImportScripts>'
./script/import_scripts/phpbb3.rb:13:in `<main>'
    12202 / 35281 ( 34.6%)  [68322 items/min]  Failed to map post with ID 14744
undefined method `name' for nil:NilClass

저는 Ruby 전문가가 아닙니다. 그래서 이를 어떻게 디버깅해야 할지 실제로 잘 모르겠습니다. 메서드가 누락된 것처럼 보입니다. 하지만 어떻게 그 메서드를 가져올 수 있으며, 왜 거의 2,800개의 게시물이 마이그레이션되었을까요?

이 문제를 일으키는 원인이 무엇인지, 그리고 물론 어떻게 수정할 수 있는지에 대한 아이디어가 있으신가요?

감사합니다!

1개의 좋아요

때로는 코드 안에 악의적인 요인(gremlins)이나 DB에 고블린이 숨어 있을 수 있습니다.

마이그레이션이 오류로 중단되는 경우(이 사례에서도 그런 것 같습니다)에는, 제가 하는 방법은 오류 메시지를 확인한 뒤 스크립트에서 문제가 발생한 파일로 가서 해당 오류를 다음과 같은 간단한 구조로 감싸는 것입니다:

begin
   # 문제의 ruby 코드 라인
rescue
   puts "error! in <offending routine> variable #{variable} blab blah my great message"
end

최근에 100만 개 이상의 게시글을 마이그레이션했는데, 위 예시처럼 오류를 트랩(trap)하고 "계속 진행"하는 것이 큰 도움이 되었습니다.

모든 마이그레이션은 다릅니다. 다른 분들만큼 많은 경험은 없지만, 약 20가지 다른 방식으로 100번 정도 해본 제 경험에 비추어 볼 때 begin rescue end 구조는 매우 중요합니다.

물론 나중에 더 깊이 파고들어 더 큰 문제가 없는지 확인할 수 있습니다. 하지만 때로는 그냥 계속 진행(pluggn’ and migrat’n)하고 싶을 때도 있죠 :slight_smile:

2개의 좋아요

TBauer님, 환영합니다! :wave:

첫 번째 게시글의 이 경고문을 놓치신 것 같습니다.

2개의 좋아요

@TBauer 님은 이 실험 브랜치를 사용하고 있는 것 같습니다. 따라서 이 정도는 괜찮을 것으로 보입니다. 아직 공식적으로 지원되지는 않지만, 어쨌든 이 오류의 원인이 무엇인지 알고 싶습니다.

@TBauer 님, ID가 14742인 게시글의 phpbb_posts 테이블 내 post_text 컬럼 내용을私信으로 보내주시거나 여기에 올려주실 수 있을까요?

최근에 phpBB 3.2로 업그레이드했고, 기존 BBCode 형식을 새 형식으로 변환하는 작업이 아직 완료되지 않은 것 같습니다. 그래서 게시글 2,800개 이후에 실패하는 것일 수 있습니다. 만약 그렇다면, phpBB 3.2+ Text Reparser를 CLI에서 실행해 보시는 것이 좋습니다. 현재 가져오기 스크립트는 BBCode의 구형과 신형 저장 형식을 혼합하는 것을 지원하지 않으며, 새 형식을 사용하면 BBCode에서 마크다운으로의 변환이 훨씬 잘 작동할 것입니다. :wink:

4개의 좋아요

아니요, 마이그레이션은 중단되지 않습니다. 스크립트는 정상적으로 끝까지 실행됩니다. 다만 많은 게시글이 마이그레이션되지 않을 뿐입니다. 이 경우 위와 같은 메시지를 받았고, 데이터베이스에서 몇 개의 게시글을 확인해 보니 모두 XML 코드가 없는 오래된 게시글인 것 같습니다.

@Helmi: 물론 읽었습니다. 그래서 코드의 실험적 브랜치를 사용한 것입니다. :wink:

1개의 좋아요

아마도 그 해결책일 수 있겠네요. 먼저 이 방법을 시도해 보겠습니다. 실패한 게시물들이 XML 형식이 아니라 BBCode 형식으로 되어 있다는 것을 깨달았습니다. 따라서 리파싱 후에 변환을 다시 시도해 보겠습니다…

2개의 좋아요

죄송합니다, 당신의 글을 읽었을 때 이 부분이 완전히 명확하지 않았습니다.

@Helmi: 문제없어요. :smiley:

@gerhard: 작동했어요! 게시물을 새 형식으로 변환한 후 게시물을 가져올 수 있었습니다. 4개의 게시물을 가져오는 동안 예외가 발생했지만, 제 경우에는 괜찮습니다.

   35264 / 35281 (100.0%)  [4879 items/min]  Exception while creating post 39353. Skipping.
unknown attribute 'reply_id' for PostReply.
/usr/local/lib/ruby/gems/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_assignment.rb:53:in `_assign_attribute'
/usr/local/lib/ruby/gems/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_assignment.rb:44:in `block in _assign_attributes'
/usr/local/lib/ruby/gems/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_assignment.rb:43:in `each'
/usr/local/lib/ruby/gems/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_assignment.rb:43:in `_assign_attributes'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/attribute_assignment.rb:22:in `_assign_attributes'
/usr/local/lib/ruby/gems/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_assignment.rb:35:in `assign_attributes'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/core.rb:326:in `initialize'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/inheritance.rb:70:in `new'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/inheritance.rb:70:in `new'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/reflection.rb:158:in `build_association'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/associations/association.rb:325:in `build_record'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/associations/collection_association.rb:108:in `build'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/associations/collection_proxy.rb:316:in `build'
/var/www/discourse/app/models/post.rb:1064:in `create_reply_relationship_with'
/var/www/discourse/app/models/post.rb:750:in `block in save_reply_relationships'
/var/www/discourse/app/models/post.rb:748:in `each'
/var/www/discourse/app/models/post.rb:748:in `save_reply_relationships'
/var/www/discourse/lib/post_creator.rb:187:in `block in create'
/var/www/discourse/lib/post_creator.rb:360:in `block (2 levels) in transaction'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `block in transaction'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:280:in `block in within_new_transaction'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:278:in `within_new_transaction'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `transaction'
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/lib/post_creator.rb:359:in `block in transaction'
/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/lib/post_creator.rb:358:in `transaction'
/var/www/discourse/lib/post_creator.rb:168:in `create'
/var/www/discourse/script/import_scripts/base.rb:555:in `create_post'
/var/www/discourse/script/import_scripts/base.rb:503:in `block in create_posts'
/usr/local/lib/ruby/gems/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/mysql2.rb:8:in `each'
/usr/local/lib/ruby/gems/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/mysql2.rb:8:in `each'
/var/www/discourse/script/import_scripts/base.rb:490:in `create_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:128:in `block in import_posts'
/var/www/discourse/script/import_scripts/base.rb:870:in `block in batches'
/var/www/discourse/script/import_scripts/base.rb:869:in `loop'
/var/www/discourse/script/import_scripts/base.rb:869:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:186:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:122:in `import_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
/var/www/discourse/script/import_scripts/base.rb:47:in `perform'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
script/import_scripts/phpbb3.rb:33:in `<module:PhpBB3>'
script/import_scripts/phpbb3.rb:14:in `<module:ImportScripts>'
script/import_scripts/phpbb3.rb:13:in `<main>'

가져오기 도구와 훌륭한 작업에 감사드립니다! :slight_smile:

3개의 좋아요

안녕하세요 @gerhard, 실제로 우리는 삭제될 위기에 있는 아주 오래된 phpBB 포럼을 저장하기 위해 이 스크립트를 사용하고 있습니다. 전반적으로 잘 진행되고 있지만, 마지막에 포럼에서 인코딩 문제가 발생하고 있습니다. 제목과 게시글 내용이 잘못된 인코딩으로 표시됩니다.

포럼은 프랑스어로 되어 있었고, phpBB에서 다운로드한 SQL 덤프는 UTF-8 인코딩으로 되어 있습니다. 무엇이 문제일까요?

정말 감사합니다. 이 작업은 훌륭합니다! :open_mouth:

어딘가에 인코딩 불일치가 있는 것일 수도 있습니다… 누군가 이를 MySQL 인코딩 지옥이라고 부르는 데에는 이유가 있으니까요.

오래전에 latin1 인코딩 테이블 안에 UTF-8 데이터가 포함된 데이터베이스를 수정하기 위한 스크립트를 만든 적이 있습니다. 도움이 될까요? 그렇지 않다면 직접 해결하셔야 할 것 같습니다.

3개의 좋아요

@gerhard 안녕하세요, 그리고 답변해 주셔서 감사합니다. 제 SQL 덤프 파일 형식은 어떻게 되어야 하나요? 실제로 VS Code는 UTF-8이라고 알려줍니다. 그래서… 작동해야 하지 않나요?

인코딩 문제 때문에 정말 미칠 것 같습니다.. :frowning:

@gerhard : 편집 : 아래에 덤프 파일에 있는 내용 예시를 올립니다.

#
# phpBB Backup Script
# Dump of tables for phpbb3_
# DATE : 06-04-2020 08:26:04 GMT
#
# Table: phpbb3_posts
DROP TABLE IF EXISTS phpbb3_posts;
CREATE TABLE `phpbb3_posts` (
  `post_id` mediumint(8) unsigned NOT NULL auto_increment,
  `topic_id` mediumint(8) unsigned NOT NULL default '0',
  `forum_id` mediumint(8) unsigned NOT NULL default '0',
  `poster_id` mediumint(8) unsigned NOT NULL default '0',
  `icon_id` mediumint(8) unsigned NOT NULL default '0',
  `poster_ip` varchar(40) collate utf8_bin NOT NULL default '',
  `post_time` int(11) unsigned NOT NULL default '0',
  `post_approved` tinyint(1) unsigned NOT NULL default '1',
  `post_reported` tinyint(1) unsigned NOT NULL default '0',
  `enable_bbcode` tinyint(1) unsigned NOT NULL default '1',
  `enable_smilies` tinyint(1) unsigned NOT NULL default '1',
  `enable_magic_url` tinyint(1) unsigned NOT NULL default '1',
  `enable_sig` tinyint(1) unsigned NOT NULL default '1',
  `post_username` varchar(255) collate utf8_bin NOT NULL default '',
  `post_subject` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL default '',
  `post_text` mediumtext character set utf8 collate utf8_unicode_ci NOT NULL,
  `post_checksum` varchar(32) collate utf8_bin NOT NULL default '',
  `post_attachment` tinyint(1) unsigned NOT NULL default '0',
  `bbcode_bitfield` varchar(255) collate utf8_bin NOT NULL default '',
  `bbcode_uid` varchar(8) collate utf8_bin NOT NULL default '',
  `post_postcount` tinyint(1) unsigned NOT NULL default '1',
  `post_edit_time` int(11) unsigned NOT NULL default '0',
  `post_edit_reason` varchar(255) collate utf8_bin NOT NULL default '',
  `post_edit_user` mediumint(8) unsigned NOT NULL default '0',
  `post_edit_count` smallint(4) unsigned NOT NULL default '0',
  `post_edit_locked` tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (`post_id`),
  KEY `forum_id` (`forum_id`),
  KEY `topic_id` (`topic_id`),
  KEY `poster_ip` (`poster_ip`),
  KEY `poster_id` (`poster_id`),
  KEY `post_approved` (`post_approved`),
  KEY `tid_post_time` (`topic_id`,`post_time`),
  KEY `post_username` (`post_username`)
) ENGINE=MyISAM AUTO_INCREMENT=33585 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO phpbb3_posts (post_id, topic_id, forum_id, poster_id, icon_id, poster_ip, post_time, post_approved, post_reported, enable_bbcode, enable_smilies, enable_magic_url, enable_sig, post_username, post_subject, post_text, post_checksum, post_attachment, bbcode_bitfield, bbcode_uid, post_postcount, post_edit_time, post_edit_reason, post_edit_user, post_edit_count, post_edit_locked) VALUES (3, 2, 1, 2, 0, '82.225.50.160', 1135852994, 1, 0, 1, 1, 1, 0, '', 'FORUM EFFACER PAR UN HACKER - Le 28/12/05 !!!', 'Le 28/12/05, le forum a été victime <!-- s:cry: --><img src=\"{SMILIES_PATH}/icon_cry.gif\" alt=\":cry:\" title=\"Crying or Very sad\" /><!-- s:cry: --> de la visite d\'un hacker <!-- s:pan --><img src=\"{SMILIES_PATH}/panpan.gif\" alt=\":pan\" title=\"panpan\" /><!-- s:pan --> peut scrupuleux <!-- s:sick --><img src=\"{SMILIES_PATH}/sick.gif\" alt=\":sick\" title=\"sick\" /><!-- s:sick --> : celui-ci après avoir trouvé le moyen de se connecter au Forum en tant qu?Administrateur du forum a tout simplement supprimé la totalité de nos messages <!-- s:evil: --><img src=\"{SMILIES_PATH}/icon_evil.gif\" alt=\":evil:\" title=\"Evil or Very Mad\" /><!-- s:evil: --> !!! \r\n\r\nMalheureusement et je m\'en excuse <!-- s:oops: --><img src=\"{SMILIES_PATH}/icon_redface.gif\" alt=\":oops:\" title=\"Embarassed\" /><!-- s:oops: -->  (j\'aurai du y penser!!!) aucune sauvegarde du site n\'existait et je n\'ai pu récupérer aucun des anciens messages !!!\r\n\r\n[b:f3vjqlv5]C EST A  NOUS MAINTENANT QU IL APPARTIENT DE FAIRE RENAITRE CE FORUM ET DE MONTRER QUE CE N EST PAS CE GENRE DE TERRORISME QUI EMPECHERA LE DUB ET LES SOUNDS SYSTEM DE PROGRESSER !!![/b:f3vjqlv5]:thumb \r\n\r\nPerdu pour perdu : n\'ayant pu récupérer les messages, j\'ai préféré tout effacer et installer la dernière version logiciel du forum qui corrige un certain nombre de failles de sécurité. Du coup [b:f3vjqlv5]LES ANCIENS MEMBRES DOIVENT CE RE-ENGERISTRER...[/b:f3vjqlv5]\r\n\r\nRespect to All\r\nRed Lion', '', 0, 'QA==', 'f3vjqlv5', 1, 0, '', 2, 0, 0),(5, 3, 4, 3, 0, '82.225.50.160', 1135856969, 1, 0, 1, 1, 1, 1, '', 'DUB FACTORY RED LION SOUND meets IRATION STEPPAS 21/01/06', 'Salut à tous,\r\n\r\nUne grosse soirée Roots Dub &amp; Steppa en soutien au Festival du col des 1000 de l\'association L\'anamounto\r\n\r\nRED LION Sound  accueillent les géants de Leeds:\r\n\r\nIRATION STEPPAS pour une session 100% heavy weight bass....\r\n\r\nBeware!!!\r\n\r\nCa se passe le 21 Janvier à l\'ADAEP à Grenoble...Paf 10euro 22H&gt;&gt;5H\r\n+ d\'infos soon come,\r\nd\'ici là vous pouvez tjrs écouter des extraits de la soirée qui avait lieu à Chalon-s/Saone l\'année dernière:\r\n\r\n<!-- m --><a class=\"postlink\" href=\"http://dubnews.free.fr/iration/irationmix.html\">http://dubnews.free.fr/iration/irationmix.html</a><!-- m -->\r\n\r\na+steph\r\nLions\'Den', '', 0, 'QA==', '2vvambac', 1, 0, '', 3, 0, 0),(6, 2, 1, 5, 0, '172.206.42.240', 1135857292, 1, 0, 1, 1, 1, 1, '', '', 'Aller Hop au boulot !!!\r\n\r\nLion à raison, faut pas perdre espoir et surtout ne pas laisser tomber se forum sous pretexte qu\'il n\'y as plus d\'information, l\'information c\'est nous tous ! \r\n\r\nUnity Again !!! \r\n\r\nRespect To RedLion Crew\r\nBless\r\nBokson', '', 0, 'QA==', '185llc4j', 1, 0, '', 5, 0, 0),(7, 2, 1, 4, 0, '81.56.248.144', 1135857298, 1, 0, 1, 1, 1, 1, 0, '', '', 'misère.... sans deconner......\r\nfaut croire que ça occupe certains de faire chier les autres sans aucun interet....\r\nbon.......\r\nfaudrait pas en plus s\'énerver ni gueuler contre ce hacker, ça risquerait de lui faire plaisir......\r\n\r\nvoilà, je suis réenregistré\r\n\r\nrespects,\r\nmathieu', '', 0, 'QA==', '3ra8xkgy', 1, 0, '', 4, 0, 0),(8, 4, 11, 5, 0, '172.206.42.240', 1135857735, 1, 0, 1, 1, 1, 1, '', 'Relation Amplificateur - Enceintes', 'Irie \r\n\r\nVu qu\'on s\'est fait hacker je repose ma question ! \r\nComment calculer cette histoire d\'impédance ! \r\nSi on bridge l\'ampli, si on l\'utilise en stereo etc... \r\nEt je repose la question, j\'ai 2 enceinte bass reflex 750watts sous 8ohms\r\nmon amplis derrière 2x700 watts sous 8ohms (par exemple) si je le bridge et que j\'arrive a sortir 1x1400 watts que je balance sur 2 caissons vu que je l\'ai bridger il passe en 4ohms mon amplis, donc il faut que les bafles le suporte dérrière mais malheureusement dnas les carastéristique des baffles, il ne suporte pas une impédance de mois 4.75 ohms \r\n\r\nCOmment je fait tu peux expliquet un peu plus lion, se que tu avait commencer (avant le passage du hackers furieux) \r\nEn plus tu me l\'a déja expliquer mais j\'ai un pue zapper des trucs !!!\r\n\r\nThanks\r\nBokson', '', 0, 'QA==', '3bec5jss', 1, 0, '', 5, 0, 0),(9, 5, 3, 5, 0, '172.206.42.240', 1135857870, 1, 0, 1, 1, 1, 1, '', 'Pk l\'homme détruit !', 'Tena y Stellin \r\n\r\nUne question me traverse l\'esprit, je ne peux y répondre seul je crois car trop vaste peut être la réponse ! \r\n\r\nPourquoi les hommes détruise, se que l\'autre à crée ? \r\n\r\nJalousie, frustrations .... Je sais pas j\'arive pas a comprendre.\r\n\r\nBokson', '', 0, 'QA==', '34xwhk4b', 1, 0, '', 5, 0, 0),(10, 2, 1, 6, 0, '82.64.69.118', 1135859358, 1, 0, 1, 1, 1, 1, '', '', 'Bon, on repars à Zéro, c\'est pas une si mauvaise chose <!-- s:) --><img src=\"{SMILIES_PATH}/icon_smile.gif\" alt=\":)\" title=\"Smile\" /><!-- s:) -->\r\n\r\nBig Up !!\r\n\r\n\r\nNao\r\nGuidance,,,,', '', 0, 'QA==', '143421z7', 1, 0, '', 6, 0, 0),(11, 2, 1, 7, 0, '212.147.0.191', 1135861490, 1, 0, 1, 1, 1, 1, 0, '', '', 'Yes content de revoir le forum UP!  <!-- s:) --><img src=\"{SMILIES_PATH}/icon_smile.gif\" alt=\":)\" title=\"Smile\" /><!-- s:) --> \r\n\r\nLongue vie a ce forum très instructif ! \r\n\r\nEach one teach one !\r\n\r\nJ-M', '', 0, 'QA==', '3gohbqv1', 1, 0, '', 7, 0, 0),(12, 2, 1, 8, 0, '82.235.34.36', 1135864108, 1, 0, 1, 1, 1, 1, 0, '', 'ça roule!!', 'Content de voir que vous avez vite resolu le problem!\r\nRespect a toute la bande...\r\na bientot\r\nmanu', '', 0, 'QA==', '3oql1d2j', 1, 0, '', 8, 0, 0),(13, 6, 4, 8, 0, '82.235.34.36', 1135865115, 1, 0, 1, 1, 1, 1, 0, '', 'Dub Addict Sound meets Jr CONY &amp; SHANTI D. 3/02/06', 'Une semaine apres Red Lion et Iration, vous pouvez\r\nvous remettre une couche de bass au RAIL theatre à LYON..\r\non accueil JUNIOR CONY &amp; Shant D...\r\nBoudou et Roots massacre feront leur live, 19Dub a la selection\r\net Phil au chant.\r\nde 21h a 3 h pour 7Eureu\r\n\r\ntchao a tous...', '', 0, 'QA==', '1y0bfm7j', 1, 0, '', 8, 0, 0),(14, 7, 4, 9, 0, '83.156.49.183', 1135865763, 1, 0, 1, 1, 1, 1, '', 'BORDEAUX:Manasseh,Manutension,Iration Steppas &amp; Uzinadub', 'Le 4SANS a Bordeaux présente a partire de 22h 8) :\r\n\r\nLE 21 Janvier <!-- s:hola --><img src=\"{SMILIES_PATH}/fun_59.gif\" alt=\":hola\" title=\"hola\" /><!-- s:hola --> \r\n\r\nMANASSEH feat Brother Culture\r\nMANUTENSION feat MC Tablloyd\r\nCRYSTAL DISTORSION\r\n\r\npour 10euros\r\n\r\n\r\nLE 25 Fevrier <!-- s:hola --><img src=\"{SMILIES_PATH}/fun_59.gif\" alt=\":hola\" title=\"hola\" /><!-- s:hola --> \r\n\r\nIRATION STEPPAS\r\nUZINADUB\r\nGG PROJECT\r\nELISA DO BRASIL\r\n\r\nPour 10euros\r\n\r\nDonc 2 bonne soirées sur Bordeaux pour le début d année 2006 <!-- s:bravo --><img src=\"{SMILIES_PATH}/bravoo.gif\" alt=\":bravo\" title=\"bravo\" /><!-- s:bravo -->', '', 0, 'QA==', '319buiqc', 1, 0, '', 9, 0, 0),(15, 6, 4, 3, 0, '82.225.50.160', 1135865811, 1, 0, 1, 1, 1, 1, '', '', 'et le lendemain  DUB FACTORY N°2 le samedi 4 fevrier de 21H&gt;&gt;5H\r\n\r\n[b:2d4j075e][color=red:2d4j075e]RED LION SOUND feat Sis ilie Meets JAH FREE Feat GARY JAMES[/b:2d4j075e][/color:2d4j075e]\r\n\r\nPaf 10euro\r\nStand Disques UK Dub\r\na+steph', '', 0, 'Qg==', '2d4j075e', 1, 0, '', 3, 0, 0),(16, 6, 4, 9, 0, '83.156.49.183', 1135865981, 1, 0, 1, 1, 1, 1, '', '', 'Sa gère cette soirée avec JAH FREE et RED LION!!!!!!!!!!!! <!-- s:wink: --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\":wink:\" title=\"Wink\" /><!-- s:wink: -->', '', 0, 'Qg==', 'sirogssh', 1, 0, '', 9, 0, 0),(17, 4, 11, 2, 0, '82.225.50.160', 1135866119, 1, 0, 1, 1, 1, 1, 0, '', 'Série et parrallèle', 'Yes Bokson, on va régler cette histoire d?impédance :\r\n\r\nL?impédance étant la résistance (entre autre?) d?un circuit ou d?un composant, il faut te representer ton HP comme une résistance que l?on branche dans un circuit avec la sortie de l?amplis. C?est la totalité de la résistance de se circuit (avec une ou plusieurs résistance branchées entre elle) qui va déterminer la résistance SOUS LAQUELLE va fonctionnée ton amplis.\r\n\r\nPrenons l?exemple de ton amplis : \r\nCaractéristiques  techniques :\r\n750 watts sous 8ohms x 2 (2 canaux)\r\n1400 watts sous 8ohms x 1 (sortie bridgé)\r\n\r\nJe branche 1 HP de 750 watt sous 8 ohms sur un des 2 canaux (mode non bridgé) et tout va bien?\r\nJ?ajoute un 2e HP de 750/8. j?ai 2 solutions : \r\n\r\nSoit je branche le 2e HP sur le 2e canal de l?amplis et j?ai donc 2 HP de 750 W/ 8 Ohms branché sur 2 canaux de 700 W / 8 Ohms\r\n\r\nSoit je décide 	de mettre les 2 HP en série ou en parallèle :\r\n\r\n[b:1ms11ykd] En série :\nquand on branche plusieurs HP en série leur impédance Z d?additionnent[/b:1ms11ykd] ce qui donne : \r\n\r\n[b:1ms11ykd]Zt (sortie ampli) =  Z (hp1) + Z (hp2) + ?[/b:1ms11ykd]\r\n \r\nsoit pour notre exmple :\r\n8 Ohms +  8 Ohms =  16 Ohms \r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W = 1500 W sous 16 Ohms sur un seul canal (si on branche les 2 HP en série et sur un seul canal de l?amplis)\r\n\r\n[b:1ms11ykd] En parralèle :\nquand on branche plusieurs HP en parralèle l?inverse de leur impedance s?additionnent [/b:1ms11ykd] ce qui donnent :\r\n\r\n[b:1ms11ykd]1/Zt = 1/Z (hp1) + 1/Z (hp2) + ?[/b:1ms11ykd]\r\n\r\nsoit dans notre exemple :\r\n1/8 + 1/8 = 2/8  donc Zt= 8/2=4 Ohms\r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W = 1500 W sous 4 Ohms sur un seul canal \r\n(si on branche les 2 HP en parallèle et sur un seul canal de l?amplis)\r\n\r\n\r\nEt si [b:1ms11ykd]je decide de mettre 4 HP sur meme le canal (circuit)[/b:1ms11ykd] j?aurai :\r\n\r\n[b:1ms11ykd]Si tout les HP sont en série :\n\n8 Ohms +  8 Ohms + 8 Ohms +  8 Ohms = 32 Ohms[/b:1ms11ykd]\r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W + 750W + 750W = 3000 W sous 32 Ohms sur un seul canal\r\n \r\n[b:1ms11ykd]Si tout les HP sont en parralèle :\n1/Zt= 1/8+1/8+1/8+1/8= 4/8 Zt=8/4=2 Ohms[/b:1ms11ykd]\r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W + 750W + 750W = 3000 W sous 2 Ohms sur un seul canal\r\n\r\n[b:1ms11ykd]Si 2 x 2 HP couplé en serie sont montés en parralèle :\n1/Zt = 1/(8+8)+1/(8+8)=1/16+1/16= 2/16 Zt = 16/2=8 Ohms[/b:1ms11ykd]\r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W + 750W + 750W = 3000 W sous 8 Ohms sur un seul canal\r\n\r\n[b:1ms11ykd]Pour 2 x 2 HP couplé en parrallèle sont montés en série :\nZt=(1/(1/8+1/8))+(1/(1/8+1/8)=1/(2/8)+1/(2/8)=4+4=8 Ohms[/b:1ms11ykd]\r\n\r\ndonc dans ce cas pour fonctionner correctement ton amplis devra etre capable de fournir 750W + 750W + 750W + 750W = 3000 W sous 8 Ohms sur un seul canal\r\n\r\nPour le cas ou tu as 6 HP je te laisse faire le calcul.\r\n\r\nAprès au niveau te ton amplis tu n\'as aucun réglage a faire (c\'est comment tu vas brancher tes enceintes entre elles qui va faire que ton amplis tournera sous tel ou tel impedance) tu as juste a vérifié dans les spécifications techniques quelles sont les impedances qu\'il peut supporter (et pas la meme occasion quelle puissance il peut délivrer sous chaque impedance)...\r\n\r\nRespect\r\nRed Lion', '', 0, 'QA==', '1ms11ykd', 1, 1136464838, '', 2, 1, 0),(18, 8, 4, 3, 0, '82.225.50.160', 1135866440, 1, 0, 1, 1, 1, 1, '', 'DUB FACTORY 2: RED LION SOUND Meets JAH FREE feat GARY JAMES', '[b:79akxjmn][size=150:79akxjmn]DUB FACTORY N°2 le samedi 4 fevrier de 21H&gt;&gt;5H[/size:79akxjmn][/b:79akxjmn]\r\n\r\n<!-- s:hola --><img src=\"{SMILIES_PATH}/fun_59.gif\" alt=\":hola\" title=\"hola\" /><!-- s:hola --> <!-- s:hola --><img src=\"{SMILIES_PATH}/fun_59.gif\" alt=\":hola\" title=\"hola\" /><!-- s:hola --> <!-- s:hola --><img src=\"{SMILIES_PATH}/fun_59.gif\" alt=\":hola\" title=\"hola\" /><!-- s:hola -->\r\n[b:79akxjmn][color=red:79akxjmn][size=167:79akxjmn]RED LION SOUND feat

...
...
2개의 좋아요

최근에 제가 수행한 vBulletin 가져오기에서 각 게시글의 인코딩이 서로 다른 것 같았습니다. 여러 인코딩 변환을 시도하는 코드를 작성해 보았습니다.

1개의 좋아요