2023/05/20 本記事投稿後に、Accessを用いたより効率的なデータ移行方法を見出したため、本記事はあくまでアーカイブ的な位置づけになります。
前回は、筆者の職場のCentOSサーバーにphpMyFAQがインストール完了したところまで書きました。
ただ残念ながら、phpMyFAQの内部構造に関する日本語/英語の情報はほとんどないので、
実際に画面からデータを入力 ⇒ どのテーブルにどうデータに格納されるかを確認・・・
という地道な調査にもとづき、何とかデータ移行完了した顛末(前編)です。
インストールしたphpMyFAQを職場内の情報共有プラットフォームとするためには、とりあえず記入例を兼ねた賑やかしのデータが必要になります。
もともと筆者の職場では、簡単な掲示板ツールで作業内容などを記入してきたので、とりあえずテキストベースのデータは存在します。
そこで、それらのデータを次のようなレイアウトのExcelシートに整理してもらうことにしました。
ところで、phpMyFAQが使うMariaDBのデータベースには、全部で41個もの(!!)テーブルが作成されています。
ただし、この中で大元のFAQデータ本体を使うには、とりあえず
・faqdata:投稿記事の本文
・faqdata_user:投稿した記事と投稿ユーザーとの紐付け
の2つのデータがあれば十分です。
Exceシートに整理してもらった内容をもとに、ExcelVBAでこれらテーブルに対する移行データを作成します。
faqdataのレイアウト
faqdata_userのレイアウト
筆者の例では、投稿方法に"WYSIWYG"エディタを設定しているため、本文データにHTMLタグを付与しています。
設定によってはテキストベースでデータ共有もできますが、その場合はタグ装飾は不要です。
Option Explicit
Public Sub sPb_移行データ作成( )
Dim sh1 As WorkSheet, sh2 As WorkSheet, sh3 As WorkSheet
Dim i As Long, j As Long, k As Long, contents As String
Dim dbdata1(1 To 19) As Variant, dbdata2(1 To 2) As Variant
Const cPr_開始ID = -1
i = 2
j = 1
k = 1
Set sh1 = ThisWorkbook.Sheets("faqdata_org") ' 移行元データの入ったシート
Set sh2 = ThisWorkbook.Sheets("faqdata") ' faqdataの移行データ
Set sh3 = ThisWorkbook.Sheets("faqdata_user") ' faqdata_userの移行データ
Application.ScreenUpdating = False
Application.Caluculation = xlCalculationManual
With sh1
Do While (Not IsEmpty(.Cells(i, 1)))
If IsEmpty(.Cells(i, 2)) Then GoTo NextRec
’ ***** faqdata用インポートデータ *****
dbdata1(1) = cPr_開始ID + i ' ID:連番
dbdata1(2) = "ja" ' 言語:"ja"固定
dbdata1(3) = 1000 + cPr_開始ID + i ' ユーザー指定のID:1000~の連番
dbdata1(4) = 0 ' リビジョンNo:0固定
dbdata1(5) = "yes" ' 有効フラグ
dbdata1(6) = 0 ' ?
dbdata1(7) = "" ' キーワード
dbdata1(8) = Replace(.Cells(i, 1), ",", "、") ' タイトル:カンマを置換
contents = Replace(.Cells(i, 2), ",", "、") ' 本文:カンマを置換後、HTMLタグを付与して設定
contents = Replace(contents, vbLf, "<br />")
contents = "<!DOCTYPE html>" ' vbLf & "<html>" & vbLf & "<head>" & vbLf & "</head>" & vbLf & "<body>" &vbLf & contents & "</body>" & vbLf & "</html>"
dbdata1(9) = contents
dbdata1(10) = .Cells(i, 4) ' 投稿者
dbdata1(11) = .Cells(i, 5) ' メールアドレス
dbdata1(12) = "y" ' コメント受付可否
dbdata1(13) = Format$(Now(), "yyyymmddhhmmss") ' 更新日時
dbdata1(14) = "" ' ?
dbdata1(15) = 0 ' ?
dbdata1(16) = "00000000000000" ' 公開開始日時:固定値
dbdata1(17) = "99991231235959" ' 公開終了日時:固定値
dbdata1(18) = Format$(Now(), "yyyy/mm/dd hh:mm:ss")' 作成日時
dbdata1(19) = .Cells(i, 6) ' 編集者備考
sh2.Range("A" & j & ":S" & j) = dbdata1 ' シートに一括転送
j = j + 1
' ***** faqdata_user用インポートデータ *****
dbdata2(1) = cPri_開始ID + i
dbdata2(2) = -1
sh3.Range("A" & k & ":B" & k) = dbdata2
k = k + 1
NextRec:
i = i + 1
Loop
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "データ変換処理が完了しました", vbInformation, "お知らせ"
End Sub
上記VBAで作ったワークシートの内容をコピー⇒エディタに貼りつけし、Tab⇒","に置換したものを、phpMyAdminのインポート機能でインポートします。