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);

  ?>