phpMyFAQの業務導入顛末記（その２）～データ移行編（前編）～

:::note warn
2023/05/20 本記事投稿後に、Accessを用いたより効率的なデータ移行方法を見出したため、本記事はあくまでアーカイブ的な位置づけになります。
:::
前回は、筆者の職場のCentOSサーバーにphpMyFAQがインストール完了したところまで書きました。
ただ残念ながら、phpMyFAQの内部構造に関する**日本語／英語の情報はほとんどない**ので、
　実際に画面からデータを入力　⇒　どのテーブルにどうデータに格納されるかを確認・・・
という地道な調査にもとづき、何とかデータ移行完了した顛末（前編）です。
***
インストールしたphpMyFAQを職場内の情報共有プラットフォームとするためには、とりあえず記入例を兼ねた賑やかしのデータが必要になります。

もともと筆者の職場では、簡単な掲示板ツールで作業内容などを記入してきたので、とりあえずテキストベースのデータは存在します。
そこで、それらのデータを次のようなレイアウトのExcelシートに整理してもらうことにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170624/1a4bf723-8b30-a194-0d64-4f83ed4dd2ce.png)

ところで、phpMyFAQが使うMariaDBのデータベースには、全部で41個もの（!!）テーブルが作成されています。
ただし、この中で大元のFAQデータ本体を使うには、とりあえず
・faqdata：投稿記事の本文
・faqdata_user：投稿した記事と投稿ユーザーとの紐付け
の２つのデータがあれば十分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170624/a7546c24-468b-d329-17e0-e6d1cdea40c1.png)
Exceシートに整理してもらった内容をもとに、ExcelVBAでこれらテーブルに対する移行データを作成します。

**faqdataのレイアウト**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170624/7dde2029-3fd2-a67d-dfa9-386b7010d705.png)
**faqdata_userのレイアウト**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170624/d1a6adf5-31e5-0db2-5978-fd26d751a87d.png)

:::note info
筆者の例では、投稿方法に"WYSIWYG"エディタを設定しているため、本文データにHTMLタグを付与しています。
設定によってはテキストベースでデータ共有もできますが、その場合はタグ装飾は不要です。
:::


```VB:faqdataテーブルへの移行データ作成
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のインポート機能でインポートします。