<?php 
/** 
 * This is an example of usage for Naf Database Tools: 
 * - Naf_Table 
 * - Naf_Record 
 * - Naf_Select 
 *  
 * This is a basic CRUD (Create/Read/Update/Delete) application 
 */ 
 
/* the necessary includes. in my projects, I use __autoload(), 
    therefore I don't need ot write these routines */ 
$root = dirname(__FILE__) . '/'; 
require_once $root . 'Naf/Table.php'; 
require_once $root . 'Naf/Validator.php'; 
require_once $root . 'Naf/Validator/Result.php'; 
require_once $root . 'Naf/Record.php'; 
require_once $root . 'Naf/Select.php'; 
 
// the Book class: ActiveRecord for the book table 
require_once $root . 'lib/Book.php'; 
 
// let's connect to database 
$pdo = new PDO("sqlite:" . $root . "sqlite/db"); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $pdo->query("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY, title varchar(255), description TEXT)"); 
} catch (PDOException $e) { 
    die("Unable to execute queries: " . $e->getMessage()); 
} 
Naf_Table::setDefaultConnection($pdo); 
 
$errorList = array(); 
if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    switch (@$_POST['do']) 
    { 
        case "create": 
            // CREATE action 
            $newBook = new Book(); 
            $newBook->import($_POST);// notice - we don't care about redundant keys we are importing. 
                                        // Naf_Record will care about importing only the needed keys 
            if ($newBook->save())// should return the new book #ID, obviously > 0 
            { 
                header("Location: " . $_SERVER['PHP_SELF']); 
                exit(); 
            } else { 
                $errorList = $newBook->getErrorList(); 
            } 
            break; 
        case "update": 
            // UPDATE action 
            $updated = new Book(); 
            if ($updated->load(@$_POST['id']))// first, we need to know what row to update 
            { 
                $updated->import($_POST); 
                if ($updated->save()) 
                { 
                    header("Location: " . $_SERVER['PHP_SELF']); 
                    exit(); 
                } else { 
                    $errorList = $updated->getErrorList(); 
                } 
            } else { 
                $errorList[] = "Book #ID not found: " . var_export(@$_POST['id'], 1); 
            } 
            break; 
        case "delete": 
            // DELETE action 
            $deleted = new Book(); 
            if ($deleted->load(@$_POST['id']))// first, we need to know what row to delete 
            { 
                if ($deleted->delete()) 
                { 
                    header("Location: " . $_SERVER['PHP_SELF']); 
                    exit(); 
                } else { 
                    $errorList[] = "Unfortunately, delete failed"; 
                } 
            } else { 
                $errorList[] = "Book #ID not found: " . var_export(@$_POST['id'], 1); 
            } 
            break; 
        default: 
            break; 
    } 
} 
 
?> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Naf Database Tools example: basic CRUD (Create/Read/Update/Delete) application</title> 
</head> 
<body> 
     
    <?php /* Display errors if any */ ?> 
    <?php if (count($errorList)) : ?> 
        <ul style="color:red"> 
            <?php foreach ($errorList as $message) : ?> 
                <li><?=$message?></li> 
            <?php endforeach; ?> 
        </ul> 
    <?php endif; ?> 
     
    <h2>Create new book</h2> 
    <form method="POST" action=""> 
        Title: <input type="text" name="title" size="50" /> 
        <br /> 
        Description: <textarea name="description" cols="50" rows="5"></textarea> 
        <br /> 
        <input type="submit" name="do" value="create" /> 
    </form> 
     
    <?php /* form to submitted in order to delete a book */ ?> 
    <form method="POST" action=""> 
        <input type="hidden" name="id" id="delete-form-id" /> 
        <input type="hidden" name="go" value="delete" /> 
    </form> 
     
    <h2>Existing books</h2> 
    <?php 
    $bookList = new Naf_Select('book'); 
    /* apply search filter - ONLY in case a search form has been submitted (notice registerFilter_--If--_()) */ 
    $bookList->registerFilterIf(is_string(@$_GET['query']), 'title LIKE ?', "%" . @$_GET['query'] . "%"); 
    if (! $bookList->count()) 
    { 
        ?><h3>No books matching your criteria in the database</h3><?php 
    } 
    ?> 
    <form method="GET" action=""> 
        Search for a book: <input type="text" name="query" value="<?=htmlspecialchars(@$_GET['query'], ENT_QUOTES)?>" /> 
        <input type="submit" value="find" /> 
    </form> 
    <style> 
    .books td { 
        vertical-align:top; 
    } 
    </style> 
    <table border="1" class="books"> 
    <thead> 
        <tr> 
            <th>Title</th> 
            <th>Description</th> 
            <th colspan="2">Actions</th> 
        </tr> 
    </thead> 
    <tbody> 
    <?php foreach ($bookList->export() as $item) : ?> 
        <?php /* the markup is not valid, but this is an example only... */ ?> 
        <form method="POST" action=""> 
        <input type="hidden" name="id" value="<?=$item['id']?>" /> 
        <tr> 
            <td><input type="text" name="title" value="<?=htmlspecialchars($item['title'], ENT_QUOTES)?>" /></td> 
            <td><textarea name="description" cols="50" rows="2"><?=htmlspecialchars($item['description'], ENT_QUOTES)?></textarea></td> 
            <td><input type="submit" name="do" value="update" /></td> 
            <td><input type="submit" name="do" value="delete" /></td> 
        </tr> 
        </form> 
    <?php endforeach; ?> 
    </tbody> 
    </table> 
     
    <h2>NOTES:</h2> 
    <ol> 
        <li>Remember to download naf-validator package from phpclasse.org!</li> 
        <li>For the example to work, you will have to create a folder named `Naf' in this folder,  
            with contents as follows: 
            <b>Naf/Table.php</b>, <b>Naf/Validator.php</b>, <b>Naf/Validator/Result.php</b>,  
            <b>Naf/Record.php</b>, <b>Naf/Select.php</b></li> 
        <li>The SQLite database is supposed to be in `sqlite/db'</li> 
        <li>To get the example working, you won't need the actual database file, but...</li> 
        <li>REMEMBER: the web-server user will need a write-access to `sqlite' directory!</li> 
    </ol> 
</body> 
</html>
 
 |