properties = $an_array['properties']; return $obj; } function set($property, $value) { $this->properties[$property] = $value; } function get($property) { return $this->properties[$property]; } function toJson() { $str = "{"; $first = true; foreach( $this->properties as $key => $value ) { if ( !$first ) { $str .= ","; } $first = false; $str .= "$key:\"" . str_replace( array("\n", "\r"), array("\\n", "\\r"), $value ) . "\""; } $str .= "}"; return $str; } function mergeFrom($item) { foreach( self::$fields as $field ) { if ( isset( $item->properties[$field] ) ) { $this->properties[$field] = $item->properties[$field]; } } } static function createFromPost() { global $_POST; $item = new TodoItem(); foreach ( self::$fields as $field ) { $item->set( $field, $_POST[$field] ); } return $item; } } class AddItemRequest { function serve() { return getDb()->addItem( TodoItem::createFromPost() ) ; } } class DelItemRequest { function serve() { global $_POST; getDb()->delItem( $_POST['delitem'] ); return "ok"; } } class SetItemInfoRequest { function serve() { getDb()->changeItem( TodoItem::createFromPost() ) ; return "ok"; } } function mergeSessionWithDb() { global $_SESSION; foreach( $_SESSION['todo'] as $item ) { getDb()->addItem( $item ); } unset($_SESSION['todo']); } class CreateAccountRequest { function serve() { global $auth; global $_POST; $msg = userDb()->addUser($_POST['username'], $_POST['password'] ); if ( $msg == "ok" ) { $_SESSION{'username'} = $_POST['username']; mergeSessionWithDb(); } return $msg; } } class LoginRequest { function serve() { global $auth; global $_POST; global $_SESSION; if( "ok" == userDb()->checkUser($_POST['username'], $_POST['password'] ) ) { $_SESSION{'username'} = $_POST['username']; mergeSessionWithDb(); return 'ok'; } return 'error'; } } class GetItemsRequest { function serve() { $todo = getDb()->getItems(); $str = "["; $first = true; foreach( $todo as $item ) { if ( !$first ) { $str .= ','; } $first = false; $str .= $item->toJson(); } $str .= ']'; return $str; } } function getDb() { static $instance; if (!is_object($instance) ) { global $_SESSION; if ( isset($_SESSION['username'] ) ) { // Logged in -- access mysql database. global $DatabaseName; $instance = new PermanentTodoDb($DatabaseName); } else { // Not logged in -- use cookies. $instance = new SessionTodoDb(); } } return $instance; } class Database { private $source; function __construct( $source ) { $this->source = $source; } function connectDb() { require_once('DB.php'); $db = DB::connect($this->source); if ( DB::iserror($db)) { die($db->getMessage()); } return $db; } } function userDb() { static $instance; if (!is_object($instance) ) { global $DatabaseName; $instance = new UserDb($DatabaseName); } return $instance; } class UserDb extends Database { function __construct($source) { parent::__construct($source); } // returns "ok", or a description of the error. function addUser($username, $password) { $db = $this->connectDb(); $username = $db->escapeSimple($username); $password = $db->escapeSimple($password); $sql = <<query($sql); if (DB::iserror($q)) { return $q->getMessage(); } $q = $db->commit(); if (DB::iserror($q)) { return $q->getMessage(); } return "ok"; } function checkUser( $username, $password ) { $db = $this->connectDb(); $username = $db->escapeSimple($username); $sql = <<query($sql); if ( DB::iserror($q)) { die($q->getMessage()); } $row = $q->fetchRow(DB_FETCHMODE_OBJECT); if ( $row == null || $row->password != $password ) { return false; } return true; } function removeUser($username) { $db = $this->connectDb(); $username = $db->escapeSimple( $username ); $sql = <<query($sql); if (DB::iserror($q)) { echo "
$sql
"; die($q->getMessage()); } $db->commit(); return "ok"; } function getUserList() { // not implemented. return array(); } }; class SessionTodoDb { function addItem( $item ) { global $_SESSION, $todo; $nextID = $_SESSION['nextID']; $_SESSION['todo'][$nextID] = $item; $item->set('ID', $nextID); $_SESSION['nextID'] += 1; return $nextID; } function delItem( $id ) { unset($_SESSION['todo'][$id]); } function changeItem( $item ) { global $_SESSION; $_SESSION['todo'][$item->get('ID')]->mergeFrom($item); } function getItems() { global $_SESSION; return $_SESSION['todo']; } } class PermanentTodoDb extends Database { function __construct($source) { parent::__construct($source); } function addItem( $item ) { global $_SESSION; $db = $this->connectDb(); $ID = $db->nextId("todoid"); $item->set('ID', $ID); $username = $db->escapeSimple($_SESSION['username']); $blob = $db->escapeSimple(var_export($item, TRUE)); $sql = <<query($sql); if (DB::iserror($q)) { return $q->getMessage(); } $q = $db->commit(); if (DB::iserror($q)) { return $q->getMessage(); } return $ID; } function delItem( $id ) { global $_SESSION; $db = $this->connectDb(); $username = $db->escapeSimple($_SESSION['username']); $ID = $db->escapeSimple($id); $sql = <<connectDb(); $q = $db->query($sql); if (DB::iserror($q)) { echo "
$sql
"; die($q->getMessage()); } $db->commit(); } function changeItem( $newitem ) { global $_SESSION; $db = $this->connectDb(); $username = $db->escapeSimple($_SESSION['username']); $ID = $db->escapeSimple($newitem->get('ID')); $sql = <<query($sql); if ( DB::iserror($q)) { die($q->getMessage()); } $row = $q->fetchRow(DB_FETCHMODE_OBJECT); if ( $row == null || $row->password != $password ) { return false; } eval("\$item = $row->item;"); $item->mergeFrom($newitem); $blob = $db->escapeSimple(var_export($item, TRUE)); $sql = <<query($sql); if (DB::iserror($q)) { echo "
$sql
"; die($q->getMessage()); } $db->commit(); } function getItems() { global $_SESSION; $db = $this->connectDb(); $username = $db->escapeSimple($_SESSION['username']); $sql = "SELECT * FROM Todo WHERE username=\"$username\" ORDER BY ID;"; $items = array(); // look for record for given user name. $q = $db->query($sql); if ( DB::iserror($q)) { die($q->getMessage()); } for($i = 0;;$i++) { $row = $q->fetchRow(DB_FETCHMODE_OBJECT); if ( $row == NULL ) { break; } eval("\$items[] = $row->item;"); } return $items; } } // ---------------------------------------------------------------------------- // Main web page stuff // ---------------------------------------------------------------------------- // create the session. Make sure it lasts as long as possible. session_set_cookie_params(604800); // one week session_start(); if ( isset( $_GET['logout'] ) ) { unset($_SESSION['username']); unset($_SESSION['todo']); } // if there isn't anything in the session already, initialize it. if ( !isset($_SESSION['todo'] ) ) { $_SESSION['todo'] = array(); $_SESSION['nextID'] = 1; } $todo = $_SESSION['todo']; $request = null; if ( isset( $_POST['additem'] ) ) { $request = new AddItemRequest(); } else if ( isset( $_POST['delitem'] ) ) { $request = new DelItemRequest(); } else if ( isset( $_POST['setiteminfo'] ) ) { $request = new SetItemInfoRequest(); } else if ( isset( $_POST['getitems'] ) ) { $request = new GetItemsRequest(); } else if ( isset( $_POST['createAccount'] ) ) { $request = new CreateAccountRequest(); } else if ( isset( $_POST['login'] ) ) { $request = new LoginRequest(); } if ( isset($_GET['dump'] ) ) { echo "
".var_export($_SESSION)."
"; } if ( $request ) { echo $request->serve(); exit(0); } ?>
Loading...

My Todo List.ca


More space

Create Account

Creating an account will allow you to save your todo list on our server, so you can access it later.

User name:
Password:
Re-enter password:
Email Address: