PDO SQLite 无法更新记录:"database is locked"



我整天都在为此苦苦挣扎。我读过很多帖子,尝试了所有建议,但没有任何效果。

这是我的PHP代码:

try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $db->query('SELECT * FROM v_test');
foreach ($result as $row) {
  echo $row['column1'] . " | " . $row['column2'] . "<br>";
  /**************************************
  * Update table                        *
  **************************************/
  if (!$db->exec("update test set column2 = date('now') where column1 ='" . $row['column1'] . "';") === TRUE) {
    echo "Cannot update date:" . $db->lastErrorMsg();
    $db = null;
    exit;
  } 
}
/**************************************
* Close db connections                *
**************************************/
$db = null;
}
catch(PDOException $e) {
  echo "PDOException: " . $e->getMessage() . "<br>";
  /*** show the error info ***/
  foreach($db->errorInfo() as $error)
  {
    echo $error.'<br />';
  }
  $db = null;  
}

我运行 PHP v5.3.3。仅通过选择后的循环,我就可以从表中获取正确的值,因此我可以访问与脚本位于同一文件夹中的数据库。文件夹有 0777 权限,数据库和脚本都有 0660,但我也尝试过 0777。但是当我尝试更新记录时,出现"数据库已锁定"错误。

我以前在不同的服务器上使用相同的数据库,但不是在 PDO 中使用,而是使用 $db = new SQLite3('mailing.db', SQLITE3_OPEN_READWRITE); 我不能使用相同的脚本,因为新服务器上未启用 SQLITE,但PDO_SQLITE已启用。

我的phpinfo() 说:

  • PDO驱动程序mysql,odbc,pgsql,sqlite
  • pdo_sqlite。PDO驱动程序为SQLite 3.x启用SQLite库3.3.6
  • '-
  • -without-sqlite'
  • '-
  • -without-sqlite3'

当然,我尝试先在新服务器上启用SQLite,以便我可以使用原始脚本。但是因为我不是系统工程师(只是一个开发人员;)),我希望我可以使用PDO选项。

我的问题与我的 PHP 配置有关还是我的脚本错误?

下面是一种处理查询的方法的缩短版本,以便每次运行查询时关闭连接,从而释放SQLite以进行下一个查询:

define("DBC", "sqlite:database_name.db");
/*
 * dataQuery($query) - one argument (required), a query string
 * generic query function where the query must be specified in source where data is required e.g,
 *
 *      $getFoo = "SELECT `foo` FROM `bar` ORDER BY `glorp`";
 *      $results = dataQuery($getFoo);
 *
 * All functions forming a query utilize this single function to return the results of their queries. The database
 * connection is instantiated and then destroyed (when the script completes) within this function.
 */
function dataQuery($query)
{
    // establish database connection
    try
    {
        $db = new PDO(DBC);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
        $errorMsg = $e->getMessage();
        return $errorMsg;
    }
    // try to run query
    try
    {
        $queryResults = $db->query($query);
        if($queryResults != null)
        {
            $results = $queryResults->fetchAll(PDO::FETCH_OBJ); // return an object, you can return an array
            $queryResults = NULL; // closes the connection
            return $results;
        }
    }
    catch(PDOException $e)
    {
        $errorMsg = $e->getMessage();
        return $errorMsg;
    }
}

完成此操作后,我们现在可以执行查询 -

$query = "SELECT `foo` FROM `bar`";
$results = dataQuery($query);

我们可以遍历结果,并向数据库发送一些更新或我们需要做的任何事情。每次返回结果后,都会立即清理连接(将其设置为 NULL)。

最显着的好处是,连接到数据库并从中返回数据独立于查询本身,使代码更加模块化和灵活。

相关内容

最新更新