PHP中使用匿名函数操作数据库的例子


Base dao class illustrating the usefulness of closures.

* Handles opening and closing of connections.

* Adds slashes sql

* Type checking of sql parameters and casts as appropriate

* Provides hook for processing of result set and emitting one or more objects.

* Provides hook for accessing underlying link and result objects.

<?php

define("userName","root"); define("password","root"); define("dbName","ahcdb"); define("hostName","localhost");

class BaseDao {

    function getConnection()    {         $link = mysql_connect(hostName, userName, password);         if (!$link)             die("Could not connect: " . mysql_error());         if (!mysql_select_db(dbName))             die("Could not select database: " . mysql_error());         return $link;     }         function setParams(& $sql, $params)    {         if($params != null)             $sql = vsprintf($sql, array_map(function($n) {                 if(is_int($n))                     return (int)$n;                 if(is_float($n))                     return (float)$n;                 if(is_string($n))                     return "'".mysql_real_escape_string($n)."'";                 return mysql_real_escape_string($n);             }, $params));     }

    function executeQuery($sql, $params, $callback = null)    {         $link  = $this->getConnection();         $this->setParams($sql, $params);         $return = null;         if(($result = mysql_query($sql, $link)) != null)             if($callback != null)                 $return = $callback($result, $link);         if($link != null)             mysql_close($link);         if(!$result)             die("Fatal Error: Invalid query '$sql' : " . mysql_error());         return $return;     }       function getList($sql, $params, $callback)    {         return $this->executeQuery($sql, $params, function($result, $link) use ($callback) {             $idx = 0;             $list = array();             while ($row = mysql_fetch_assoc($result))                 if($callback != null)                     $list[$idx] = $callback($idx++, $row);             return $list;         });     }         function getSingle($sql, $params, $callback)    {         return $this->executeQuery($sql, $params, function($result, $link) use ($callback) {             if ($row = mysql_fetch_assoc($result))                 $obj = $callback($row);             return $obj;         });     } }

class Example    {     var $id;     var $name;         function Example($id, $name){         $this->id = $id;         $this->name = $name;     }         function setId($id){         $this->id = $id;     } }

class ExampleDao extends BaseDao    {             function getAll(){         return parent::getList("select * from nodes", null, function($idx, $row) {             return new Example($row["id"], $row["name"]);         });     }         function load($id){         return parent::getSingle("select * from nodes where id = %1\$s", array($id), function($row) {             return new Example($row["id"], $row["name"]);         });     }         function update($example){         return parent::executeQuery("update nodes set name = '' where  id = -1", null, function($result, $link){             return $result;         });     }         function insert(& $example){         return parent::executeQuery("insert into nodes", null, function($result, $link) use ($example){             $id = mysql_insert_id($link);             $example->setId($id);             return $result;         });     }    }

$exampleDao = new ExampleDao();

$list = $exampleDao->getAll());

$exampleObject = $exampleDao->load(1));

$exampleDao->update($exampleObject);

?>