文字

SQLite3

  • 简介
  • 安装/配置
    • 需求
    • 安装
    • 运行时配置
    • 资源类型
  • 预定义常量
  • SQLite3 — SQLite3 类
    • SQLite3::busyTimeout — Sets the busy connection handler
    • SQLite3::changes — Returns the number of database rows that were changed (or inserted or deleted) by the most recent SQL statement
    • SQLite3::close — Closes the database connection
    • SQLite3::__construct — Instantiates an SQLite3 object and opens an SQLite 3 database
    • SQLite3::createAggregate — Registers a PHP function for use as an SQL aggregate function
    • SQLite3::createCollation — Registers a PHP function for use as an SQL collating function
    • SQLite3::createFunction — Registers a PHP function for use as an SQL scalar function
    • SQLite3::escapeString — Returns a string that has been properly escaped
    • SQLite3::exec — Executes a result-less query against a given database
    • SQLite3::lastErrorCode — Returns the numeric result code of the most recent failed SQLite request
    • SQLite3::lastErrorMsg — Returns English text describing the most recent failed SQLite request
    • SQLite3::lastInsertRowID — Returns the row ID of the most recent INSERT into the database
    • SQLite3::loadExtension — Attempts to load an SQLite extension library
    • SQLite3::open — Opens an SQLite database
    • SQLite3::prepare — Prepares an SQL statement for execution
    • SQLite3::query — Executes an SQL query
    • SQLite3::querySingle — Executes a query and returns a single result
    • SQLite3::version — Returns the SQLite3 library version as a string constant and as a number
  • SQLite3Stmt — SQLite3Stmt 类
    • SQLite3Stmt::bindParam — Binds a parameter to a statement variable
    • SQLite3Stmt::bindValue — Binds the value of a parameter to a statement variable
    • SQLite3Stmt::clear — Clears all current bound parameters
    • SQLite3Stmt::close — Closes the prepared statement
    • SQLite3Stmt::execute — Executes a prepared statement and returns a result set object
    • SQLite3Stmt::paramCount — Returns the number of parameters within the prepared statement
    • SQLite3Stmt::reset — Resets the prepared statement
  • SQLite3Result — SQLite3Result 类
    • SQLite3Result::columnName — Returns the name of the nth column
    • SQLite3Result::columnType — Returns the type of the nth column
    • SQLite3Result::fetchArray — Fetches a result row as an associative or numerically indexed array or both
    • SQLite3Result::finalize — Closes the result set
    • SQLite3Result::numColumns — Returns the number of columns in the result set
    • SQLite3Result::reset — Resets the result set back to the first row

用户评论:

[#1] bohwaz [2014-04-21 00:47:00]

Another undocumented feature of the PHP SQLite3 object, available since 2009 is openBlob. Basically it's a function that will return a stream pointer to a blob value in a table. Very very useful when you are dealing with files stored in a SQLite3 database.

Source code says:

proto resource SQLite3::openBlob(string table, string column, int rowid [, string dbname])
Open a blob as a stream which we can read / write to.

But despite that it's not possible to write to the blob, only to read (the write method is empty in the extension source code: it won't return any error but no change will be recorded).

One example of use:

<?php

$db 
= new SQLite3('files.sqlite');
$db->exec('CREATE TABLE files (id INTEGER PRIMARY KEY, filename TEXT, content BLOB);');

$statement $db->prepare('INSERT INTO files (filename, content) VALUES (?, ?);');
$statement->bindValue('filename''Archive.zip');
$statement->bindValue('content'file_get_contents('Archive.zip'));
$statement->execute();

$fp $db->openBlob('files''content'$id);

while (!
feof($fp))
{
    echo 
fgets($fp);
}

fclose($fp);

?>


You can also seek in the stream. This is pretty useful for saving large files from the database too, this way you can use stream_copy_to_stream, it will be faster and more memory-efficient than dumping the file in memory before writing it to the disk.

Please note that openBlob() won't work on VIRTUAL FTS4 compressed tables.

[#2] bohwaz [2013-09-05 04:10:45]

As reported here: https://bugs.php.net/bug.php?id=65216 there are two undocumented and useful methods available:

SQLite3::createCollation(collation name, callback function) appeared in PHP 5.3.11 and allows to define a custom collation method.

SQLite3Stmt::readOnly(void) appeared in PHP 5.3.5 and returns true if a statement doesn't write in the database.

See the documentation pages on the corresponding classes for my comments showing example use of those methods.

[#3] Anonymous [2011-12-06 00:56:46]

As of PHP 5.4 support for Sqlite2 has been removed. I have a large web app that was built with sqlite2 as the database backend and thus it exploded when I updated PHP. If you're in a similar situation I've written a few wrapper functions that will allow your app to work whilst you convert the code to sqlite3. 

Firstly convert your DB to an sqlite3 db. 

sqlite OLD.DB .dump | sqlite3 NEW.DB

Then add the following functions to your app:

<?php
function sqlite_open($location,$mode)
{
    
$handle = new SQLite3($location);
    return 
$handle;
}
function 
sqlite_query($dbhandle,$query)
{
    
$array['dbhandle'] = $dbhandle;
    
$array['query'] = $query;
    
$result $dbhandle->query($query);
    return 
$result;
}
function 
sqlite_fetch_array(&$result,$type)
{
    
#Get Columns
    
$i 0;
    while (
$result->columnName($i))
    {
        
$columns[ ] = $result->columnName($i);
        
$i++;
    }
    
    
$resx $result->fetchArray(SQLITE3_ASSOC);
    return 
$resx;
}
?>


They're not perfect by any stretch but they seem to be working ok as a temporary measure while I convert the site. 
Hope that helps someone

[#4] alan at chandlerfamily dot org dot uk [2010-08-09 01:36:53]

PHP 5.3.3 introduced sqlite3::busyTimeout(int milliseconds) which does not currently seem to be documented.

It believe it acts like sqlite::busyTimeout - that is it tells sqlite3 to call an internal busyHandler if SQLITE_BUSY is returned from any call which waits a short period and then retries.  It continues to do this until milliseconds milliseconds have elapsed and then returns the SQLITE_BUSY status.

I don't know whether the default 60 second value is in place if this function is not called.

上一篇: 下一篇: