<?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>
|