如果您在嘗試寫入 sqlite 資料庫時收到錯誤(更新、刪除、丟棄)
警告:PDO::query() [function.query]: SQLSTATE[HY000]: 一般錯誤:1 無法開啟資料庫
存放資料庫檔案的資料夾必須具有寫入權限。
PDO_SQLITE 是一個驅動程式,它實作了 PHP 資料物件 (PDO) 介面 以啟用對 SQLite 3 資料庫的存取。
注意:
PDO_SQLITE 允許除了串流之外,還可以使用字串搭配
PDO::PARAM_LOB
。
PDO_SQLITE PDO 驅動程式預設為啟用。要停用,可以使用 --without-pdo-sqlite[=DIR],其中可選的 [=DIR]
是 sqlite 的基本安裝目錄。從 PHP 7.4.0 開始,需要 » libsqlite ≥ 3.5.0。以前,如果省略了 [=DIR]
,則可以使用內建的 libsqlite,並且是預設值。
注意:從 PHP 7.4.0 開始,Windows 上需要額外設定
要讓此擴充功能運作,必須讓 Windows 系統的 PATH 環境變數包含必要的 DLL 檔案。關於如何設定,請參閱標題為「如何在 Windows 上將我的 PHP 目錄新增到 PATH 環境變數」的 FAQ。雖然將 DLL 檔案從 PHP 資料夾複製到 Windows 系統目錄也可以運作(因為系統目錄預設包含在系統的 PATH 中),但不建議這樣做。此擴充功能需要下列檔案位於 PATH 中: libsqlite3.dll。
如果您在嘗試寫入 sqlite 資料庫時收到錯誤(更新、刪除、丟棄)
警告:PDO::query() [function.query]: SQLSTATE[HY000]: 一般錯誤:1 無法開啟資料庫
存放資料庫檔案的資料夾必須具有寫入權限。
與其編譯舊版 SQLite 來建立使用 PDO 捆綁的 SQLite 版本可以處理的舊資料庫格式的資料庫,不如(更容易地)在建立資料庫**之前**執行查詢「PRAGMA legacy_file_format = TRUE;」(如果您有現有的資料庫,請在您的資料庫上從 sqlite shell 執行「.dump」,在新資料庫上執行 sqlite shell,執行 PRAGMA,然後貼上 .dump 的內容)。這將確保 SQLite 建立的資料庫可由 SQLite 3.0 和更高版本讀取。
使用 PDO SQLite 驅動程式,在包含多個 ? 的 SQL 中進行計算可能無法獲得預期的結果。
<?php
// ....
$stmt = $PDO->prepare('SELECT * FROM `X` WHERE `TimeUpdated`+?>?');
$stmt->execute([3600, time()]);
$data = $stmt->fetchAll();
print_r($data);
?>
要獲得正確的結果,您有超過 3 種解決方案。
1. 將 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?' 改為 'SELECT * FROM `X` WHERE `TimeUpdated`>?' 並使用 PHP 進行計算 (例如: $stmt->execute([time()-3600]); )。
2. 使用 PdoStatement::bindParam 或 PdoStatement::bindValue,並將參數類型設定為 PDO::PARAM_INT。
3. 將 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?' 改為 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?+0',這裡 '?+0' 可以替換為其他數學函數或其他計算,例如 'abs(?)',您甚至可以將兩個 ? 都用數學計算包裝起來。
請注意,截至本文發佈之日,PDO_SQLITE 無法與使用當前版本 SQLite 控制台應用程式 sqlite-3.3.6 建立的資料庫檔案互動。
目前必須取得 3.2.8 版,可從 http://www.sqlite.org/ 取得,但只能透過手動輸入 URI 的方式,因為沒有連結。請前往 http://www.sqlite.org/download.html 找到您要尋找的版本的 URI,然後進行適當的版本號碼替換。