PDO SQLite无法更新记录:“数据库被锁定”

时间:2014-12-29 20:36:47

标签: php sqlite pdo

我整天都在苦苦挣扎。我阅读了很多帖子,尝试了所有建议,但没有任何作用。

这是我的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。 SQLite 3.x的PDO驱动程序启用了SQLite Library 3.3.6
  • ' - without-sqlite'
  • ' - 无-sqlite3的'

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

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

1 个答案:

答案 0 :(得分:3)

以下是处理查询的一种方法的缩短版本,以便每次运行查询时关闭连接,释放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)。

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