首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux 應用整合 MySQL 資料庫存取技巧全解析

     編輯:MySQL 資料庫相關知識

前言:為什麼需要獨立資料庫?

Web 伺服器必須讓處理腳本能夠儲存狀態資訊,以便日後存取。雖然可以用原始方式(如寫入文字檔或自製迷你資料庫),但成熟的資料庫系統才能提供複雜 Web 應用(電子商務等)所需的完整服務。既然有免費軟體包可用,開發自製資料庫引擎得不償失,採用第三方資料庫更能讓開發者專注於應用邏輯,而非資料庫維護。

MySQL 資料庫簡介

MySQL 是快速、多線程、全功能的 SQL 伺服器,支援 ANSI 與 ODBC 標準,並在第三方擴充下提供事務安全表。它採用客戶端/伺服器架構:單一 mysqld 伺服器管理多個資料庫,每個資料庫包含任意數量的表格,表格由帶型別的欄位組成(整數、實數、字串、二進位流等)。

MySQL 易於整合進 Linux 應用,無論用腳本語言(Tcl、Perl、PHP)或編譯語言(C/C++)皆可,因為大多數腳本語言底層以 C 實現,且已有現成的 MySQL C API 封裝。

MySQL API 運作模式

API 採連線導向模式:

  1. 客戶端以帳號密碼向伺服器驗證並建立連線。
  2. 選擇目標資料庫。
  3. 執行 SQL 命令(DDL/DML)或查詢(回傳結果集)。
  4. 逐行擷取結果集,處理完畢後關閉連線。

在 CGI 應用中,Web 伺服器啟動腳本,腳本輸出 HTML 並可穿插資料庫操作,實現動態網頁。

程式碼範例:Tcl 與 C++ 查詢產品資料

Tcl 範例(使用 Tcl Generic Database Interface)

# 載入 SQL 共享庫
load /home/aroetter/tcl-sql/sql.so

# 連線參數
set DBNAME "clientWebSite"
set TBLNAME "products"
set DBHOST "backend.company.com"
set DBUSER "MySQLuser"
set DBPASSWD "abigsecret"
set targetPrice 200

# 連線並選擇資料庫
set handle [sql connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME

# 執行查詢
sql query $handle "select * from $TBLNAME where price <= $targetPrice"

# 輸出 HTML 表格標頭
puts ""
puts ""

# 逐行輸出結果
while {[set row [sql fetchrow $handle]] != ""} {
    set prodid [lindex $row 0]
    set descrip [lindex $row 1]
    set price [lindex $row 2]
    puts ""
}
puts "
Product IdDescriptionPrice (\$)
$prodid$descrip$price
" # 清理 sql endquery $handle sql disconnect $handle

C++ 範例(使用 MySQL++ 官方 API)

#include 
#include 
#include 

const char *DBNAME = "clientWebSite";
const char *DBTABLE = "products";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "MySQLuser";
const char *DBPASSWD = "abigsecret";

int main() {
    try {
        Connection con(DBNAME, DBHOST, DBUSER, DBPASSWD);
        Query query = con.query();
        query << "select * from " << DBTABLE;
        Result res = query.store();

        std::cout << "\n";
        std::cout << "\n";

        for (Result::iterator cur = res.begin(); cur != res.end(); ++cur) {
            Row row = *cur;
            std::cout << "\n";
        }
        std::cout << "
Product IdDescriptionPrice ($)
" << row[0] << "" << row[1] << "" << row[2] << "
" << std::endl; } catch (BadQuery er) { std::cerr << "Error: " << er.error << std::endl; return -1; } catch (BadConversion er) { std::cerr << "Error: Can't convert \"" << er.data << "\" to a \"" << er.type_name << "\"." << std::endl; return -1; } return 0; }

編譯語言執行效率較高,建議將核心資料庫邏輯以 C/C++ 實作,再由腳本或 Web 伺服器呼叫。

安全性考量

  • 權限管理: MySQL 依用戶名、客戶端主機、目標資料庫授權。遵循最小權限原則,避免給予不必要的特權(如 PROCESS 權限可窺探其他用戶操作)。以無特權 Unix 用戶運行 mysqld,限制潛在入侵影響範圍。
  • 防止 DNS 欺騙: 在授權表使用 IP 位址或啟用反向 DNS 解析驗證。
  • 加密傳輸: 密碼登入階段已加密,但後續 SQL 命令為明文。生產環境建議使用 SSH 通道轉發(Port Forwarding)加密所有通訊,或將資料庫與 Web 伺服器置於同一機器,透過 Unix Socket 通訊並禁用遠程連線。

結語

資料庫驅動網站能提供動態、即時更新的資訊,並支援跨會話的狀態持久化。利用免費開源的 MySQL,配合適當的安全設定,即可低成本構建穩健的電子商務或動態網站後端。

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved