Model - db.inc
<?php

class db {
  protected static 
$dbh false;

  function 
connect() {
    
self::$dbh = new PDO('sqlite:./model/example.db');
    
self::$dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
  }

  protected function 
fatal_error($msg) {
    echo 
"<pre>Error!: $msg\n";
    
$bt debug_backtrace();
    foreach(
$bt as $line) {
      
$args var_export($line['args'], true);
      echo 
"{$line['function']}($args) at {$line['file']}:{$line['line']}\n";
    }
    echo 
"</pre>";
    die();
  }
}

// load_list takes a text file and turns it into a global array cached by APC
function load_list($name) {
  global $
$name;
  if(!$
$name apc_fetch($name)) {
    $
$name explode("\n",trim(file_get_contents($name.'.txt')));
    
apc_store($name,$$name);
  }
}
?>
Model - items.inc
<?php
/*
  id    INTEGER PRIMARY KEY,
  cat   TEXT NOT NULL,
  sdesc TEXT NOT NULL,
  ldesc TEXT NOT NULL,
  price REAL DEFAULT 0
*/

class items extends db {
  function 
insert($item) {
    
$t $_SERVER["REQUEST_TIME"];
    try {
      if(!
self::$dbh$this->connect();
      
self::$dbh->beginTransaction();
      
$stmt self::$dbh->prepare("INSERT INTO items 
                                    (id,cat,sdesc,ldesc,price,ctime)
                                   VALUES 
                                    (NULL,:cat,:sdesc,:ldesc,:price,
$t)");
      
$params = array(':cat'  =>$item['cat'],
                      
':sdesc'=>$item['sdesc'],
                      
':ldesc'=>$item['ldesc'],
                      
':price'=>$item['price']);
      
$ret $stmt->execute($params);
      
self::$dbh->commit();
    } catch (
PDOException $e) {
      
self::$dbh->rollback();
      
$this->fatal_error($e->getMessage());
    }
    return 
$ret;
  }

  function 
modify($item) {
    try {
      if(!
self::$dbh$this->connect();
      
self::$dbh->beginTransaction();
      
$stmt self::$dbh->prepare("UPDATE items SET 
                                    cat=:cat, sdesc=:sdesc, 
                                    ldesc=:ldesc, price=:price 
                                   WHERE id=:id"
);
      
$params = array(':cat'  =>$item['cat'],
                      
':sdesc'=>$item['sdesc'],
                      
':ldesc'=>$item['ldesc'],
                      
':price'=>$item['price'],
                      
':id'=>$item['id']);
      
$ret $stmt->execute($params);
      
self::$dbh->commit();
    } catch (
PDOException $e) {
      
self::$dbh->rollback();
      
$this->fatal_error($e->getMessage());
    }
    return 
$ret;
  }

  function 
load($id=-1) {
    
$where '';

    if(
$id!=-1$where "where id=".(int)$id;
    try {
      if(!
self::$dbh$this->connect();
      
$result self::$dbh->query("SELECT * FROM items
                             
$where order by ctime desc");
      
$rows $result->fetchAll(PDO::FETCH_ASSOC); 
    } catch (
PDOException $e) {
      
$this->fatal_error($e->getMessage());
    }
    
// Some databases can do this right in the SELECT
    // SQLite can't, so we add a formatted column ourselves
    
foreach($rows as $i=>$row) {
      
$rows[$i]['fprice'] = number_format($row['price'],2);
    }
    return 
$rows;
  }
}
?>