Back-End

1 fev, 2007

PHP5 e SQLite no Windows

Publicidade

Olá Pessoal! Essa semana falarei sobre uma novidade do PHP5: o SQLite. Uma biblioteca C que implementa um banco de dados SQL embutido, sem que haja a necessidade de ter um SGDB, como MySQL e Oracle. A biblioteca lê e grava diretamente em arquivos de banco de dados no disco. Essa é uma boa alternativa para quem precisa de velocidade e não necessita de todos os recursos oferecidos pelos SGDB’s.

Versões utilizadas:

  • PHP 5.2.0
  • Apache 2.0.59
  • SQLite 2.8.17 ou SQLite 3.3.12
  • Windows XP

Características:

  • Software Livre e Multiplataforma;
  • O Banco de dados é guardado em um único arquivo;
  • Suporta base de dados acima de 2 terabytes;
  • Suporta Strings e Blob’s acima de 2 gigabytes;
  • Implementa a maioria do SQL92;
  • Sem dependências externas;
  • Suporte parcial a triggers e views;
  • Suporta vários processos de leitura ao mesmo tempo, porém, as operações de escrita são realizadas 1 a 1. Para isso, a engine loca o arquivo db.
  • Ainda não possui suporte a integridade referencial;

Trabalhando com SQLite e PHP

Apresentaremos 03 maneiras de trabalhar com o SQLite e PHP:

  • SQLite 2;
  • SQLite 2 Orientado a Objeto;
  • SQLite 3 com PDO;

PDO

PHP Data Objects é uma extensão que vem junto com o PHP5 que propõe aos desenvolvedores não mais utilizarem o acesso direto a API de controle da base de dados, seria a famosa abstração como o PEAR::DB. Resumindo, poderíamos mudar o banco de dados do nosso sistema apenas alterando uma única linha de código.

Instalação no Windows:

SQLite2

  • Acessar o endereço: http://www.sqlite.org/download.html e baixar o arquivo sqlite-2_8_17.zip;
  • Descompactar e copiar o arquivo sqlite.exe para a pasta WINNT do seu Windows( XP, 2000 etc..);

Configurando PHP com SQLite2

  • Editar o php.ini e descomentar/adicionar as seguintes linhas:

extension=php_pdo.dll|

extension=php_sqlite.dll

  • Crie um arquivo chamado phpinfo.php para checarmos se as extensões foram carregadas corretamente:

phpinfo.php

<?
phpinfo();
?>

Exemplos utilizando PHP e SQLite2:

sqlite2.php

<?
//caso a base de dados não exista, ele tenta criar
if ($db = sqlite_open("c:/pagina/databases/imasters.db", 0666, $error)) {
echo "Banco de dados aberto...";

//cria a tabela
@sqlite_query($db, "CREATE TABLE colunistas( id INTEGER PRIMARY KEY, nome TEXT)");

//insere dados
sqlite_query($db, "INSERT INTO colunistas VALUES( NULL, 'Júlio César Martini')");

//exibe os dados cadastrados
$sql = sqlite_query($db, "SELECT id, nome FROM colunistas");

//visualiza os dados gravados
while ($i = sqlite_fetch_array($sql)) {
echo "<br><br>";
echo "ID: ".$i['id']."<br>";
echo "Nome: ".$i['nome'];
}//fecha while
}
else {
die($error);
}
?>

Exemplos utilizando PHP e SQLite2 Orientado a Objeto:

sqlite2_oo.php

<?
try {
//instancia
$db = new SQLiteDatabase("c:/pagina/databases/imasters.db", 0666);
}
catch( Exception $exception ){
die($exception->getMessage());
}

//cria a tabela
//comentar as 02 linhas abaixo após executar o script pela primeira vez
$sqlC = "CREATE TABLE colunistas(id INTEGER PRIMARY KEY, nome TEXT)";
$db->queryExec($sqlC);

//insere dados
$sqlI = "INSERT INTO colunistas (id, nome) VALUES (NULL, 'Júlio César Martini')";
$db->queryExec($sqlI);

//visualiza
foreach ($db->query("SELECT id, nome FROM colunistas") as $row) {
print_r($row);
echo "<br>";
}
?>

Exemplos utilizando PHP e SQLite3 com PDO:

sqlite3_pdo.php

<?
//instância
$db = new PDO("sqlite:c:/pagina/databases/imasters.db");

//cria a tabela
$sqlC = "CREATE TABLE colunistas ( id INTEGER PRIMARY KEY, nome TEXT)";
$db->exec($sqlC);

//insere os dados
$sqlI = "INSERT INTO colunistas (id, nome) VALUES (NULL, 'Júlio César Martini')";
$stmt = $db->exec($sqlI);

//visualiza
foreach ($db->query("SELECT id, nome FROM colunistas") as $row) {
print_r($row);
echo "<br>";
}
?>

Criando uma trigger com o SQLite3

A trigger é disparada implicitamente quando uma tabela é modificada, um objeto é criado ou quando ocorre ações de usuário no sistema. O exemplo abaixo, cria uma trigger que terá por finalidade gravar o valor antigo do campo nome da tabela colunista sempre que ela for alterada.

01. No prompt, digite sqlite3 <>;

02. Crie a tabela HIST_COLUNISTAS;

CREATE TABLE hist_colunistas(
id INTEGER
, nome_antigo TEXT
, nome_novo TEXT);

03. Crie a trigger: tr_af_up_colunistas:

CREATE TRIGGER tr_af_up_colunistas
AFTER UPDATE ON colunistas
FOR EACH ROW
BEGIN
INSERT INTO hist_colunistas(id, nome_antigo, nome_novo)
VALUES(OLD.id, OLD.nome, NEW.nome);
END;

04. Quando ocorrer qualquer alteração na tabela colunistas, será gravado um registro na tabela hist_colunistas;

Criando uma view com o SQLite3

A view é uma tabela virtual onde os dados não estão fisicamente armazenados. Ela é apenas uma visão de uma ou mais colunas de uma ou mais tabelas do banco.

CREATE VIEW IF NOT EXISTS imasters AS
SELECT nome FROM colunistas;

No exemplo acima, estamos criando uma view chamada imasters que terá como coluna apenas o nome dos colunistas.

Situações onde o SQLite funciona bem:

  • A maioria dos sites web (menos de 100 mil visitas/dia);
  • Substituto para arquivos de uso específico;
  • Bases de dados internas ou temporárias;
  • Programas locais;
  • Substituto de bancos de dados de grande porte em testes e demostrações;
  • Formato de arquivo de programas;
  • Dispositivos e programas embutidos;
  • Ensino de banco de dados.

Ferramentas:

Abaixo, segue algumas ferramentas para manipulação de arquivos baseados no SQLite.

SQLiteFront (português)|

http://sqlitefront.sourceforge.net

SQLite Database Browser|

http://sqlitebrowser.sourceforge.net

SQLite Manager|

http://www.sqlitemanager.org/

PHP SQLite Admin|

http://phpsqliteadmin.sourceforge.net/

Links:

Abaixo, segue alguns links para complementar o estudo desse artigo:

Site Oficial SQLite:

http://www.sqlite.org/

Comunidade Brasileira SQLite

http://sqlitebrasil.codigolivre.org.br

SQLite ODBC Driver

http://www.ch-werner.de/sqliteodbc/

Downloads: Download do Script

Semana que vem tem mais. Espero que vocês tenham gostado.

Não deixe de nos enviar críticas ou sugestões para o próximo assunto, afinal a coluna é de vocês.

Boa semana a todos!

Até mais.