<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[老外写的PDO类，觉得写得很棒！！！]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 29 Jul 2009 06:46:21 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	来源：http://www.siteduzero.com/forum-83-383262-p1-class-crud.html<br/>SPDO.php:<br/><div class="code"><br/>&lt;?php<br/>// Fichier SPDO.php<br/><br/>class SPDO<br/>&#123;<br/>&nbsp;&nbsp;/* Instance de la classe SPDO<br/>&nbsp;&nbsp;@var SPDO<br/>&nbsp;&nbsp;@access private */&nbsp;&nbsp; <br/>&nbsp;&nbsp;private $PDOInstance = null;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Instance de la classe SPDO<br/>&nbsp;&nbsp;@var SPDO<br/>&nbsp;&nbsp;@access private<br/>&nbsp;&nbsp;@static */<br/>&nbsp;&nbsp;private static $instance = null;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Constante: nom d&#039;utilisateur de la bdd<br/>&nbsp;&nbsp;@var string */&nbsp;&nbsp;<br/>&nbsp;&nbsp;const DEFAULT_SQL_USER = &#039;*******&#039;; // =&gt; nom d&#039;utilisateur exemple &#039;root&#039;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Constante: hÃ´te de la bdd<br/>&nbsp;&nbsp;@var string */&nbsp;&nbsp;<br/>&nbsp;&nbsp;const DEFAULT_SQL_HOST = &#039;*******&#039;;&nbsp;&nbsp;// =&gt; Host de la Bd exemple = &#039;localhost&#039;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Constante: hÃ´te de la bdd<br/>&nbsp;&nbsp;@var string */&nbsp;&nbsp;<br/>&nbsp;&nbsp;const DEFAULT_SQL_PASS = &#039;*******&#039;; // =&gt; mot de passe<br/>&nbsp;&nbsp;/* Constante: nom de la bdd<br/>&nbsp;&nbsp;@var string */&nbsp;&nbsp;<br/>&nbsp;&nbsp;const DEFAULT_SQL_DTB = &#039;*******&#039;; // =&gt; nom de la table<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Constructeur de la classe SPDO<br/>&nbsp;&nbsp;@param void<br/>&nbsp;&nbsp;@return void<br/>&nbsp;&nbsp;@acess private<br/>&nbsp;&nbsp;@see PDO::__construct() */&nbsp;&nbsp; <br/>&nbsp;&nbsp;private function __construct()<br/>&nbsp;&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Nouvelle instance PDO : connexion Ã&nbsp;&nbsp;la table<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;PDOInstance = new PDO(&#039;mysql:dbname=&#039;.self::DEFAULT_SQL_DTB.&#039;;host=&#039;.self::DEFAULT_SQL_HOST,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;PDOInstance-&gt;setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;catch (PDOException $e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&lt;b&gt;Erreur PDO:&lt;/b&gt; &quot;.$e-&gt;getMessage().&quot;&lt;br /&gt;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Empeche la copie externe de l&#039;instance<br/>&nbsp;&nbsp;@access private */<br/>&nbsp;&nbsp;private function __clone()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception(&#039;Le clonage de SPDO n&#92;&#039;est pas autoris&amp;eacute;&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* CrÃ©e et retourne l&#039;objet SPDO */<br/>&nbsp;&nbsp;public static function getInstance()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(is_null(self::$instance))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$instance = new SPDO();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return self::$instance;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Initiates a transaction<br/>&nbsp;&nbsp;* @return &lt;bool&gt;&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;public function beginTransaction()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;beginTransaction();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Commits a transaction<br/>&nbsp;&nbsp;@return &lt;bool&gt; */<br/>&nbsp;&nbsp;public function commit()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;commit();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Fetch the SQLSTATE associated with the<br/>&nbsp;&nbsp;last operation on the database handle<br/>&nbsp;&nbsp;* @return &lt;string&gt; */<br/>&nbsp;&nbsp;public function errorCode()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;errorCode();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Fetch extended error information associated with<br/>&nbsp;&nbsp;the last operation on the database handle<br/>&nbsp;&nbsp;@return &lt;array&gt; */<br/>&nbsp;&nbsp;public function erroInfo()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;errorInfo();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Executes an SQL statement, return the number of affected row<br/>&nbsp;&nbsp;@param &lt;String&gt; $statement<br/>&nbsp;&nbsp;@return &lt;int&gt; */<br/>&nbsp;&nbsp;public function exec($statement)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;exec($statement);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Retrieve a database connection attribute<br/>&nbsp;&nbsp;@param &lt;int&gt; $attribute<br/>&nbsp;&nbsp;@return &lt;mixed&gt; */<br/>&nbsp;&nbsp;public function getAttribute($attribute)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;getAttribute($attribute);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Return an array of available PDO drivers<br/>&nbsp;&nbsp;@return &lt;array&gt; */<br/>&nbsp;&nbsp;public function getAvailabelDrivers()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;getAvailableDrivers();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Returns the ID of the last inserted row or sequence value<br/>&nbsp;&nbsp;@param &lt;type&gt; $name<br/>&nbsp;&nbsp;@return &lt;type&gt; */<br/>&nbsp;&nbsp;public function lastInsertId($name)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;lastInsertId($name);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Prepare an SQL statement, returning a result set as PDOStatement object<br/>&nbsp;&nbsp;@param &lt;String&gt; $statement<br/>&nbsp;&nbsp;@return &lt;type&gt; */<br/>&nbsp;&nbsp;public function prepare($statement,$driver_options=false)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!$driver_options)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$driver_options=array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;prepare($statement,$driver_options);;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Executes an SQL statement, returning a result set as PDOStatement object<br/>&nbsp;&nbsp;@param &lt;string&gt; $statement<br/>&nbsp;&nbsp;@return PDOStatement */<br/>&nbsp;&nbsp;public function query($statement)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;query($statement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;catch (PDOException $e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $e-&gt;getMessage();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Quotes a string for use in a query<br/>&nbsp;&nbsp;@param &lt;type&gt; $input<br/>&nbsp;&nbsp;@param &lt;type&gt; $parametre_type<br/>&nbsp;&nbsp;@return &lt;type&gt; */<br/>&nbsp;&nbsp;public function quote($input, $parametre_type=0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;quote($input,$parametre_type);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Rolls back a transaction<br/>&nbsp;&nbsp;@return &lt;bool&gt; */<br/>&nbsp;&nbsp;public function rollBack()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;rollBack();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/*Set an attribute<br/>&nbsp;&nbsp;@param &lt;int&gt; $attribute<br/>&nbsp;&nbsp;@param &lt;mixed&gt; $value<br/>&nbsp;&nbsp;@return &lt;bool&gt; */<br/>&nbsp;&nbsp;public function setAttribute($attribute, $value)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;setAttribute($attribute,$value);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/*Execute query and return one row in assoc array<br/>&nbsp;&nbsp;@param &lt;string&gt; $statement<br/>&nbsp;&nbsp;@return &lt;type&gt; */<br/>&nbsp;&nbsp;public function queryFetchAllAssoc($statement)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;query($statement)-&gt;fetchAll(PDO::FETCH_ASSOC);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* @param &lt;type&gt; $statement<br/>&nbsp;&nbsp;@return &lt;type&gt; */<br/>&nbsp;&nbsp;public function queryFetchAllObj($statement)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;PDOInstance-&gt;query($statement)-&gt;fetchAll(PDO::FETCH_OBJ);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public function queryFetchAllBoth($statement)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;query($statement)-&gt;fetchAll(PDO::FETCH_BOTH);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/*Close a connection database<br/>&nbsp;&nbsp;@access public<br/>&nbsp;&nbsp;@return &lt;void&gt; */<br/>&nbsp;&nbsp;public function close()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;PDOInstance = null;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&#125;<br/>?&gt;<br/></div><br/>Table.php:<br/><div class="code"><br/>&lt;?php<br/>// Table.php<br/><br/>abstract class Table<br/>&#123;<br/>&nbsp;&nbsp;/* @var string */<br/>&nbsp;&nbsp;/* Nom de la table */<br/>&nbsp;&nbsp;protected $_name;<br/>&nbsp;&nbsp;/* Nom de la sÃ©quence (laisser vide pour auto-gen) */<br/>&nbsp;&nbsp;protected $_sequence;<br/>&nbsp;&nbsp;/* Nom de la colonne de la clÃ© primaire */<br/>&nbsp;&nbsp;protected $_pk;<br/>&nbsp;&nbsp;/* Pour tout sÃ©lectionner&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;protected $_selection = &#039;*&#039;;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* @var PDO-&gt;SPDO */<br/>&nbsp;&nbsp;/* Instance de connexion SPDO */<br/>&nbsp;&nbsp;protected $connection;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* Constructeur de Table */<br/>&nbsp;&nbsp;function __construct()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_ensureConnection();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* fonction qui retourne une instance de connexion SPDO */<br/>&nbsp;&nbsp;private function _ensureConnection()<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;connection = SPDO::getInstance();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Setup what to select from DB table<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param string &#124; array $selection<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function setSelection($selection)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$oldValue = $this-&gt;_selection;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_selection = implode(&#039;, &#039;, (array) $selection);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $oldValue;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Selectionne une ligne par ID<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param int $id<br/>&nbsp;&nbsp; * @return mixed array row or bool FALSE if none found<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function select($id)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement(&#039;SELECT &#039; . $this-&gt;_selection . <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039; FROM &#039; . $this-&gt;_name ,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array (&#039; WHERE &#039; . $this-&gt;_name . &#039;.&#039; . $this-&gt;_pk . &#039; = ?&#039;, (int) $id))-&gt;fetch();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Selectionne toutes les lignes par rapport aux conditions dans $where<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array $where<br/>&nbsp;&nbsp; * @param array &#124; string $order<br/>&nbsp;&nbsp; * @param int $pageSize<br/>&nbsp;&nbsp; * @param int $pageNumber<br/>&nbsp;&nbsp; * @return PDOStatement<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function selectAll($where = null, $order = null, $pageSize = null, $pageNumber = 1)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;SELECT &#039; . $this-&gt;_selection . &#039; FROM &#039; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_appendOrder($sql, $order);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_appendLimit($sql, $pageSize, $pageNumber);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, $binds)-&gt;fetchAll(PDO::FETCH_OBJ);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * @param array $idList<br/>&nbsp;&nbsp; * @param array &#124; string $where<br/>&nbsp;&nbsp; * @param array &#124; string $order<br/>&nbsp;&nbsp; * @return PDOStatement &#124; ArrayObject<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function selectInIdList(array $idList, $where = null, $order = null)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (! ($count = count($idList)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new ArrayObject(array());<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = $this-&gt;_name . &#039;.&#039; . $this-&gt;_pk . &#039; IN (?&#039; . str_repeat(&#039;, ?&#039;, $count - 1) . &#039;)&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$where = array_merge((array) $where, array($sql =&gt; $idList));<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;selectAll($where, $order);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Fetch id =&gt; colonnes paires en array<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param string $column<br/>&nbsp;&nbsp; * @param array &#124; string $where<br/>&nbsp;&nbsp; * @param array &#124; string $order<br/>&nbsp;&nbsp; * @return array<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function fetchPairs($column, $where = null, $order = null)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$selection = $this-&gt;_selection;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setSelection($this-&gt;_name . &#039;.&#039; . $this-&gt;_pk . &#039;, &#039; . $this-&gt;_name . &#039;.&#039; . $column);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$output = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($this-&gt;selectAll($where, $order) as $row)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$output&#91;$row&#91;$this-&gt;_pk&#93;&#93; = $row&#91;$column&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (Exception $e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setSelection($selection);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw $e;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setSelection($selection);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $output;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Compte toutes les lignes par rapport aux conditions dans $where<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array &#124; string $where<br/>&nbsp;&nbsp; * @return int<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function count($where = null)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;SELECT COUNT(*) FROM &#039; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, $binds)-&gt;fetchColumn();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Calculate sum of values in column $column satisfying conditions in $where<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param string &#124; array $expressions Either a string (SQL expression to be wrapped in SUM() ) or <br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; an array (SQL expression =&gt; alias,..)<br/>&nbsp;&nbsp; * @param array &#124; string $where<br/>&nbsp;&nbsp; * @return int<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function sum($expressions, $where = null)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (is_string($expressions))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;SELECT SUM(&#039; . $expressions . &#039;) FROM &#039; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, $binds)-&gt;fetchColumn();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sum = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($expressions as $expr =&gt; $alias)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sum&#91;&#93; = &quot;SUM($expr) AS $alias&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;SELECT &#039; . implode(&quot;, &quot;, $sum) . &#039; FROM &#039; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, $binds)-&gt;fetch();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Get SQL clauses: SELECT ... FROM ... WHERE ...<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array &#124; string $where<br/>&nbsp;&nbsp; * @return array ( SQL, BOUNDS )<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function getSelectSql($where)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &quot;SELECT &quot; . $this-&gt;_selection . &quot; FROM &quot; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$bounds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return array($sql, $bounds);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Insert une nouvelle ligne<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array $row<br/>&nbsp;&nbsp; * @return int new row ID<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function insert(array $row)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_removeId($row);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;INSERT INTO &#039; . $this-&gt;_name . &#039; (&#039; . implode(&#039;, &#039;, array_keys($row)) . <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;) VALUES (?&#039; . str_repeat(&#039;, ?&#039;, count($row) - 1) . &#039;)&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_statement($sql, array_values($row));<br/>&nbsp;&nbsp;&nbsp;&nbsp;return (int) $this-&gt;connection-&gt;lastInsertId($this-&gt;_sequence);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Update une ligne spÃ©cifiÃ© par son ID $id<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array $row<br/>&nbsp;&nbsp; * @return int new row ID<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function update($row, $id)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_removeId($row);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$updates = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach (array_keys($row) as $field)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$updates&#91;&#93; = $field . &#039; = ?&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;UPDATE &#039; . $this-&gt;_name . &#039; SET &#039; . implode(&#039;, &#039;, $updates) . <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039; WHERE &#039; . $this-&gt;_pk . &#039; = ?&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds = array_values($row);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds&#91;&#93; = $id;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_statement($sql, $binds);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return (int) $id;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Update une ligne spÃ©cifiÃ© par rapport aux conditions dans $where<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param array $values<br/>&nbsp;&nbsp; * @return int new row ID<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function updateAll($values, $where)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_removeId($values);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$updates = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach (array_keys($values) as $field)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$updates&#91;&#93; = $field . &#039; = ?&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;UPDATE &#039; . $this-&gt;_name . &#039; SET &#039; . implode(&#039;, &#039;, $updates);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return (int) $this-&gt;_statement($sql, array_merge(array_values($values), $binds))-&gt;rowCount();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Supprime une ligne spÃ©cifier par son ID $id<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param int &#124; int&#91;&#93; $id<br/>&nbsp;&nbsp; * @return int Number of rows deleted<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function delete($id)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;DELETE FROM &#039; . $this-&gt;_name . &#039; WHERE &#039; . $this-&gt;_pk . &#039; = ?&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, array($id))-&gt;rowCount();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * Supprime une ligne spÃ©cifiÃ© par rapport aux conditions dans $where<br/>&nbsp;&nbsp; *<br/>&nbsp;&nbsp; * @param int &#124; int&#91;&#93; $id<br/>&nbsp;&nbsp; * @return int Number of rows deleted<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function deleteAll($where = null)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql = &#039;DELETE FROM &#039; . $this-&gt;_name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$binds = $this-&gt;_appendWhere($sql, $where);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;_statement($sql, $binds)-&gt;rowCount();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp; * @param string $sql<br/>&nbsp;&nbsp; * @param array $binds<br/>&nbsp;&nbsp; * @return PDOStatement<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;function _statement($sql, array $binds)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$stmt = $this-&gt;connection-&gt;prepare($sql);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_prepareBooleans($binds);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute($binds);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;setFetchMode(PDO::FETCH_OBJ);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $stmt;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;function _appendWhere(&amp;$sql, $where)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (empty($where))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;elseif (is_string($where))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql .= &#039; WHERE (&#039; . $where . &#039;)&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$binds = $and = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($where as $condition =&gt; $bindsPart)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null === $bindsPart)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$bindsPart = array(null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$binds = array_merge($binds, (array) $bindsPart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$and&#91;&#93; = $condition;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql .= &#039; WHERE (&#039; . implode(&#039;) AND (&#039;, $and) . &#039;)&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $binds;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;function _appendOrder(&amp;$sql, $order)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (empty($order))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$normalized = array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach ((array) $order as $key =&gt; $val)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_numeric($key))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$normalized&#91;&#93; = $val;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$normalized&#91;&#93; = $key . &#039; &#039; . $val;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql .= &#039; ORDER BY &#039; . implode(&#039;, &#039;, $normalized);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;function _appendLimit(&amp;$sql, $pageSize, $pageNumber)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (! $pageSize)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$sql .= &#039; LIMIT &#039; . $pageSize . &#039; OFFSET &#039; . (($pageNumber - 1) * $pageSize);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;protected function _removeId(&amp;$row)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (array_key_exists($this-&gt;_pk, $row))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($row&#91;$this-&gt;_pk&#93;);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;protected function _prepareBooleans(&amp;$row)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach ($row as $key =&gt; $value)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_bool($value))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;$key&#93; = $value ? &#039;true&#039; : &#039;false&#039;;<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/>?&gt; <br/></div><br/>exemple :<br/><br/><div class="code"><br/>&lt;?php <br/>// Fichier Page.php<br/>require_once(&#039;Table.php&#039;);<br/><br/>Class Page extends Table <br/>&#123; <br/>&nbsp;&nbsp;protected $_name = &#039;table_page&#039;;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;protected $_id = &#039;page_id&#039;;<br/>&#125;<br/>?&gt;<br/></div><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 老外写的PDO类，觉得写得很棒！！！]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>