<?php
/**
 * Classe contador em PHP5 utilizando o SQLite.
 *
 * @author Fabiano Monteiro
 * @version 1.0 2010-06-11
 * @license LGPL3
 * @copyright (C) 2010 Fabiano Monteiro
 */

/**
*Algumas dicas:
*
*- Não coloque os arquivos do banco em diretórios visíveis na web - ou seja, evitem *colocá-los abaixo da pasta public_html.
*Se for necessário colocar dentro desta estrutura, proteja o diretorio com .htaccess;
*
*- Utilize tabelas com poucos dados. O SQLite roda no mesmo servidor que o seu site (ao *contrário do MySQL, PostgreSQL que rodam em servidores separados) e pode comprometer a *performance se ele for muito grande ou tiver muitos acessos;
*
*- Para o nome do arquivos, utilize sufixos como ".db", ".sqlite" para lembrá-lo que o *arquivo é um banco de dados.
*
**/

class Contador
{
    protected $banco;
    public $resValor;

    public function  __construct()
    {
        try {
            // Se não existir, cria a base de dados.
            // Cria a instância.
            $this->banco = new SQLite3('contadordb.db');

        } catch (Exception $exc) {
            die( $exc->getMessage() );
        }
       
         // Se a tabela não foi populada, o método 'exibirValor()' retorna FALSE.
        // Leia o comentário do método 'exibirValor()'
        if(!self::exibirValor()){
            // Cria a tabela
            $this->banco->exec('CREATE TABLE contador (valor INTEGER )');
            $this->banco->exec('INSERT INTO contador (valor) VALUES (0)');
        }
    }


    public function exibirValor()
    {
        // 'querySingle' - Executa a query e retorna um único resultado.
        // Por padrão retorna o valor da primeira coluna em forma de array(matriz),
        // caso contrário, o valor de retorno é FALSE.
        $this->resValor = $this->banco->querySingle('SELECT valor FROM contador');

        return $this->resValor;
    }
   
    public function atualizarContador()
    {
        // Pega o valor da consulta única ($this->resValor).
        self::exibirValor();

        // Somando e atualizando a base.
        $valor = $this->resValor + 1;
        $this->banco->exec("UPDATE contador SET valor = $valor");
    }

    public function  __destruct()
    {
        $banco->close();
    }
}


$meuContador = new Contador();

// O Método pode entrar em alguma condição para tratar
// o acesso por visita e atualizar uma única vez gravando em sessão.
$meuContador->atualizarContador();

//Método para exibir o valor do contador.
echo 'Contador '. $meuContador->exibirValor();


?>