移轉 SQLite3 的 db for PHP

 

本以為 SQLite3 的 db 只有一個檔案,應該比 MySQL 之類的 database 方便備份/還原跟移轉,尤其是,指令是可以查詢到 table 清單,也可以顯示內容

# sqlite3 /tmp/test3.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
company  fight    hero     players <-- 可以查到 table 清單
sqlite> .quit

也可以查詢到 table 內的資料

# sqlite3 /tmp/test3.db SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from hero; <-- 可以查到 table 的內容 1|艾吉奧|1|0|1|||2|1|0|1 2|巫妖|1|1|2|||3|0|0|0 3|小小|1|0|1|||1|0|0|1

...以下省略...

另外單獨安裝了一台 RHEL 6.5 的虛擬機

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.5 (Santiago)

RPM套件也都安裝了

# rpm -qa | grep httpd
httpd-2.2.15-29.el6_4.x86_64
httpd-tools-2.2.15-29.el6_4.x86_64

# rpm -qa | grep php
php-mysql-5.3.3-26.el6.x86_64
php-5.3.3-26.el6.x86_64
php-cli-5.3.3-26.el6.x86_64
php-common-5.3.3-26.el6.x86_64
php-pdo-5.3.3-26.el6.x86_64

連不相干的 MySQL 都安裝了

# rpm -qa | grep mysql
php-mysql-5.3.3-26.el6.x86_64
mysql-5.1.71-1.el6.x86_64
mysql-libs-5.1.71-1.el6.x86_64
mysql-server-5.1.71-1.el6.x86_64
mysql-devel-5.1.71-1.el6.x86_64

Apache 服務已經啟動

# service httpd status
httpd(pid  2248)正在執行...

# chkconfig httpd --list
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

 

防火牆規則全部都清除

# iptables -t filter -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

phpinfo 也都正常

# cat /var/www/html/phpinfo.php

image

但是,一但用 PHP 去開 SQLite3 的 db,就會出現無法開啟的錯誤訊息

# cat /var/www/html/test3.php
open("/tmp/test3.db");
      }
   }
   $db = new MyDB();
   //$db = new SQLite3('/tmp/test3.db');
   if(!$db)
     {
       echo $db->lastErrorMsg();
     }
   else
     {
      echo "Opened database successfully";
     }
?>

image

剛剛可以用指令查詢資料,內容沒問題,考慮到權限的問題,將檔案放到 /tmp,權限設定為 666

# ls -l /tmp/test3.db
-rw-rw-rw-. 1 apache apache 131072 Jul 31 15:57 /tmp/test3.db

所以,也不應該是權限的問題…

到這裡就卡關卡很久了…

一直到有一天,突發奇想的,將資料匯出再匯入

先匯出成 SQL 語法

# sqlite3 /tmp/test3.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .output /tmp/test3.sql
sqlite> .dump
sqlite> .exit
# ls -l /tmp/test3*
-rw-rw-rw-. 1 apache apache 131072 Jul 31 15:57 /tmp/test3.db
-rw-r--r--. 1 root   root   154192 Aug  8 14:05 /tmp/test3.sql

先用 PHP,Open 一個 SQLite 的 db

# cat /var/www/html/test5.php
open("/tmp/test5.db");
      }
   }
   $db = new MyDB();
   if(!$db)
     {
       echo $db->lastErrorMsg();
     }
   else
     {
      echo "Opened database successfully";
     }
?>

 

原本沒有 /tmp/test5.db,PHP會自己建一個新的 db

image

 

再用 SQL 語法,import 回去

# sqlite3 /tmp/test5.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .read /tmp/test3.sql
sqlite> .quit
# ls -l /tmp/test5.db
-rw-r--r--. 1 apache apache 130048 Aug  8 14:08 /tmp/test5.db

 

如此一來,就大功告成,無論是 sqlite3 指令,或是 PHP 網頁程式,都可以正常存取 SQLite3 db 的內容了!

本篇發表於 CentOS 6, CentOS 7, CentOS 8, Linux, MySQL, RHEL 6, RHEL 7, RHEL 8。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s