Fatal Error SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
EXCEPTION_OTHER : 2002
{main}
open/usr/share/php/libzend-framework-php/Zend/Db/Adapter/Pdo/Abstract.php
1     <?php
2    
/**
3     * Zend Framework
4     *
5     * LICENSE
6     *
7     * This source file is subject to the new BSD license that is bundled
8     * with this package in the file LICENSE.txt.
9     * It is also available through the world-wide-web at this URL:
10    * http://framework.zend.com/license/new-bsd
11    * If you did not receive a copy of the license and are unable to
12    * obtain it through the world-wide-web, please send an email
13    * to license@zend.com so we can send you a copy immediately.
14    *
15    * @category   Zend
16    * @package    Zend_Db
17    * @subpackage Adapter
18    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
19    * @license    http://framework.zend.com/license/new-bsd     New BSD License
20    * @version    $Id: Abstract.php 23775 2011-03-01 17:25:24Z ralph $
21    */
22   
23   
24   /**
25    * @see Zend_Db_Adapter_Abstract
26    */
27   
require_once 'Zend/Db/Adapter/Abstract.php';
28   
29   
30   
/**
31    * @see Zend_Db_Statement_Pdo
32    */
33   
require_once 'Zend/Db/Statement/Pdo.php';
34   
35   
36   
/**
37    * Class for connecting to SQL databases and performing common operations using PDO.
38    *
39    * @category   Zend
40    * @package    Zend_Db
41    * @subpackage Adapter
42    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
43    * @license    http://framework.zend.com/license/new-bsd     New BSD License
44    */
45   
abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
46   
{
47   
48       
/**
49        * Default class name for a DB statement.
50        *
51        * @var string
52        */
53       
protected $_defaultStmtClass 'Zend_Db_Statement_Pdo';
54   
55       
/**
56        * Creates a PDO DSN for the adapter from $this->_config settings.
57        *
58        * @return string
59        */
60       
protected function _dsn()
61       {
62           
// baseline of DSN parts
63           
$dsn $this->_config;
64   
65           
// don't pass the username, password, charset, persistent and driver_options in the DSN
66           
unset($dsn['username']);
67           unset(
$dsn['password']);
68           unset(
$dsn['options']);
69           unset(
$dsn['charset']);
70           unset(
$dsn['persistent']);
71           unset(
$dsn['driver_options']);
72   
73           
// use all remaining parts in the DSN
74           
foreach ($dsn as $key => $val) {
75               
$dsn[$key] = "$key=$val";
76           }
77   
78           return 
$this->_pdoType ':' implode(';'$dsn);
79       }
80   
81       
/**
82        * Creates a PDO object and connects to the database.
83        *
84        * @return void
85        * @throws Zend_Db_Adapter_Exception
86        */
87       
protected function _connect()
88       {
89           
// if we already have a PDO object, no need to re-connect.
90           
if ($this->_connection) {
91               return;
92           }
93   
94           
// get the dsn first, because some adapters alter the $_pdoType
95           
$dsn $this->_dsn();
96   
97           
// check for PDO extension
98           
if (!extension_loaded('pdo')) {
99               
/**
100               * @see Zend_Db_Adapter_Exception
101               */
102              
require_once 'Zend/Db/Adapter/Exception.php';
103              throw new 
Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
104          }
105  
106          
// check the PDO driver is available
107          
if (!in_array($this->_pdoTypePDO::getAvailableDrivers())) {
108              
/**
109               * @see Zend_Db_Adapter_Exception
110               */
111              
require_once 'Zend/Db/Adapter/Exception.php';
112              throw new 
Zend_Db_Adapter_Exception('The ' $this->_pdoType ' driver is not currently installed');
113          }
114  
115          
// create PDO connection
116          
$q $this->_profiler->queryStart('connect'Zend_Db_Profiler::CONNECT);
117  
118          
// add the persistence flag if we find it in our config array
119          
if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) {
120              
$this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true;
121          }
122  
123          try {
124              
$this->_connection = new PDO(
125                  
$dsn,
126                  
$this->_config['username'],
127                  
$this->_config['password'],
128                  
$this->_config['driver_options']
129              );
130  
131              
$this->_profiler->queryEnd($q);
132  
133              
// set the PDO connection to perform case-folding on array keys, or not
134              
$this->_connection->setAttribute(PDO::ATTR_CASE$this->_caseFolding);
135  
136              
// always use exceptions.
137              
$this->_connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
138  
139          } catch (
PDOException $e) {
140              
/**
141               * @see Zend_Db_Adapter_Exception
142               */
143              
require_once 'Zend/Db/Adapter/Exception.php';
144              throw new 
Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
145          }
146  
147      }
148  
149      
/**
150       * Test if a connection is active
151       *
152       * @return boolean
153       */
154      
public function isConnected()
155      {
156          return ((bool) (
$this->_connection instanceof PDO));
157      }
158  
159      
/**
160       * Force the connection to close.
161       *
162       * @return void
163       */
164      
public function closeConnection()
165      {
166          
$this->_connection null;
167      }
168  
169      
/**
170       * Prepares an SQL statement.
171       *
172       * @param string $sql The SQL statement with placeholders.
173       * @param array $bind An array of data to bind to the placeholders.
174       * @return PDOStatement
175       */
176      
public function prepare($sql)
177      {
178          
$this->_connect();
179          
$stmtClass $this->_defaultStmtClass;
180          if (!
class_exists($stmtClass)) {
181              require_once 
'Zend/Loader.php';
182              
Zend_Loader::loadClass($stmtClass);
183          }
184          
$stmt = new $stmtClass($this$sql);
185          
$stmt->setFetchMode($this->_fetchMode);
186          return 
$stmt;
187      }
188  
189      
/**
190       * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
191       *
192       * As a convention, on RDBMS brands that support sequences
193       * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
194       * from the arguments and returns the last id generated by that sequence.
195       * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
196       * returns the last value generated for such a column, and the table name
197       * argument is disregarded.
198       *
199       * On RDBMS brands that don't support sequences, $tableName and $primaryKey
200       * are ignored.
201       *
202       * @param string $tableName   OPTIONAL Name of table.
203       * @param string $primaryKey  OPTIONAL Name of primary key column.
204       * @return string
205       */
206      
public function lastInsertId($tableName null$primaryKey null)
207      {
208          
$this->_connect();
209          return 
$this->_connection->lastInsertId();
210      }
211  
212      
/**
213       * Special handling for PDO query().
214       * All bind parameter names must begin with ':'
215       *
216       * @param string|Zend_Db_Select $sql The SQL statement with placeholders.
217       * @param array $bind An array of data to bind to the placeholders.
218       * @return Zend_Db_Statement_Pdo
219       * @throws Zend_Db_Adapter_Exception To re-throw PDOException.
220       */
221      
public function query($sql$bind = array())
222      {
223          if (empty(
$bind) && $sql instanceof Zend_Db_Select) {
224              
$bind $sql->getBind();
225          }
226  
227          if (
is_array($bind)) {
228              foreach (
$bind as $name => $value) {
229                  if (!
is_int($name) && !preg_match('/^:/'$name)) {
230                      
$newName ":$name";
231                      unset(
$bind[$name]);
232                      
$bind[$newName] = $value;
233                  }
234              }
235          }
236  
237          try {
238              return 
parent::query($sql$bind);
239          } catch (
PDOException $e) {
240              
/**
241               * @see Zend_Db_Statement_Exception
242               */
243              
require_once 'Zend/Db/Statement/Exception.php';
244              throw new 
Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
245          }
246      }
247  
248      
/**
249       * Executes an SQL statement and return the number of affected rows
250       *
251       * @param  mixed  $sql  The SQL statement with placeholders.
252       *                      May be a string or Zend_Db_Select.
253       * @return integer      Number of rows that were modified
254       *                      or deleted by the SQL statement
255       */
256      
public function exec($sql)
257      {
258          if (
$sql instanceof Zend_Db_Select) {
259              
$sql $sql->assemble();
260          }
261  
262          try {
263              
$affected $this->getConnection()->exec($sql);
264  
265              if (
$affected === false) {
266                  
$errorInfo $this->getConnection()->errorInfo();
267                  
/**
268                   * @see Zend_Db_Adapter_Exception
269                   */
270                  
require_once 'Zend/Db/Adapter/Exception.php';
271                  throw new 
Zend_Db_Adapter_Exception($errorInfo[2]);
272              }
273  
274              return 
$affected;
275          } catch (
PDOException $e) {
276              
/**
277               * @see Zend_Db_Adapter_Exception
278               */
279              
require_once 'Zend/Db/Adapter/Exception.php';
280              throw new 
Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
281          }
282      }
283  
284      
/**
285       * Quote a raw string.
286       *
287       * @param string $value     Raw string
288       * @return string           Quoted string
289       */
290      
protected function _quote($value)
291      {
292          if (
is_int($value) || is_float($value)) {
293              return 
$value;
294          }
295          
$this->_connect();
296          return 
$this->_connection->quote($value);
297      }
298  
299      
/**
300       * Begin a transaction.
301       */
302      
protected function _beginTransaction()
303      {
304          
$this->_connect();
305          
$this->_connection->beginTransaction();
306      }
307  
308      
/**
309       * Commit a transaction.
310       */
311      
protected function _commit()
312      {
313          
$this->_connect();
314          
$this->_connection->commit();
315      }
316  
317      
/**
318       * Roll-back a transaction.
319       */
320      
protected function _rollBack() {
321          
$this->_connect();
322          
$this->_connection->rollBack();
323      }
324  
325      
/**
326       * Set the PDO fetch mode.
327       *
328       * @todo Support FETCH_CLASS and FETCH_INTO.
329       *
330       * @param int $mode A PDO fetch mode.
331       * @return void
332       * @throws Zend_Db_Adapter_Exception
333       */
334      
public function setFetchMode($mode)
335      {
336          
//check for PDO extension
337          
if (!extension_loaded('pdo')) {
338              
/**
339               * @see Zend_Db_Adapter_Exception
340               */
341              
require_once 'Zend/Db/Adapter/Exception.php';
342              throw new 
Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
343          }
344          switch (
$mode) {
345              case 
PDO::FETCH_LAZY:
346              case 
PDO::FETCH_ASSOC:
347              case 
PDO::FETCH_NUM:
348              case 
PDO::FETCH_BOTH:
349              case 
PDO::FETCH_NAMED:
350              case 
PDO::FETCH_OBJ:
351                  
$this->_fetchMode $mode;
352                  break;
353              default:
354                  
/**
355                   * @see Zend_Db_Adapter_Exception
356                   */
357                  
require_once 'Zend/Db/Adapter/Exception.php';
358                  throw new 
Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified");
359                  break;
360          }
361      }
362  
363      
/**
364       * Check if the adapter supports real SQL parameters.
365       *
366       * @param string $type 'positional' or 'named'
367       * @return bool
368       */
369      
public function supportsParameters($type)
370      {
371          switch (
$type) {
372              case 
'positional':
373              case 
'named':
374              default:
375                  return 
true;
376          }
377      }
378  
379      
/**
380       * Retrieve server version in PHP style
381       *
382       * @return string
383       */
384      
public function getServerVersion()
385      {
386          
$this->_connect();
387          try {
388              
$version $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION);
389          } catch (
PDOException $e) {
390              
// In case of the driver doesn't support getting attributes
391              
return null;
392          }
393          
$matches null;
394          if (
preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/'$version$matches)) {
395              return 
$matches[1];
396          } else {
397              return 
null;
398          }
399      }
400  }
401  
402  
Stack trace
  1. open/usr/share/php/libzend-framework-php/Zend/Db/Adapter/Pdo/Mysql.php
    Zend_Db_Adapter_Pdo_Abstract->_connect()
    1     <?php
    2    
    /**
    3     * Zend Framework
    4     *
    5     * LICENSE
    6     *
    7     * This source file is subject to the new BSD license that is bundled
    8     * with this package in the file LICENSE.txt.
    9     * It is also available through the world-wide-web at this URL:
    10    * http://framework.zend.com/license/new-bsd
    11    * If you did not receive a copy of the license and are unable to
    12    * obtain it through the world-wide-web, please send an email
    13    * to license@zend.com so we can send you a copy immediately.
    14    *
    15    * @category   Zend
    16    * @package    Zend_Db
    17    * @subpackage Adapter
    18    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    19    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    20    * @version    $Id: Mysql.php 23986 2011-05-03 20:10:42Z ralph $
    21    */
    22   
    23   
    24   /**
    25    * @see Zend_Db_Adapter_Pdo_Abstract
    26    */
    27   
    require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
    28   
    29   
    30   
    /**
    31    * Class for connecting to MySQL databases and performing common operations.
    32    *
    33    * @category   Zend
    34    * @package    Zend_Db
    35    * @subpackage Adapter
    36    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    37    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    38    */
    39   
    class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract
    40   
    {
    41   
    42       
    /**
    43        * PDO type.
    44        *
    45        * @var string
    46        */
    47       
    protected $_pdoType 'mysql';
    48   
    49       
    /**
    50        * Keys are UPPERCASE SQL datatypes or the constants
    51        * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
    52        *
    53        * Values are:
    54        * 0 = 32-bit integer
    55        * 1 = 64-bit integer
    56        * 2 = float or decimal
    57        *
    58        * @var array Associative array of datatypes to values 0, 1, or 2.
    59        */
    60       
    protected $_numericDataTypes = array(
    61           
    Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
    62           
    Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
    63           
    Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE,
    64           
    'INT'                => Zend_Db::INT_TYPE,
    65           
    'INTEGER'            => Zend_Db::INT_TYPE,
    66           
    'MEDIUMINT'          => Zend_Db::INT_TYPE,
    67           
    'SMALLINT'           => Zend_Db::INT_TYPE,
    68           
    'TINYINT'            => Zend_Db::INT_TYPE,
    69           
    'BIGINT'             => Zend_Db::BIGINT_TYPE,
    70           
    'SERIAL'             => Zend_Db::BIGINT_TYPE,
    71           
    'DEC'                => Zend_Db::FLOAT_TYPE,
    72           
    'DECIMAL'            => Zend_Db::FLOAT_TYPE,
    73           
    'DOUBLE'             => Zend_Db::FLOAT_TYPE,
    74           
    'DOUBLE PRECISION'   => Zend_Db::FLOAT_TYPE,
    75           
    'FIXED'              => Zend_Db::FLOAT_TYPE,
    76           
    'FLOAT'              => Zend_Db::FLOAT_TYPE
    77       
    );
    78   
    79       
    /**
    80        * Override _dsn() and ensure that charset is incorporated in mysql
    81        * @see Zend_Db_Adapter_Pdo_Abstract::_dsn()
    82        */
    83       
    protected function _dsn()
    84       {
    85           
    $dsn parent::_dsn();
    86           if (isset(
    $this->_config['charset'])) {
    87               
    $dsn .= ';charset=' $this->_config['charset'];
    88           }
    89           return 
    $dsn;
    90       }
    91       
    92       
    /**
    93        * Creates a PDO object and connects to the database.
    94        *
    95        * @return void
    96        * @throws Zend_Db_Adapter_Exception
    97        */
    98       
    protected function _connect()
    99       {
    100          if (
    $this->_connection) {
    101              return;
    102          }
    103  
    104          if (!empty(
    $this->_config['charset'])) {
    105              
    $initCommand "SET NAMES '" $this->_config['charset'] . "'";
    106              
    $this->_config['driver_options'][1002] = $initCommand// 1002 = PDO::MYSQL_ATTR_INIT_COMMAND
    107          
    }
    108  
    109          
    parent::_connect();
    110      }
    111  
    112      
    /**
    113       * @return string
    114       */
    115      
    public function getQuoteIdentifierSymbol()
    116      {
    117          return 
    "`";
    118      }
    119  
    120      
    /**
    121       * Returns a list of the tables in the database.
    122       *
    123       * @return array
    124       */
    125      
    public function listTables()
    126      {
    127          return 
    $this->fetchCol('SHOW TABLES');
    128      }
    129  
    130      
    /**
    131       * Returns the column descriptions for a table.
    132       *
    133       * The return value is an associative array keyed by the column name,
    134       * as returned by the RDBMS.
    135       *
    136       * The value of each array element is an associative array
    137       * with the following keys:
    138       *
    139       * SCHEMA_NAME      => string; name of database or schema
    140       * TABLE_NAME       => string;
    141       * COLUMN_NAME      => string; column name
    142       * COLUMN_POSITION  => number; ordinal position of column in table
    143       * DATA_TYPE        => string; SQL datatype name of column
    144       * DEFAULT          => string; default expression of column, null if none
    145       * NULLABLE         => boolean; true if column can have nulls
    146       * LENGTH           => number; length of CHAR/VARCHAR
    147       * SCALE            => number; scale of NUMERIC/DECIMAL
    148       * PRECISION        => number; precision of NUMERIC/DECIMAL
    149       * UNSIGNED         => boolean; unsigned property of an integer type
    150       * PRIMARY          => boolean; true if column is part of the primary key
    151       * PRIMARY_POSITION => integer; position of column in primary key
    152       * IDENTITY         => integer; true if column is auto-generated with unique values
    153       *
    154       * @param string $tableName
    155       * @param string $schemaName OPTIONAL
    156       * @return array
    157       */
    158      
    public function describeTable($tableName$schemaName null)
    159      {
    160          
    // @todo  use INFORMATION_SCHEMA someday when MySQL's
    161          // implementation has reasonably good performance and
    162          // the version with this improvement is in wide use.
    163  
    164          
    if ($schemaName) {
    165              
    $sql 'DESCRIBE ' $this->quoteIdentifier("$schemaName.$tableName"true);
    166          } else {
    167              
    $sql 'DESCRIBE ' $this->quoteIdentifier($tableNametrue);
    168          }
    169          
    $stmt $this->query($sql);
    170  
    171          
    // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
    172          
    $result $stmt->fetchAll(Zend_Db::FETCH_NUM);
    173  
    174          
    $field   0;
    175          
    $type    1;
    176          
    $null    2;
    177          
    $key     3;
    178          
    $default 4;
    179          
    $extra   5;
    180  
    181          
    $desc = array();
    182          
    $i 1;
    183          
    $p 1;
    184          foreach (
    $result as $row) {
    185              list(
    $length$scale$precision$unsigned$primary$primaryPosition$identity)
    186                  = array(
    nullnullnullnullfalsenullfalse);
    187              if (
    preg_match('/unsigned/'$row[$type])) {
    188                  
    $unsigned true;
    189              }
    190              if (
    preg_match('/^((?:var)?char)\((\d+)\)/'$row[$type], $matches)) {
    191                  
    $row[$type] = $matches[1];
    192                  
    $length $matches[2];
    193              } else if (
    preg_match('/^decimal\((\d+),(\d+)\)/'$row[$type], $matches)) {
    194                  
    $row[$type] = 'decimal';
    195                  
    $precision $matches[1];
    196                  
    $scale $matches[2];
    197              } else if (
    preg_match('/^float\((\d+),(\d+)\)/'$row[$type], $matches)) {
    198                  
    $row[$type] = 'float';
    199                  
    $precision $matches[1];
    200                  
    $scale $matches[2];
    201              } else if (
    preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/'$row[$type], $matches)) {
    202                  
    $row[$type] = $matches[1];
    203                  
    // The optional argument of a MySQL int type is not precision
    204                  // or length; it is only a hint for display width.
    205              
    }
    206              if (
    strtoupper($row[$key]) == 'PRI') {
    207                  
    $primary true;
    208                  
    $primaryPosition $p;
    209                  if (
    $row[$extra] == 'auto_increment') {
    210                      
    $identity true;
    211                  } else {
    212                      
    $identity false;
    213                  }
    214                  ++
    $p;
    215              }
    216              
    $desc[$this->foldCase($row[$field])] = array(
    217                  
    'SCHEMA_NAME'      => null// @todo
    218                  
    'TABLE_NAME'       => $this->foldCase($tableName),
    219                  
    'COLUMN_NAME'      => $this->foldCase($row[$field]),
    220                  
    'COLUMN_POSITION'  => $i,
    221                  
    'DATA_TYPE'        => $row[$type],
    222                  
    'DEFAULT'          => $row[$default],
    223                  
    'NULLABLE'         => (bool) ($row[$null] == 'YES'),
    224                  
    'LENGTH'           => $length,
    225                  
    'SCALE'            => $scale,
    226                  
    'PRECISION'        => $precision,
    227                  
    'UNSIGNED'         => $unsigned,
    228                  
    'PRIMARY'          => $primary,
    229                  
    'PRIMARY_POSITION' => $primaryPosition,
    230                  
    'IDENTITY'         => $identity
    231              
    );
    232              ++
    $i;
    233          }
    234          return 
    $desc;
    235      }
    236  
    237      
    /**
    238       * Adds an adapter-specific LIMIT clause to the SELECT statement.
    239       *
    240       * @param  string $sql
    241       * @param  integer $count
    242       * @param  integer $offset OPTIONAL
    243       * @throws Zend_Db_Adapter_Exception
    244       * @return string
    245       */
    246       
    public function limit($sql$count$offset 0)
    247       {
    248          
    $count intval($count);
    249          if (
    $count <= 0) {
    250              
    /** @see Zend_Db_Adapter_Exception */
    251              
    require_once 'Zend/Db/Adapter/Exception.php';
    252              throw new 
    Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
    253          }
    254  
    255          
    $offset intval($offset);
    256          if (
    $offset 0) {
    257              
    /** @see Zend_Db_Adapter_Exception */
    258              
    require_once 'Zend/Db/Adapter/Exception.php';
    259              throw new 
    Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
    260          }
    261  
    262          
    $sql .= " LIMIT $count";
    263          if (
    $offset 0) {
    264              
    $sql .= " OFFSET $offset";
    265          }
    266  
    267          return 
    $sql;
    268      }
    269  
    270  }
    271  
  2. open/usr/share/php/libzend-framework-php/Zend/Db/Adapter/Abstract.php
    Zend_Db_Adapter_Pdo_Mysql->_connect()
    1     <?php
    2    
    /**
    3     * Zend Framework
    4     *
    5     * LICENSE
    6     *
    7     * This source file is subject to the new BSD license that is bundled
    8     * with this package in the file LICENSE.txt.
    9     * It is also available through the world-wide-web at this URL:
    10    * http://framework.zend.com/license/new-bsd
    11    * If you did not receive a copy of the license and are unable to
    12    * obtain it through the world-wide-web, please send an email
    13    * to license@zend.com so we can send you a copy immediately.
    14    *
    15    * @category   Zend
    16    * @package    Zend_Db
    17    * @subpackage Adapter
    18    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    19    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    20    * @version    $Id: Abstract.php 24148 2011-06-21 15:14:00Z yoshida@zend.co.jp $
    21    */
    22   
    23   
    24   /**
    25    * @see Zend_Db
    26    */
    27   
    require_once 'Zend/Db.php';
    28   
    29   
    /**
    30    * @see Zend_Db_Select
    31    */
    32   
    require_once 'Zend/Db/Select.php';
    33   
    34   
    /**
    35    * Class for connecting to SQL databases and performing common operations.
    36    *
    37    * @category   Zend
    38    * @package    Zend_Db
    39    * @subpackage Adapter
    40    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    41    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    42    */
    43   
    abstract class Zend_Db_Adapter_Abstract
    44   
    {
    45   
    46       
    /**
    47        * User-provided configuration
    48        *
    49        * @var array
    50        */
    51       
    protected $_config = array();
    52   
    53       
    /**
    54        * Fetch mode
    55        *
    56        * @var integer
    57        */
    58       
    protected $_fetchMode Zend_Db::FETCH_ASSOC;
    59   
    60       
    /**
    61        * Query profiler object, of type Zend_Db_Profiler
    62        * or a subclass of that.
    63        *
    64        * @var Zend_Db_Profiler
    65        */
    66       
    protected $_profiler;
    67   
    68       
    /**
    69        * Default class name for a DB statement.
    70        *
    71        * @var string
    72        */
    73       
    protected $_defaultStmtClass 'Zend_Db_Statement';
    74   
    75       
    /**
    76        * Default class name for the profiler object.
    77        *
    78        * @var string
    79        */
    80       
    protected $_defaultProfilerClass 'Zend_Db_Profiler';
    81   
    82       
    /**
    83        * Database connection
    84        *
    85        * @var object|resource|null
    86        */
    87       
    protected $_connection null;
    88   
    89       
    /**
    90        * Specifies the case of column names retrieved in queries
    91        * Options
    92        * Zend_Db::CASE_NATURAL (default)
    93        * Zend_Db::CASE_LOWER
    94        * Zend_Db::CASE_UPPER
    95        *
    96        * @var integer
    97        */
    98       
    protected $_caseFolding Zend_Db::CASE_NATURAL;
    99   
    100      
    /**
    101       * Specifies whether the adapter automatically quotes identifiers.
    102       * If true, most SQL generated by Zend_Db classes applies
    103       * identifier quoting automatically.
    104       * If false, developer must quote identifiers themselves
    105       * by calling quoteIdentifier().
    106       *
    107       * @var bool
    108       */
    109      
    protected $_autoQuoteIdentifiers true;
    110  
    111      
    /**
    112       * Keys are UPPERCASE SQL datatypes or the constants
    113       * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
    114       *
    115       * Values are:
    116       * 0 = 32-bit integer
    117       * 1 = 64-bit integer
    118       * 2 = float or decimal
    119       *
    120       * @var array Associative array of datatypes to values 0, 1, or 2.
    121       */
    122      
    protected $_numericDataTypes = array(
    123          
    Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
    124          
    Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
    125          
    Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE
    126      
    );
    127  
    128      
    /** Weither or not that object can get serialized
    129       *
    130       * @var bool
    131       */
    132      
    protected $_allowSerialization true;
    133  
    134      
    /**
    135       * Weither or not the database should be reconnected
    136       * to that adapter when waking up
    137       *
    138       * @var bool
    139       */
    140      
    protected $_autoReconnectOnUnserialize false;
    141  
    142      
    /**
    143       * Constructor.
    144       *
    145       * $config is an array of key/value pairs or an instance of Zend_Config
    146       * containing configuration options.  These options are common to most adapters:
    147       *
    148       * dbname         => (string) The name of the database to user
    149       * username       => (string) Connect to the database as this username.
    150       * password       => (string) Password associated with the username.
    151       * host           => (string) What host to connect to, defaults to localhost
    152       *
    153       * Some options are used on a case-by-case basis by adapters:
    154       *
    155       * port           => (string) The port of the database
    156       * persistent     => (boolean) Whether to use a persistent connection or not, defaults to false
    157       * protocol       => (string) The network protocol, defaults to TCPIP
    158       * caseFolding    => (int) style of case-alteration used for identifiers
    159       *
    160       * @param  array|Zend_Config $config An array or instance of Zend_Config having configuration data
    161       * @throws Zend_Db_Adapter_Exception
    162       */
    163      
    public function __construct($config)
    164      {
    165          
    /*
    166           * Verify that adapter parameters are in an array.
    167           */
    168          
    if (!is_array($config)) {
    169              
    /*
    170               * Convert Zend_Config argument to a plain array.
    171               */
    172              
    if ($config instanceof Zend_Config) {
    173                  
    $config $config->toArray();
    174              } else {
    175                  
    /**
    176                   * @see Zend_Db_Adapter_Exception
    177                   */
    178                  
    require_once 'Zend/Db/Adapter/Exception.php';
    179                  throw new 
    Zend_Db_Adapter_Exception('Adapter parameters must be in an array or a Zend_Config object');
    180              }
    181          }
    182  
    183          
    $this->_checkRequiredOptions($config);
    184  
    185          
    $options = array(
    186              
    Zend_Db::CASE_FOLDING           => $this->_caseFolding,
    187              
    Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers,
    188              
    Zend_Db::FETCH_MODE             => $this->_fetchMode,
    189          );
    190          
    $driverOptions = array();
    191  
    192          
    /*
    193           * normalize the config and merge it with the defaults
    194           */
    195          
    if (array_key_exists('options'$config)) {
    196              
    // can't use array_merge() because keys might be integers
    197              
    foreach ((array) $config['options'] as $key => $value) {
    198                  
    $options[$key] = $value;
    199              }
    200          }
    201          if (
    array_key_exists('driver_options'$config)) {
    202              if (!empty(
    $config['driver_options'])) {
    203                  
    // can't use array_merge() because keys might be integers
    204                  
    foreach ((array) $config['driver_options'] as $key => $value) {
    205                      
    $driverOptions[$key] = $value;
    206                  }
    207              }
    208          }
    209  
    210          if (!isset(
    $config['charset'])) {
    211              
    $config['charset'] = null;
    212          }
    213  
    214          if (!isset(
    $config['persistent'])) {
    215              
    $config['persistent'] = false;
    216          }
    217  
    218          
    $this->_config array_merge($this->_config$config);
    219          
    $this->_config['options'] = $options;
    220          
    $this->_config['driver_options'] = $driverOptions;
    221  
    222  
    223          
    // obtain the case setting, if there is one
    224          
    if (array_key_exists(Zend_Db::CASE_FOLDING$options)) {
    225              
    $case = (int) $options[Zend_Db::CASE_FOLDING];
    226              switch (
    $case) {
    227                  case 
    Zend_Db::CASE_LOWER:
    228                  case 
    Zend_Db::CASE_UPPER:
    229                  case 
    Zend_Db::CASE_NATURAL:
    230                      
    $this->_caseFolding $case;
    231                      break;
    232                  default:
    233                      
    /** @see Zend_Db_Adapter_Exception */
    234                      
    require_once 'Zend/Db/Adapter/Exception.php';
    235                      throw new 
    Zend_Db_Adapter_Exception('Case must be one of the following constants: '
    236                          
    'Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER');
    237              }
    238          }
    239  
    240          if (
    array_key_exists(Zend_Db::FETCH_MODE$options)) {
    241              if (
    is_string($options[Zend_Db::FETCH_MODE])) {
    242                  
    $constant 'Zend_Db::FETCH_' strtoupper($options[Zend_Db::FETCH_MODE]);
    243                  if(
    defined($constant)) {
    244                      
    $options[Zend_Db::FETCH_MODE] = constant($constant);
    245                  }
    246              }
    247              
    $this->setFetchMode((int) $options[Zend_Db::FETCH_MODE]);
    248          }
    249  
    250          
    // obtain quoting property if there is one
    251          
    if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS$options)) {
    252              
    $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];
    253          }
    254  
    255          
    // obtain allow serialization property if there is one
    256          
    if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION$options)) {
    257              
    $this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION];
    258          }
    259  
    260          
    // obtain auto reconnect on unserialize property if there is one
    261          
    if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE$options)) {
    262              
    $this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE];
    263          }
    264  
    265          
    // create a profiler object
    266          
    $profiler false;
    267          if (
    array_key_exists(Zend_Db::PROFILER$this->_config)) {
    268              
    $profiler $this->_config[Zend_Db::PROFILER];
    269              unset(
    $this->_config[Zend_Db::PROFILER]);
    270          }
    271          
    $this->setProfiler($profiler);
    272      }
    273  
    274      
    /**
    275       * Check for config options that are mandatory.
    276       * Throw exceptions if any are missing.
    277       *
    278       * @param array $config
    279       * @throws Zend_Db_Adapter_Exception
    280       */
    281      
    protected function _checkRequiredOptions(array $config)
    282      {
    283          
    // we need at least a dbname
    284          
    if (! array_key_exists('dbname'$config)) {
    285              
    /** @see Zend_Db_Adapter_Exception */
    286              
    require_once 'Zend/Db/Adapter/Exception.php';
    287              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance");
    288          }
    289  
    290          if (! 
    array_key_exists('password'$config)) {
    291              
    /**
    292               * @see Zend_Db_Adapter_Exception
    293               */
    294              
    require_once 'Zend/Db/Adapter/Exception.php';
    295              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials");
    296          }
    297  
    298          if (! 
    array_key_exists('username'$config)) {
    299              
    /**
    300               * @see Zend_Db_Adapter_Exception
    301               */
    302              
    require_once 'Zend/Db/Adapter/Exception.php';
    303              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials");
    304          }
    305      }
    306  
    307      
    /**
    308       * Returns the underlying database connection object or resource.
    309       * If not presently connected, this initiates the connection.
    310       *
    311       * @return object|resource|null
    312       */
    313      
    public function getConnection()
    314      {
    315          
    $this->_connect();
    316          return 
    $this->_connection;
    317      }
    318  
    319      
    /**
    320       * Returns the configuration variables in this adapter.
    321       *
    322       * @return array
    323       */
    324      
    public function getConfig()
    325      {
    326          return 
    $this->_config;
    327      }
    328  
    329      
    /**
    330       * Set the adapter's profiler object.
    331       *
    332       * The argument may be a boolean, an associative array, an instance of
    333       * Zend_Db_Profiler, or an instance of Zend_Config.
    334       *
    335       * A boolean argument sets the profiler to enabled if true, or disabled if
    336       * false.  The profiler class is the adapter's default profiler class,
    337       * Zend_Db_Profiler.
    338       *
    339       * An instance of Zend_Db_Profiler sets the adapter's instance to that
    340       * object.  The profiler is enabled and disabled separately.
    341       *
    342       * An associative array argument may contain any of the keys 'enabled',
    343       * 'class', and 'instance'. The 'enabled' and 'instance' keys correspond to the
    344       * boolean and object types documented above. The 'class' key is used to name a
    345       * class to use for a custom profiler. The class must be Zend_Db_Profiler or a
    346       * subclass. The class is instantiated with no constructor arguments. The 'class'
    347       * option is ignored when the 'instance' option is supplied.
    348       *
    349       * An object of type Zend_Config may contain the properties 'enabled', 'class', and
    350       * 'instance', just as if an associative array had been passed instead.
    351       *
    352       * @param  Zend_Db_Profiler|Zend_Config|array|boolean $profiler
    353       * @return Zend_Db_Adapter_Abstract Provides a fluent interface
    354       * @throws Zend_Db_Profiler_Exception if the object instance or class specified
    355       *         is not Zend_Db_Profiler or an extension of that class.
    356       */
    357      
    public function setProfiler($profiler)
    358      {
    359          
    $enabled          null;
    360          
    $profilerClass    $this->_defaultProfilerClass;
    361          
    $profilerInstance null;
    362  
    363          if (
    $profilerIsObject is_object($profiler)) {
    364              if (
    $profiler instanceof Zend_Db_Profiler) {
    365                  
    $profilerInstance $profiler;
    366              } else if (
    $profiler instanceof Zend_Config) {
    367                  
    $profiler $profiler->toArray();
    368              } else {
    369                  
    /**
    370                   * @see Zend_Db_Profiler_Exception
    371                   */
    372                  
    require_once 'Zend/Db/Profiler/Exception.php';
    373                  throw new 
    Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler'
    374                      
    ' or Zend_Config when provided as an object');
    375              }
    376          }
    377  
    378          if (
    is_array($profiler)) {
    379              if (isset(
    $profiler['enabled'])) {
    380                  
    $enabled = (bool) $profiler['enabled'];
    381              }
    382              if (isset(
    $profiler['class'])) {
    383                  
    $profilerClass $profiler['class'];
    384              }
    385              if (isset(
    $profiler['instance'])) {
    386                  
    $profilerInstance $profiler['instance'];
    387              }
    388          } else if (!
    $profilerIsObject) {
    389              
    $enabled = (bool) $profiler;
    390          }
    391  
    392          if (
    $profilerInstance === null) {
    393              if (!
    class_exists($profilerClass)) {
    394                  require_once 
    'Zend/Loader.php';
    395                  
    Zend_Loader::loadClass($profilerClass);
    396              }
    397              
    $profilerInstance = new $profilerClass();
    398          }
    399  
    400          if (!
    $profilerInstance instanceof Zend_Db_Profiler) {
    401              
    /** @see Zend_Db_Profiler_Exception */
    402              
    require_once 'Zend/Db/Profiler/Exception.php';
    403              throw new 
    Zend_Db_Profiler_Exception('Class ' get_class($profilerInstance) . ' does not extend '
    404                  
    'Zend_Db_Profiler');
    405          }
    406  
    407          if (
    null !== $enabled) {
    408              
    $profilerInstance->setEnabled($enabled);
    409          }
    410  
    411          
    $this->_profiler $profilerInstance;
    412  
    413          return 
    $this;
    414      }
    415  
    416  
    417      
    /**
    418       * Returns the profiler for this adapter.
    419       *
    420       * @return Zend_Db_Profiler
    421       */
    422      
    public function getProfiler()
    423      {
    424          return 
    $this->_profiler;
    425      }
    426  
    427      
    /**
    428       * Get the default statement class.
    429       *
    430       * @return string
    431       */
    432      
    public function getStatementClass()
    433      {
    434          return 
    $this->_defaultStmtClass;
    435      }
    436  
    437      
    /**
    438       * Set the default statement class.
    439       *
    440       * @return Zend_Db_Adapter_Abstract Fluent interface
    441       */
    442      
    public function setStatementClass($class)
    443      {
    444          
    $this->_defaultStmtClass $class;
    445          return 
    $this;
    446      }
    447  
    448      
    /**
    449       * Prepares and executes an SQL statement with bound data.
    450       *
    451       * @param  mixed  $sql  The SQL statement with placeholders.
    452       *                      May be a string or Zend_Db_Select.
    453       * @param  mixed  $bind An array of data to bind to the placeholders.
    454       * @return Zend_Db_Statement_Interface
    455       */
    456      
    public function query($sql$bind = array())
    457      {
    458          
    // connect to the database if needed
    459          
    $this->_connect();
    460  
    461          
    // is the $sql a Zend_Db_Select object?
    462          
    if ($sql instanceof Zend_Db_Select) {
    463              if (empty(
    $bind)) {
    464                  
    $bind $sql->getBind();
    465              }
    466  
    467              
    $sql $sql->assemble();
    468          }
    469  
    470          
    // make sure $bind to an array;
    471          // don't use (array) typecasting because
    472          // because $bind may be a Zend_Db_Expr object
    473          
    if (!is_array($bind)) {
    474              
    $bind = array($bind);
    475          }
    476  
    477          
    // prepare and execute the statement with profiling
    478          
    $stmt $this->prepare($sql);
    479          
    $stmt->execute($bind);
    480  
    481          
    // return the results embedded in the prepared statement object
    482          
    $stmt->setFetchMode($this->_fetchMode);
    483          return 
    $stmt;
    484      }
    485  
    486      
    /**
    487       * Leave autocommit mode and begin a transaction.
    488       *
    489       * @return Zend_Db_Adapter_Abstract
    490       */
    491      
    public function beginTransaction()
    492      {
    493          
    $this->_connect();
    494          
    $q $this->_profiler->queryStart('begin'Zend_Db_Profiler::TRANSACTION);
    495          
    $this->_beginTransaction();
    496          
    $this->_profiler->queryEnd($q);
    497          return 
    $this;
    498      }
    499  
    500      
    /**
    501       * Commit a transaction and return to autocommit mode.
    502       *
    503       * @return Zend_Db_Adapter_Abstract
    504       */
    505      
    public function commit()
    506      {
    507          
    $this->_connect();
    508          
    $q $this->_profiler->queryStart('commit'Zend_Db_Profiler::TRANSACTION);
    509          
    $this->_commit();
    510          
    $this->_profiler->queryEnd($q);
    511          return 
    $this;
    512      }
    513  
    514      
    /**
    515       * Roll back a transaction and return to autocommit mode.
    516       *
    517       * @return Zend_Db_Adapter_Abstract
    518       */
    519      
    public function rollBack()
    520      {
    521          
    $this->_connect();
    522          
    $q $this->_profiler->queryStart('rollback'Zend_Db_Profiler::TRANSACTION);
    523          
    $this->_rollBack();
    524          
    $this->_profiler->queryEnd($q);
    525          return 
    $this;
    526      }
    527  
    528      
    /**
    529       * Inserts a table row with specified data.
    530       *
    531       * @param mixed $table The table to insert data into.
    532       * @param array $bind Column-value pairs.
    533       * @return int The number of affected rows.
    534       * @throws Zend_Db_Adapter_Exception
    535       */
    536      
    public function insert($table, array $bind)
    537      {
    538          
    // extract and quote col names from the array keys
    539          
    $cols = array();
    540          
    $vals = array();
    541          
    $i 0;
    542          foreach (
    $bind as $col => $val) {
    543              
    $cols[] = $this->quoteIdentifier($coltrue);
    544              if (
    $val instanceof Zend_Db_Expr) {
    545                  
    $vals[] = $val->__toString();
    546                  unset(
    $bind[$col]);
    547              } else {
    548                  if (
    $this->supportsParameters('positional')) {
    549                      
    $vals[] = '?';
    550                  } else {
    551                      if (
    $this->supportsParameters('named')) {
    552                          unset(
    $bind[$col]);
    553                          
    $bind[':col'.$i] = $val;
    554                          
    $vals[] = ':col'.$i;
    555                          
    $i++;
    556                      } else {
    557                          
    /** @see Zend_Db_Adapter_Exception */
    558                          
    require_once 'Zend/Db/Adapter/Exception.php';
    559                          throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
    560                      }
    561                  }
    562              }
    563          }
    564  
    565          
    // build the statement
    566          
    $sql "INSERT INTO "
    567               
    $this->quoteIdentifier($tabletrue)
    568               . 
    ' (' implode(', '$cols) . ') '
    569               
    'VALUES (' implode(', '$vals) . ')';
    570  
    571          
    // execute the statement and return the number of affected rows
    572          
    if ($this->supportsParameters('positional')) {
    573              
    $bind array_values($bind);
    574          }
    575          
    $stmt $this->query($sql$bind);
    576          
    $result $stmt->rowCount();
    577          return 
    $result;
    578      }
    579  
    580      
    /**
    581       * Updates table rows with specified data based on a WHERE clause.
    582       *
    583       * @param  mixed        $table The table to update.
    584       * @param  array        $bind  Column-value pairs.
    585       * @param  mixed        $where UPDATE WHERE clause(s).
    586       * @return int          The number of affected rows.
    587       * @throws Zend_Db_Adapter_Exception
    588       */
    589      
    public function update($table, array $bind$where '')
    590      {
    591          
    /**
    592           * Build "col = ?" pairs for the statement,
    593           * except for Zend_Db_Expr which is treated literally.
    594           */
    595          
    $set = array();
    596          
    $i 0;
    597          foreach (
    $bind as $col => $val) {
    598              if (
    $val instanceof Zend_Db_Expr) {
    599                  
    $val $val->__toString();
    600                  unset(
    $bind[$col]);
    601              } else {
    602                  if (
    $this->supportsParameters('positional')) {
    603                      
    $val '?';
    604                  } else {
    605                      if (
    $this->supportsParameters('named')) {
    606                          unset(
    $bind[$col]);
    607                          
    $bind[':col'.$i] = $val;
    608                          
    $val ':col'.$i;
    609                          
    $i++;
    610                      } else {
    611                          
    /** @see Zend_Db_Adapter_Exception */
    612                          
    require_once 'Zend/Db/Adapter/Exception.php';
    613                          throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
    614                      }
    615                  }
    616              }
    617              
    $set[] = $this->quoteIdentifier($coltrue) . ' = ' $val;
    618          }
    619  
    620          
    $where $this->_whereExpr($where);
    621  
    622          
    /**
    623           * Build the UPDATE statement
    624           */
    625          
    $sql "UPDATE "
    626               
    $this->quoteIdentifier($tabletrue)
    627               . 
    ' SET ' implode(', '$set)
    628               . ((
    $where) ? " WHERE $where'');
    629  
    630          
    /**
    631           * Execute the statement and return the number of affected rows
    632           */
    633          
    if ($this->supportsParameters('positional')) {
    634              
    $stmt $this->query($sqlarray_values($bind));
    635          } else {
    636              
    $stmt $this->query($sql$bind);
    637          }
    638          
    $result $stmt->rowCount();
    639          return 
    $result;
    640      }
    641  
    642      
    /**
    643       * Deletes table rows based on a WHERE clause.
    644       *
    645       * @param  mixed        $table The table to update.
    646       * @param  mixed        $where DELETE WHERE clause(s).
    647       * @return int          The number of affected rows.
    648       */
    649      
    public function delete($table$where '')
    650      {
    651          
    $where $this->_whereExpr($where);
    652  
    653          
    /**
    654           * Build the DELETE statement
    655           */
    656          
    $sql "DELETE FROM "
    657               
    $this->quoteIdentifier($tabletrue)
    658               . ((
    $where) ? " WHERE $where'');
    659  
    660          
    /**
    661           * Execute the statement and return the number of affected rows
    662           */
    663          
    $stmt $this->query($sql);
    664          
    $result $stmt->rowCount();
    665          return 
    $result;
    666      }
    667  
    668      
    /**
    669       * Convert an array, string, or Zend_Db_Expr object
    670       * into a string to put in a WHERE clause.
    671       *
    672       * @param mixed $where
    673       * @return string
    674       */
    675      
    protected function _whereExpr($where)
    676      {
    677          if (empty(
    $where)) {
    678              return 
    $where;
    679          }
    680          if (!
    is_array($where)) {
    681              
    $where = array($where);
    682          }
    683          foreach (
    $where as $cond => &$term) {
    684              
    // is $cond an int? (i.e. Not a condition)
    685              
    if (is_int($cond)) {
    686                  
    // $term is the full condition
    687                  
    if ($term instanceof Zend_Db_Expr) {
    688                      
    $term $term->__toString();
    689                  }
    690              } else {
    691                  
    // $cond is the condition with placeholder,
    692                  // and $term is quoted into the condition
    693                  
    $term $this->quoteInto($cond$term);
    694              }
    695              
    $term '(' $term ')';
    696          }
    697  
    698          
    $where implode(' AND '$where);
    699          return 
    $where;
    700      }
    701  
    702      
    /**
    703       * Creates and returns a new Zend_Db_Select object for this adapter.
    704       *
    705       * @return Zend_Db_Select
    706       */
    707      
    public function select()
    708      {
    709          return new 
    Zend_Db_Select($this);
    710      }
    711  
    712      
    /**
    713       * Get the fetch mode.
    714       *
    715       * @return int
    716       */
    717      
    public function getFetchMode()
    718      {
    719          return 
    $this->_fetchMode;
    720      }
    721  
    722      
    /**
    723       * Fetches all SQL result rows as a sequential array.
    724       * Uses the current fetchMode for the adapter.
    725       *
    726       * @param string|Zend_Db_Select $sql  An SQL SELECT statement.
    727       * @param mixed                 $bind Data to bind into SELECT placeholders.
    728       * @param mixed                 $fetchMode Override current fetch mode.
    729       * @return array
    730       */
    731      
    public function fetchAll($sql$bind = array(), $fetchMode null)
    732      {
    733          if (
    $fetchMode === null) {
    734              
    $fetchMode $this->_fetchMode;
    735          }
    736          
    $stmt $this->query($sql$bind);
    737          
    $result $stmt->fetchAll($fetchMode);
    738          return 
    $result;
    739      }
    740  
    741      
    /**
    742       * Fetches the first row of the SQL result.
    743       * Uses the current fetchMode for the adapter.
    744       *
    745       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    746       * @param mixed $bind Data to bind into SELECT placeholders.
    747       * @param mixed                 $fetchMode Override current fetch mode.
    748       * @return array
    749       */
    750      
    public function fetchRow($sql$bind = array(), $fetchMode null)
    751      {
    752          if (
    $fetchMode === null) {
    753              
    $fetchMode $this->_fetchMode;
    754          }
    755          
    $stmt $this->query($sql$bind);
    756          
    $result $stmt->fetch($fetchMode);
    757          return 
    $result;
    758      }
    759  
    760      
    /**
    761       * Fetches all SQL result rows as an associative array.
    762       *
    763       * The first column is the key, the entire row array is the
    764       * value.  You should construct the query to be sure that
    765       * the first column contains unique values, or else
    766       * rows with duplicate values in the first column will
    767       * overwrite previous data.
    768       *
    769       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    770       * @param mixed $bind Data to bind into SELECT placeholders.
    771       * @return array
    772       */
    773      
    public function fetchAssoc($sql$bind = array())
    774      {
    775          
    $stmt $this->query($sql$bind);
    776          
    $data = array();
    777          while (
    $row $stmt->fetch(Zend_Db::FETCH_ASSOC)) {
    778              
    $tmp array_values(array_slice($row01));
    779              
    $data[$tmp[0]] = $row;
    780          }
    781          return 
    $data;
    782      }
    783  
    784      
    /**
    785       * Fetches the first column of all SQL result rows as an array.
    786       *
    787       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    788       * @param mixed $bind Data to bind into SELECT placeholders.
    789       * @return array
    790       */
    791      
    public function fetchCol($sql$bind = array())
    792      {
    793          
    $stmt $this->query($sql$bind);
    794          
    $result $stmt->fetchAll(Zend_Db::FETCH_COLUMN0);
    795          return 
    $result;
    796      }
    797  
    798      
    /**
    799       * Fetches all SQL result rows as an array of key-value pairs.
    800       *
    801       * The first column is the key, the second column is the
    802       * value.
    803       *
    804       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    805       * @param mixed $bind Data to bind into SELECT placeholders.
    806       * @return array
    807       */
    808      
    public function fetchPairs($sql$bind = array())
    809      {
    810          
    $stmt $this->query($sql$bind);
    811          
    $data = array();
    812          while (
    $row $stmt->fetch(Zend_Db::FETCH_NUM)) {
    813              
    $data[$row[0]] = $row[1];
    814          }
    815          return 
    $data;
    816      }
    817  
    818      
    /**
    819       * Fetches the first column of the first row of the SQL result.
    820       *
    821       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    822       * @param mixed $bind Data to bind into SELECT placeholders.
    823       * @return string
    824       */
    825      
    public function fetchOne($sql$bind = array())
    826      {
    827          
    $stmt $this->query($sql$bind);
    828          
    $result $stmt->fetchColumn(0);
    829          return 
    $result;
    830      }
    831  
    832      
    /**
    833       * Quote a raw string.
    834       *
    835       * @param string $value     Raw string
    836       * @return string           Quoted string
    837       */
    838      
    protected function _quote($value)
    839      {
    840          if (
    is_int($value)) {
    841              return 
    $value;
    842          } elseif (
    is_float($value)) {
    843              return 
    sprintf('%F'$value);
    844          }
    845          return 
    "'" addcslashes($value"\000\n\r\\'\"\032") . "'";
    846      }
    847  
    848      
    /**
    849       * Safely quotes a value for an SQL statement.
    850       *
    851       * If an array is passed as the value, the array values are quoted
    852       * and then returned as a comma-separated string.
    853       *
    854       * @param mixed $value The value to quote.
    855       * @param mixed $type  OPTIONAL the SQL datatype name, or constant, or null.
    856       * @return mixed An SQL-safe quoted value (or string of separated values).
    857       */
    858      
    public function quote($value$type null)
    859      {
    860          
    $this->_connect();
    861  
    862          if (
    $value instanceof Zend_Db_Select) {
    863              return 
    '(' $value->assemble() . ')';
    864          }
    865  
    866          if (
    $value instanceof Zend_Db_Expr) {
    867              return 
    $value->__toString();
    868          }
    869  
    870          if (
    is_array($value)) {
    871              foreach (
    $value as &$val) {
    872                  
    $val $this->quote($val$type);
    873              }
    874              return 
    implode(', '$value);
    875          }
    876  
    877          if (
    $type !== null && array_key_exists($type strtoupper($type), $this->_numericDataTypes)) {
    878              
    $quotedValue '0';
    879              switch (
    $this->_numericDataTypes[$type]) {
    880                  case 
    Zend_Db::INT_TYPE// 32-bit integer
    881                      
    $quotedValue = (string) intval($value);
    882                      break;
    883                  case 
    Zend_Db::BIGINT_TYPE// 64-bit integer
    884                      // ANSI SQL-style hex literals (e.g. x'[\dA-F]+')
    885                      // are not supported here, because these are string
    886                      // literals, not numeric literals.
    887                      
    if (preg_match('/^(
    888                            [+-]?                  # optional sign
    889                            (?:
    890                              0[Xx][\da-fA-F]+     # ODBC-style hexadecimal
    891                              |\d+                 # decimal or octal, or MySQL ZEROFILL decimal
    892                              (?:[eE][+-]?\d+)?    # optional exponent on decimals or octals
    893                            )
    894                          )/x'
    ,
    895                          (string) 
    $value$matches)) {
    896                          
    $quotedValue $matches[1];
    897                      }
    898                      break;
    899                  case 
    Zend_Db::FLOAT_TYPE// float or decimal
    900                      
    $quotedValue sprintf('%F'$value);
    901              }
    902              return 
    $quotedValue;
    903          }
    904  
    905          return 
    $this->_quote($value);
    906      }
    907  
    908      
    /**
    909       * Quotes a value and places into a piece of text at a placeholder.
    910       *
    911       * The placeholder is a question-mark; all placeholders will be replaced
    912       * with the quoted value.   For example:
    913       *
    914       * <code>
    915       * $text = "WHERE date < ?";
    916       * $date = "2005-01-02";
    917       * $safe = $sql->quoteInto($text, $date);
    918       * // $safe = "WHERE date < '2005-01-02'"
    919       * </code>
    920       *
    921       * @param string  $text  The text with a placeholder.
    922       * @param mixed   $value The value to quote.
    923       * @param string  $type  OPTIONAL SQL datatype
    924       * @param integer $count OPTIONAL count of placeholders to replace
    925       * @return string An SQL-safe quoted value placed into the original text.
    926       */
    927      
    public function quoteInto($text$value$type null$count null)
    928      {
    929          if (
    $count === null) {
    930              return 
    str_replace('?'$this->quote($value$type), $text);
    931          } else {
    932              while (
    $count 0) {
    933                  if (
    strpos($text'?') !== false) {
    934                      
    $text substr_replace($text$this->quote($value$type), strpos($text'?'), 1);
    935                  }
    936                  --
    $count;
    937              }
    938              return 
    $text;
    939          }
    940      }
    941  
    942      
    /**
    943       * Quotes an identifier.
    944       *
    945       * Accepts a string representing a qualified indentifier. For Example:
    946       * <code>
    947       * $adapter->quoteIdentifier('myschema.mytable')
    948       * </code>
    949       * Returns: "myschema"."mytable"
    950       *
    951       * Or, an array of one or more identifiers that may form a qualified identifier:
    952       * <code>
    953       * $adapter->quoteIdentifier(array('myschema','my.table'))
    954       * </code>
    955       * Returns: "myschema"."my.table"
    956       *
    957       * The actual quote character surrounding the identifiers may vary depending on
    958       * the adapter.
    959       *
    960       * @param string|array|Zend_Db_Expr $ident The identifier.
    961       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    962       * @return string The quoted identifier.
    963       */
    964      
    public function quoteIdentifier($ident$auto=false)
    965      {
    966          return 
    $this->_quoteIdentifierAs($identnull$auto);
    967      }
    968  
    969      
    /**
    970       * Quote a column identifier and alias.
    971       *
    972       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    973       * @param string $alias An alias for the column.
    974       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    975       * @return string The quoted identifier and alias.
    976       */
    977      
    public function quoteColumnAs($ident$alias$auto=false)
    978      {
    979          return 
    $this->_quoteIdentifierAs($ident$alias$auto);
    980      }
    981  
    982      
    /**
    983       * Quote a table identifier and alias.
    984       *
    985       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    986       * @param string $alias An alias for the table.
    987       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    988       * @return string The quoted identifier and alias.
    989       */
    990      
    public function quoteTableAs($ident$alias null$auto false)
    991      {
    992          return 
    $this->_quoteIdentifierAs($ident$alias$auto);
    993      }
    994  
    995      
    /**
    996       * Quote an identifier and an optional alias.
    997       *
    998       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    999       * @param string $alias An optional alias.
    1000      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    1001      * @param string $as The string to add between the identifier/expression and the alias.
    1002      * @return string The quoted identifier and alias.
    1003      */
    1004     
    protected function _quoteIdentifierAs($ident$alias null$auto false$as ' AS ')
    1005     {
    1006         if (
    $ident instanceof Zend_Db_Expr) {
    1007             
    $quoted $ident->__toString();
    1008         } elseif (
    $ident instanceof Zend_Db_Select) {
    1009             
    $quoted '(' $ident->assemble() . ')';
    1010         } else {
    1011             if (
    is_string($ident)) {
    1012                 
    $ident explode('.'$ident);
    1013             }
    1014             if (
    is_array($ident)) {
    1015                 
    $segments = array();
    1016                 foreach (
    $ident as $segment) {
    1017                     if (
    $segment instanceof Zend_Db_Expr) {
    1018                         
    $segments[] = $segment->__toString();
    1019                     } else {
    1020                         
    $segments[] = $this->_quoteIdentifier($segment$auto);
    1021                     }
    1022                 }
    1023                 if (
    $alias !== null && end($ident) == $alias) {
    1024                     
    $alias null;
    1025                 }
    1026                 
    $quoted implode('.'$segments);
    1027             } else {
    1028                 
    $quoted $this->_quoteIdentifier($ident$auto);
    1029             }
    1030         }
    1031         if (
    $alias !== null) {
    1032             
    $quoted .= $as $this->_quoteIdentifier($alias$auto);
    1033         }
    1034         return 
    $quoted;
    1035     }
    1036 
    1037     
    /**
    1038      * Quote an identifier.
    1039      *
    1040      * @param  string $value The identifier or expression.
    1041      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    1042      * @return string        The quoted identifier and alias.
    1043      */
    1044     
    protected function _quoteIdentifier($value$auto=false)
    1045     {
    1046         if (
    $auto === false || $this->_autoQuoteIdentifiers === true) {
    1047             
    $q $this->getQuoteIdentifierSymbol();
    1048             return (
    $q str_replace("$q""$q$q"$value) . $q);
    1049         }
    1050         return 
    $value;
    1051     }
    1052 
    1053     
    /**
    1054      * Returns the symbol the adapter uses for delimited identifiers.
    1055      *
    1056      * @return string
    1057      */
    1058     
    public function getQuoteIdentifierSymbol()
    1059     {
    1060         return 
    '"';
    1061     }
    1062 
    1063     
    /**
    1064      * Return the most recent value from the specified sequence in the database.
    1065      * This is supported only on RDBMS brands that support sequences
    1066      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
    1067      *
    1068      * @param string $sequenceName
    1069      * @return string
    1070      */
    1071     
    public function lastSequenceId($sequenceName)
    1072     {
    1073         return 
    null;
    1074     }
    1075 
    1076     
    /**
    1077      * Generate a new value from the specified sequence in the database, and return it.
    1078      * This is supported only on RDBMS brands that support sequences
    1079      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
    1080      *
    1081      * @param string $sequenceName
    1082      * @return string
    1083      */
    1084     
    public function nextSequenceId($sequenceName)
    1085     {
    1086         return 
    null;
    1087     }
    1088 
    1089     
    /**
    1090      * Helper method to change the case of the strings used
    1091      * when returning result sets in FETCH_ASSOC and FETCH_BOTH
    1092      * modes.
    1093      *
    1094      * This is not intended to be used by application code,
    1095      * but the method must be public so the Statement class
    1096      * can invoke it.
    1097      *
    1098      * @param string $key
    1099      * @return string
    1100      */
    1101     
    public function foldCase($key)
    1102     {
    1103         switch (
    $this->_caseFolding) {
    1104             case 
    Zend_Db::CASE_LOWER:
    1105                 
    $value strtolower((string) $key);
    1106                 break;
    1107             case 
    Zend_Db::CASE_UPPER:
    1108                 
    $value strtoupper((string) $key);
    1109                 break;
    1110             case 
    Zend_Db::CASE_NATURAL:
    1111             default:
    1112                 
    $value = (string) $key;
    1113         }
    1114         return 
    $value;
    1115     }
    1116 
    1117     
    /**
    1118      * called when object is getting serialized
    1119      * This disconnects the DB object that cant be serialized
    1120      *
    1121      * @throws Zend_Db_Adapter_Exception
    1122      * @return array
    1123      */
    1124     
    public function __sleep()
    1125     {
    1126         if (
    $this->_allowSerialization == false) {
    1127             
    /** @see Zend_Db_Adapter_Exception */
    1128             
    require_once 'Zend/Db/Adapter/Exception.php';
    1129             throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized");
    1130         }
    1131         
    $this->_connection false;
    1132         return 
    array_keys(array_diff_key(get_object_vars($this), array('_connection'=>false)));
    1133     }
    1134 
    1135     
    /**
    1136      * called when object is getting unserialized
    1137      *
    1138      * @return void
    1139      */
    1140     
    public function __wakeup()
    1141     {
    1142         if (
    $this->_autoReconnectOnUnserialize == true) {
    1143             
    $this->getConnection();
    1144         }
    1145     }
    1146 
    1147     
    /**
    1148      * Abstract Methods
    1149      */
    1150 
    1151     /**
    1152      * Returns a list of the tables in the database.
    1153      *
    1154      * @return array
    1155      */
    1156     
    abstract public function listTables();
    1157 
    1158     
    /**
    1159      * Returns the column descriptions for a table.
    1160      *
    1161      * The return value is an associative array keyed by the column name,
    1162      * as returned by the RDBMS.
    1163      *
    1164      * The value of each array element is an associative array
    1165      * with the following keys:
    1166      *
    1167      * SCHEMA_NAME => string; name of database or schema
    1168      * TABLE_NAME  => string;
    1169      * COLUMN_NAME => string; column name
    1170      * COLUMN_POSITION => number; ordinal position of column in table
    1171      * DATA_TYPE   => string; SQL datatype name of column
    1172      * DEFAULT     => string; default expression of column, null if none
    1173      * NULLABLE    => boolean; true if column can have nulls
    1174      * LENGTH      => number; length of CHAR/VARCHAR
    1175      * SCALE       => number; scale of NUMERIC/DECIMAL
    1176      * PRECISION   => number; precision of NUMERIC/DECIMAL
    1177      * UNSIGNED    => boolean; unsigned property of an integer type
    1178      * PRIMARY     => boolean; true if column is part of the primary key
    1179      * PRIMARY_POSITION => integer; position of column in primary key
    1180      *
    1181      * @param string $tableName
    1182      * @param string $schemaName OPTIONAL
    1183      * @return array
    1184      */
    1185     
    abstract public function describeTable($tableName$schemaName null);
    1186 
    1187     
    /**
    1188      * Creates a connection to the database.
    1189      *
    1190      * @return void
    1191      */
    1192     
    abstract protected function _connect();
    1193 
    1194     
    /**
    1195      * Test if a connection is active
    1196      *
    1197      * @return boolean
    1198      */
    1199     
    abstract public function isConnected();
    1200 
    1201     
    /**
    1202      * Force the connection to close.
    1203      *
    1204      * @return void
    1205      */
    1206     
    abstract public function closeConnection();
    1207 
    1208     
    /**
    1209      * Prepare a statement and return a PDOStatement-like object.
    1210      *
    1211      * @param string|Zend_Db_Select $sql SQL query
    1212      * @return Zend_Db_Statement|PDOStatement
    1213      */
    1214     
    abstract public function prepare($sql);
    1215 
    1216     
    /**
    1217      * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
    1218      *
    1219      * As a convention, on RDBMS brands that support sequences
    1220      * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
    1221      * from the arguments and returns the last id generated by that sequence.
    1222      * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
    1223      * returns the last value generated for such a column, and the table name
    1224      * argument is disregarded.
    1225      *
    1226      * @param string $tableName   OPTIONAL Name of table.
    1227      * @param string $primaryKey  OPTIONAL Name of primary key column.
    1228      * @return string
    1229      */
    1230     
    abstract public function lastInsertId($tableName null$primaryKey null);
    1231 
    1232     
    /**
    1233      * Begin a transaction.
    1234      */
    1235     
    abstract protected function _beginTransaction();
    1236 
    1237     
    /**
    1238      * Commit a transaction.
    1239      */
    1240     
    abstract protected function _commit();
    1241 
    1242     
    /**
    1243      * Roll-back a transaction.
    1244      */
    1245     
    abstract protected function _rollBack();
    1246 
    1247     
    /**
    1248      * Set the fetch mode.
    1249      *
    1250      * @param integer $mode
    1251      * @return void
    1252      * @throws Zend_Db_Adapter_Exception
    1253      */
    1254     
    abstract public function setFetchMode($mode);
    1255 
    1256     
    /**
    1257      * Adds an adapter-specific LIMIT clause to the SELECT statement.
    1258      *
    1259      * @param mixed $sql
    1260      * @param integer $count
    1261      * @param integer $offset
    1262      * @return string
    1263      */
    1264     
    abstract public function limit($sql$count$offset 0);
    1265 
    1266     
    /**
    1267      * Check if the adapter supports real SQL parameters.
    1268      *
    1269      * @param string $type 'positional' or 'named'
    1270      * @return bool
    1271      */
    1272     
    abstract public function supportsParameters($type);
    1273 
    1274     
    /**
    1275      * Retrieve server version in PHP style
    1276      *
    1277      * @return string
    1278      */
    1279     
    abstract public function getServerVersion();
    1280 }
    1281 
  3. open/usr/share/php/libzend-framework-php/Zend/Db/Adapter/Pdo/Abstract.php
    Zend_Db_Adapter_Abstract->query('SELECT *,a.name as app,t.name as tag,a.id as id FROM apps a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=0 ORDER BY RAND() LIMIT 15', Array(0))
    1     <?php
    2    
    /**
    3     * Zend Framework
    4     *
    5     * LICENSE
    6     *
    7     * This source file is subject to the new BSD license that is bundled
    8     * with this package in the file LICENSE.txt.
    9     * It is also available through the world-wide-web at this URL:
    10    * http://framework.zend.com/license/new-bsd
    11    * If you did not receive a copy of the license and are unable to
    12    * obtain it through the world-wide-web, please send an email
    13    * to license@zend.com so we can send you a copy immediately.
    14    *
    15    * @category   Zend
    16    * @package    Zend_Db
    17    * @subpackage Adapter
    18    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    19    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    20    * @version    $Id: Abstract.php 23775 2011-03-01 17:25:24Z ralph $
    21    */
    22   
    23   
    24   /**
    25    * @see Zend_Db_Adapter_Abstract
    26    */
    27   
    require_once 'Zend/Db/Adapter/Abstract.php';
    28   
    29   
    30   
    /**
    31    * @see Zend_Db_Statement_Pdo
    32    */
    33   
    require_once 'Zend/Db/Statement/Pdo.php';
    34   
    35   
    36   
    /**
    37    * Class for connecting to SQL databases and performing common operations using PDO.
    38    *
    39    * @category   Zend
    40    * @package    Zend_Db
    41    * @subpackage Adapter
    42    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    43    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    44    */
    45   
    abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
    46   
    {
    47   
    48       
    /**
    49        * Default class name for a DB statement.
    50        *
    51        * @var string
    52        */
    53       
    protected $_defaultStmtClass 'Zend_Db_Statement_Pdo';
    54   
    55       
    /**
    56        * Creates a PDO DSN for the adapter from $this->_config settings.
    57        *
    58        * @return string
    59        */
    60       
    protected function _dsn()
    61       {
    62           
    // baseline of DSN parts
    63           
    $dsn $this->_config;
    64   
    65           
    // don't pass the username, password, charset, persistent and driver_options in the DSN
    66           
    unset($dsn['username']);
    67           unset(
    $dsn['password']);
    68           unset(
    $dsn['options']);
    69           unset(
    $dsn['charset']);
    70           unset(
    $dsn['persistent']);
    71           unset(
    $dsn['driver_options']);
    72   
    73           
    // use all remaining parts in the DSN
    74           
    foreach ($dsn as $key => $val) {
    75               
    $dsn[$key] = "$key=$val";
    76           }
    77   
    78           return 
    $this->_pdoType ':' implode(';'$dsn);
    79       }
    80   
    81       
    /**
    82        * Creates a PDO object and connects to the database.
    83        *
    84        * @return void
    85        * @throws Zend_Db_Adapter_Exception
    86        */
    87       
    protected function _connect()
    88       {
    89           
    // if we already have a PDO object, no need to re-connect.
    90           
    if ($this->_connection) {
    91               return;
    92           }
    93   
    94           
    // get the dsn first, because some adapters alter the $_pdoType
    95           
    $dsn $this->_dsn();
    96   
    97           
    // check for PDO extension
    98           
    if (!extension_loaded('pdo')) {
    99               
    /**
    100               * @see Zend_Db_Adapter_Exception
    101               */
    102              
    require_once 'Zend/Db/Adapter/Exception.php';
    103              throw new 
    Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
    104          }
    105  
    106          
    // check the PDO driver is available
    107          
    if (!in_array($this->_pdoTypePDO::getAvailableDrivers())) {
    108              
    /**
    109               * @see Zend_Db_Adapter_Exception
    110               */
    111              
    require_once 'Zend/Db/Adapter/Exception.php';
    112              throw new 
    Zend_Db_Adapter_Exception('The ' $this->_pdoType ' driver is not currently installed');
    113          }
    114  
    115          
    // create PDO connection
    116          
    $q $this->_profiler->queryStart('connect'Zend_Db_Profiler::CONNECT);
    117  
    118          
    // add the persistence flag if we find it in our config array
    119          
    if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) {
    120              
    $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true;
    121          }
    122  
    123          try {
    124              
    $this->_connection = new PDO(
    125                  
    $dsn,
    126                  
    $this->_config['username'],
    127                  
    $this->_config['password'],
    128                  
    $this->_config['driver_options']
    129              );
    130  
    131              
    $this->_profiler->queryEnd($q);
    132  
    133              
    // set the PDO connection to perform case-folding on array keys, or not
    134              
    $this->_connection->setAttribute(PDO::ATTR_CASE$this->_caseFolding);
    135  
    136              
    // always use exceptions.
    137              
    $this->_connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    138  
    139          } catch (
    PDOException $e) {
    140              
    /**
    141               * @see Zend_Db_Adapter_Exception
    142               */
    143              
    require_once 'Zend/Db/Adapter/Exception.php';
    144              throw new 
    Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
    145          }
    146  
    147      }
    148  
    149      
    /**
    150       * Test if a connection is active
    151       *
    152       * @return boolean
    153       */
    154      
    public function isConnected()
    155      {
    156          return ((bool) (
    $this->_connection instanceof PDO));
    157      }
    158  
    159      
    /**
    160       * Force the connection to close.
    161       *
    162       * @return void
    163       */
    164      
    public function closeConnection()
    165      {
    166          
    $this->_connection null;
    167      }
    168  
    169      
    /**
    170       * Prepares an SQL statement.
    171       *
    172       * @param string $sql The SQL statement with placeholders.
    173       * @param array $bind An array of data to bind to the placeholders.
    174       * @return PDOStatement
    175       */
    176      
    public function prepare($sql)
    177      {
    178          
    $this->_connect();
    179          
    $stmtClass $this->_defaultStmtClass;
    180          if (!
    class_exists($stmtClass)) {
    181              require_once 
    'Zend/Loader.php';
    182              
    Zend_Loader::loadClass($stmtClass);
    183          }
    184          
    $stmt = new $stmtClass($this$sql);
    185          
    $stmt->setFetchMode($this->_fetchMode);
    186          return 
    $stmt;
    187      }
    188  
    189      
    /**
    190       * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
    191       *
    192       * As a convention, on RDBMS brands that support sequences
    193       * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
    194       * from the arguments and returns the last id generated by that sequence.
    195       * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
    196       * returns the last value generated for such a column, and the table name
    197       * argument is disregarded.
    198       *
    199       * On RDBMS brands that don't support sequences, $tableName and $primaryKey
    200       * are ignored.
    201       *
    202       * @param string $tableName   OPTIONAL Name of table.
    203       * @param string $primaryKey  OPTIONAL Name of primary key column.
    204       * @return string
    205       */
    206      
    public function lastInsertId($tableName null$primaryKey null)
    207      {
    208          
    $this->_connect();
    209          return 
    $this->_connection->lastInsertId();
    210      }
    211  
    212      
    /**
    213       * Special handling for PDO query().
    214       * All bind parameter names must begin with ':'
    215       *
    216       * @param string|Zend_Db_Select $sql The SQL statement with placeholders.
    217       * @param array $bind An array of data to bind to the placeholders.
    218       * @return Zend_Db_Statement_Pdo
    219       * @throws Zend_Db_Adapter_Exception To re-throw PDOException.
    220       */
    221      
    public function query($sql$bind = array())
    222      {
    223          if (empty(
    $bind) && $sql instanceof Zend_Db_Select) {
    224              
    $bind $sql->getBind();
    225          }
    226  
    227          if (
    is_array($bind)) {
    228              foreach (
    $bind as $name => $value) {
    229                  if (!
    is_int($name) && !preg_match('/^:/'$name)) {
    230                      
    $newName ":$name";
    231                      unset(
    $bind[$name]);
    232                      
    $bind[$newName] = $value;
    233                  }
    234              }
    235          }
    236  
    237          try {
    238              return 
    parent::query($sql$bind);
    239          } catch (
    PDOException $e) {
    240              
    /**
    241               * @see Zend_Db_Statement_Exception
    242               */
    243              
    require_once 'Zend/Db/Statement/Exception.php';
    244              throw new 
    Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
    245          }
    246      }
    247  
    248      
    /**
    249       * Executes an SQL statement and return the number of affected rows
    250       *
    251       * @param  mixed  $sql  The SQL statement with placeholders.
    252       *                      May be a string or Zend_Db_Select.
    253       * @return integer      Number of rows that were modified
    254       *                      or deleted by the SQL statement
    255       */
    256      
    public function exec($sql)
    257      {
    258          if (
    $sql instanceof Zend_Db_Select) {
    259              
    $sql $sql->assemble();
    260          }
    261  
    262          try {
    263              
    $affected $this->getConnection()->exec($sql);
    264  
    265              if (
    $affected === false) {
    266                  
    $errorInfo $this->getConnection()->errorInfo();
    267                  
    /**
    268                   * @see Zend_Db_Adapter_Exception
    269                   */
    270                  
    require_once 'Zend/Db/Adapter/Exception.php';
    271                  throw new 
    Zend_Db_Adapter_Exception($errorInfo[2]);
    272              }
    273  
    274              return 
    $affected;
    275          } catch (
    PDOException $e) {
    276              
    /**
    277               * @see Zend_Db_Adapter_Exception
    278               */
    279              
    require_once 'Zend/Db/Adapter/Exception.php';
    280              throw new 
    Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
    281          }
    282      }
    283  
    284      
    /**
    285       * Quote a raw string.
    286       *
    287       * @param string $value     Raw string
    288       * @return string           Quoted string
    289       */
    290      
    protected function _quote($value)
    291      {
    292          if (
    is_int($value) || is_float($value)) {
    293              return 
    $value;
    294          }
    295          
    $this->_connect();
    296          return 
    $this->_connection->quote($value);
    297      }
    298  
    299      
    /**
    300       * Begin a transaction.
    301       */
    302      
    protected function _beginTransaction()
    303      {
    304          
    $this->_connect();
    305          
    $this->_connection->beginTransaction();
    306      }
    307  
    308      
    /**
    309       * Commit a transaction.
    310       */
    311      
    protected function _commit()
    312      {
    313          
    $this->_connect();
    314          
    $this->_connection->commit();
    315      }
    316  
    317      
    /**
    318       * Roll-back a transaction.
    319       */
    320      
    protected function _rollBack() {
    321          
    $this->_connect();
    322          
    $this->_connection->rollBack();
    323      }
    324  
    325      
    /**
    326       * Set the PDO fetch mode.
    327       *
    328       * @todo Support FETCH_CLASS and FETCH_INTO.
    329       *
    330       * @param int $mode A PDO fetch mode.
    331       * @return void
    332       * @throws Zend_Db_Adapter_Exception
    333       */
    334      
    public function setFetchMode($mode)
    335      {
    336          
    //check for PDO extension
    337          
    if (!extension_loaded('pdo')) {
    338              
    /**
    339               * @see Zend_Db_Adapter_Exception
    340               */
    341              
    require_once 'Zend/Db/Adapter/Exception.php';
    342              throw new 
    Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
    343          }
    344          switch (
    $mode) {
    345              case 
    PDO::FETCH_LAZY:
    346              case 
    PDO::FETCH_ASSOC:
    347              case 
    PDO::FETCH_NUM:
    348              case 
    PDO::FETCH_BOTH:
    349              case 
    PDO::FETCH_NAMED:
    350              case 
    PDO::FETCH_OBJ:
    351                  
    $this->_fetchMode $mode;
    352                  break;
    353              default:
    354                  
    /**
    355                   * @see Zend_Db_Adapter_Exception
    356                   */
    357                  
    require_once 'Zend/Db/Adapter/Exception.php';
    358                  throw new 
    Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified");
    359                  break;
    360          }
    361      }
    362  
    363      
    /**
    364       * Check if the adapter supports real SQL parameters.
    365       *
    366       * @param string $type 'positional' or 'named'
    367       * @return bool
    368       */
    369      
    public function supportsParameters($type)
    370      {
    371          switch (
    $type) {
    372              case 
    'positional':
    373              case 
    'named':
    374              default:
    375                  return 
    true;
    376          }
    377      }
    378  
    379      
    /**
    380       * Retrieve server version in PHP style
    381       *
    382       * @return string
    383       */
    384      
    public function getServerVersion()
    385      {
    386          
    $this->_connect();
    387          try {
    388              
    $version $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION);
    389          } catch (
    PDOException $e) {
    390              
    // In case of the driver doesn't support getting attributes
    391              
    return null;
    392          }
    393          
    $matches null;
    394          if (
    preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/'$version$matches)) {
    395              return 
    $matches[1];
    396          } else {
    397              return 
    null;
    398          }
    399      }
    400  }
    401  
    402  
  4. open/usr/share/php/libzend-framework-php/Zend/Db/Adapter/Abstract.php
    Zend_Db_Adapter_Pdo_Abstract->query('SELECT *,a.name as app,t.name as tag,a.id as id FROM apps a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=0 ORDER BY RAND() LIMIT 15', Array(0))
    1     <?php
    2    
    /**
    3     * Zend Framework
    4     *
    5     * LICENSE
    6     *
    7     * This source file is subject to the new BSD license that is bundled
    8     * with this package in the file LICENSE.txt.
    9     * It is also available through the world-wide-web at this URL:
    10    * http://framework.zend.com/license/new-bsd
    11    * If you did not receive a copy of the license and are unable to
    12    * obtain it through the world-wide-web, please send an email
    13    * to license@zend.com so we can send you a copy immediately.
    14    *
    15    * @category   Zend
    16    * @package    Zend_Db
    17    * @subpackage Adapter
    18    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    19    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    20    * @version    $Id: Abstract.php 24148 2011-06-21 15:14:00Z yoshida@zend.co.jp $
    21    */
    22   
    23   
    24   /**
    25    * @see Zend_Db
    26    */
    27   
    require_once 'Zend/Db.php';
    28   
    29   
    /**
    30    * @see Zend_Db_Select
    31    */
    32   
    require_once 'Zend/Db/Select.php';
    33   
    34   
    /**
    35    * Class for connecting to SQL databases and performing common operations.
    36    *
    37    * @category   Zend
    38    * @package    Zend_Db
    39    * @subpackage Adapter
    40    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    41    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    42    */
    43   
    abstract class Zend_Db_Adapter_Abstract
    44   
    {
    45   
    46       
    /**
    47        * User-provided configuration
    48        *
    49        * @var array
    50        */
    51       
    protected $_config = array();
    52   
    53       
    /**
    54        * Fetch mode
    55        *
    56        * @var integer
    57        */
    58       
    protected $_fetchMode Zend_Db::FETCH_ASSOC;
    59   
    60       
    /**
    61        * Query profiler object, of type Zend_Db_Profiler
    62        * or a subclass of that.
    63        *
    64        * @var Zend_Db_Profiler
    65        */
    66       
    protected $_profiler;
    67   
    68       
    /**
    69        * Default class name for a DB statement.
    70        *
    71        * @var string
    72        */
    73       
    protected $_defaultStmtClass 'Zend_Db_Statement';
    74   
    75       
    /**
    76        * Default class name for the profiler object.
    77        *
    78        * @var string
    79        */
    80       
    protected $_defaultProfilerClass 'Zend_Db_Profiler';
    81   
    82       
    /**
    83        * Database connection
    84        *
    85        * @var object|resource|null
    86        */
    87       
    protected $_connection null;
    88   
    89       
    /**
    90        * Specifies the case of column names retrieved in queries
    91        * Options
    92        * Zend_Db::CASE_NATURAL (default)
    93        * Zend_Db::CASE_LOWER
    94        * Zend_Db::CASE_UPPER
    95        *
    96        * @var integer
    97        */
    98       
    protected $_caseFolding Zend_Db::CASE_NATURAL;
    99   
    100      
    /**
    101       * Specifies whether the adapter automatically quotes identifiers.
    102       * If true, most SQL generated by Zend_Db classes applies
    103       * identifier quoting automatically.
    104       * If false, developer must quote identifiers themselves
    105       * by calling quoteIdentifier().
    106       *
    107       * @var bool
    108       */
    109      
    protected $_autoQuoteIdentifiers true;
    110  
    111      
    /**
    112       * Keys are UPPERCASE SQL datatypes or the constants
    113       * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
    114       *
    115       * Values are:
    116       * 0 = 32-bit integer
    117       * 1 = 64-bit integer
    118       * 2 = float or decimal
    119       *
    120       * @var array Associative array of datatypes to values 0, 1, or 2.
    121       */
    122      
    protected $_numericDataTypes = array(
    123          
    Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
    124          
    Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
    125          
    Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE
    126      
    );
    127  
    128      
    /** Weither or not that object can get serialized
    129       *
    130       * @var bool
    131       */
    132      
    protected $_allowSerialization true;
    133  
    134      
    /**
    135       * Weither or not the database should be reconnected
    136       * to that adapter when waking up
    137       *
    138       * @var bool
    139       */
    140      
    protected $_autoReconnectOnUnserialize false;
    141  
    142      
    /**
    143       * Constructor.
    144       *
    145       * $config is an array of key/value pairs or an instance of Zend_Config
    146       * containing configuration options.  These options are common to most adapters:
    147       *
    148       * dbname         => (string) The name of the database to user
    149       * username       => (string) Connect to the database as this username.
    150       * password       => (string) Password associated with the username.
    151       * host           => (string) What host to connect to, defaults to localhost
    152       *
    153       * Some options are used on a case-by-case basis by adapters:
    154       *
    155       * port           => (string) The port of the database
    156       * persistent     => (boolean) Whether to use a persistent connection or not, defaults to false
    157       * protocol       => (string) The network protocol, defaults to TCPIP
    158       * caseFolding    => (int) style of case-alteration used for identifiers
    159       *
    160       * @param  array|Zend_Config $config An array or instance of Zend_Config having configuration data
    161       * @throws Zend_Db_Adapter_Exception
    162       */
    163      
    public function __construct($config)
    164      {
    165          
    /*
    166           * Verify that adapter parameters are in an array.
    167           */
    168          
    if (!is_array($config)) {
    169              
    /*
    170               * Convert Zend_Config argument to a plain array.
    171               */
    172              
    if ($config instanceof Zend_Config) {
    173                  
    $config $config->toArray();
    174              } else {
    175                  
    /**
    176                   * @see Zend_Db_Adapter_Exception
    177                   */
    178                  
    require_once 'Zend/Db/Adapter/Exception.php';
    179                  throw new 
    Zend_Db_Adapter_Exception('Adapter parameters must be in an array or a Zend_Config object');
    180              }
    181          }
    182  
    183          
    $this->_checkRequiredOptions($config);
    184  
    185          
    $options = array(
    186              
    Zend_Db::CASE_FOLDING           => $this->_caseFolding,
    187              
    Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers,
    188              
    Zend_Db::FETCH_MODE             => $this->_fetchMode,
    189          );
    190          
    $driverOptions = array();
    191  
    192          
    /*
    193           * normalize the config and merge it with the defaults
    194           */
    195          
    if (array_key_exists('options'$config)) {
    196              
    // can't use array_merge() because keys might be integers
    197              
    foreach ((array) $config['options'] as $key => $value) {
    198                  
    $options[$key] = $value;
    199              }
    200          }
    201          if (
    array_key_exists('driver_options'$config)) {
    202              if (!empty(
    $config['driver_options'])) {
    203                  
    // can't use array_merge() because keys might be integers
    204                  
    foreach ((array) $config['driver_options'] as $key => $value) {
    205                      
    $driverOptions[$key] = $value;
    206                  }
    207              }
    208          }
    209  
    210          if (!isset(
    $config['charset'])) {
    211              
    $config['charset'] = null;
    212          }
    213  
    214          if (!isset(
    $config['persistent'])) {
    215              
    $config['persistent'] = false;
    216          }
    217  
    218          
    $this->_config array_merge($this->_config$config);
    219          
    $this->_config['options'] = $options;
    220          
    $this->_config['driver_options'] = $driverOptions;
    221  
    222  
    223          
    // obtain the case setting, if there is one
    224          
    if (array_key_exists(Zend_Db::CASE_FOLDING$options)) {
    225              
    $case = (int) $options[Zend_Db::CASE_FOLDING];
    226              switch (
    $case) {
    227                  case 
    Zend_Db::CASE_LOWER:
    228                  case 
    Zend_Db::CASE_UPPER:
    229                  case 
    Zend_Db::CASE_NATURAL:
    230                      
    $this->_caseFolding $case;
    231                      break;
    232                  default:
    233                      
    /** @see Zend_Db_Adapter_Exception */
    234                      
    require_once 'Zend/Db/Adapter/Exception.php';
    235                      throw new 
    Zend_Db_Adapter_Exception('Case must be one of the following constants: '
    236                          
    'Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER');
    237              }
    238          }
    239  
    240          if (
    array_key_exists(Zend_Db::FETCH_MODE$options)) {
    241              if (
    is_string($options[Zend_Db::FETCH_MODE])) {
    242                  
    $constant 'Zend_Db::FETCH_' strtoupper($options[Zend_Db::FETCH_MODE]);
    243                  if(
    defined($constant)) {
    244                      
    $options[Zend_Db::FETCH_MODE] = constant($constant);
    245                  }
    246              }
    247              
    $this->setFetchMode((int) $options[Zend_Db::FETCH_MODE]);
    248          }
    249  
    250          
    // obtain quoting property if there is one
    251          
    if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS$options)) {
    252              
    $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];
    253          }
    254  
    255          
    // obtain allow serialization property if there is one
    256          
    if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION$options)) {
    257              
    $this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION];
    258          }
    259  
    260          
    // obtain auto reconnect on unserialize property if there is one
    261          
    if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE$options)) {
    262              
    $this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE];
    263          }
    264  
    265          
    // create a profiler object
    266          
    $profiler false;
    267          if (
    array_key_exists(Zend_Db::PROFILER$this->_config)) {
    268              
    $profiler $this->_config[Zend_Db::PROFILER];
    269              unset(
    $this->_config[Zend_Db::PROFILER]);
    270          }
    271          
    $this->setProfiler($profiler);
    272      }
    273  
    274      
    /**
    275       * Check for config options that are mandatory.
    276       * Throw exceptions if any are missing.
    277       *
    278       * @param array $config
    279       * @throws Zend_Db_Adapter_Exception
    280       */
    281      
    protected function _checkRequiredOptions(array $config)
    282      {
    283          
    // we need at least a dbname
    284          
    if (! array_key_exists('dbname'$config)) {
    285              
    /** @see Zend_Db_Adapter_Exception */
    286              
    require_once 'Zend/Db/Adapter/Exception.php';
    287              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance");
    288          }
    289  
    290          if (! 
    array_key_exists('password'$config)) {
    291              
    /**
    292               * @see Zend_Db_Adapter_Exception
    293               */
    294              
    require_once 'Zend/Db/Adapter/Exception.php';
    295              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials");
    296          }
    297  
    298          if (! 
    array_key_exists('username'$config)) {
    299              
    /**
    300               * @see Zend_Db_Adapter_Exception
    301               */
    302              
    require_once 'Zend/Db/Adapter/Exception.php';
    303              throw new 
    Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials");
    304          }
    305      }
    306  
    307      
    /**
    308       * Returns the underlying database connection object or resource.
    309       * If not presently connected, this initiates the connection.
    310       *
    311       * @return object|resource|null
    312       */
    313      
    public function getConnection()
    314      {
    315          
    $this->_connect();
    316          return 
    $this->_connection;
    317      }
    318  
    319      
    /**
    320       * Returns the configuration variables in this adapter.
    321       *
    322       * @return array
    323       */
    324      
    public function getConfig()
    325      {
    326          return 
    $this->_config;
    327      }
    328  
    329      
    /**
    330       * Set the adapter's profiler object.
    331       *
    332       * The argument may be a boolean, an associative array, an instance of
    333       * Zend_Db_Profiler, or an instance of Zend_Config.
    334       *
    335       * A boolean argument sets the profiler to enabled if true, or disabled if
    336       * false.  The profiler class is the adapter's default profiler class,
    337       * Zend_Db_Profiler.
    338       *
    339       * An instance of Zend_Db_Profiler sets the adapter's instance to that
    340       * object.  The profiler is enabled and disabled separately.
    341       *
    342       * An associative array argument may contain any of the keys 'enabled',
    343       * 'class', and 'instance'. The 'enabled' and 'instance' keys correspond to the
    344       * boolean and object types documented above. The 'class' key is used to name a
    345       * class to use for a custom profiler. The class must be Zend_Db_Profiler or a
    346       * subclass. The class is instantiated with no constructor arguments. The 'class'
    347       * option is ignored when the 'instance' option is supplied.
    348       *
    349       * An object of type Zend_Config may contain the properties 'enabled', 'class', and
    350       * 'instance', just as if an associative array had been passed instead.
    351       *
    352       * @param  Zend_Db_Profiler|Zend_Config|array|boolean $profiler
    353       * @return Zend_Db_Adapter_Abstract Provides a fluent interface
    354       * @throws Zend_Db_Profiler_Exception if the object instance or class specified
    355       *         is not Zend_Db_Profiler or an extension of that class.
    356       */
    357      
    public function setProfiler($profiler)
    358      {
    359          
    $enabled          null;
    360          
    $profilerClass    $this->_defaultProfilerClass;
    361          
    $profilerInstance null;
    362  
    363          if (
    $profilerIsObject is_object($profiler)) {
    364              if (
    $profiler instanceof Zend_Db_Profiler) {
    365                  
    $profilerInstance $profiler;
    366              } else if (
    $profiler instanceof Zend_Config) {
    367                  
    $profiler $profiler->toArray();
    368              } else {
    369                  
    /**
    370                   * @see Zend_Db_Profiler_Exception
    371                   */
    372                  
    require_once 'Zend/Db/Profiler/Exception.php';
    373                  throw new 
    Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler'
    374                      
    ' or Zend_Config when provided as an object');
    375              }
    376          }
    377  
    378          if (
    is_array($profiler)) {
    379              if (isset(
    $profiler['enabled'])) {
    380                  
    $enabled = (bool) $profiler['enabled'];
    381              }
    382              if (isset(
    $profiler['class'])) {
    383                  
    $profilerClass $profiler['class'];
    384              }
    385              if (isset(
    $profiler['instance'])) {
    386                  
    $profilerInstance $profiler['instance'];
    387              }
    388          } else if (!
    $profilerIsObject) {
    389              
    $enabled = (bool) $profiler;
    390          }
    391  
    392          if (
    $profilerInstance === null) {
    393              if (!
    class_exists($profilerClass)) {
    394                  require_once 
    'Zend/Loader.php';
    395                  
    Zend_Loader::loadClass($profilerClass);
    396              }
    397              
    $profilerInstance = new $profilerClass();
    398          }
    399  
    400          if (!
    $profilerInstance instanceof Zend_Db_Profiler) {
    401              
    /** @see Zend_Db_Profiler_Exception */
    402              
    require_once 'Zend/Db/Profiler/Exception.php';
    403              throw new 
    Zend_Db_Profiler_Exception('Class ' get_class($profilerInstance) . ' does not extend '
    404                  
    'Zend_Db_Profiler');
    405          }
    406  
    407          if (
    null !== $enabled) {
    408              
    $profilerInstance->setEnabled($enabled);
    409          }
    410  
    411          
    $this->_profiler $profilerInstance;
    412  
    413          return 
    $this;
    414      }
    415  
    416  
    417      
    /**
    418       * Returns the profiler for this adapter.
    419       *
    420       * @return Zend_Db_Profiler
    421       */
    422      
    public function getProfiler()
    423      {
    424          return 
    $this->_profiler;
    425      }
    426  
    427      
    /**
    428       * Get the default statement class.
    429       *
    430       * @return string
    431       */
    432      
    public function getStatementClass()
    433      {
    434          return 
    $this->_defaultStmtClass;
    435      }
    436  
    437      
    /**
    438       * Set the default statement class.
    439       *
    440       * @return Zend_Db_Adapter_Abstract Fluent interface
    441       */
    442      
    public function setStatementClass($class)
    443      {
    444          
    $this->_defaultStmtClass $class;
    445          return 
    $this;
    446      }
    447  
    448      
    /**
    449       * Prepares and executes an SQL statement with bound data.
    450       *
    451       * @param  mixed  $sql  The SQL statement with placeholders.
    452       *                      May be a string or Zend_Db_Select.
    453       * @param  mixed  $bind An array of data to bind to the placeholders.
    454       * @return Zend_Db_Statement_Interface
    455       */
    456      
    public function query($sql$bind = array())
    457      {
    458          
    // connect to the database if needed
    459          
    $this->_connect();
    460  
    461          
    // is the $sql a Zend_Db_Select object?
    462          
    if ($sql instanceof Zend_Db_Select) {
    463              if (empty(
    $bind)) {
    464                  
    $bind $sql->getBind();
    465              }
    466  
    467              
    $sql $sql->assemble();
    468          }
    469  
    470          
    // make sure $bind to an array;
    471          // don't use (array) typecasting because
    472          // because $bind may be a Zend_Db_Expr object
    473          
    if (!is_array($bind)) {
    474              
    $bind = array($bind);
    475          }
    476  
    477          
    // prepare and execute the statement with profiling
    478          
    $stmt $this->prepare($sql);
    479          
    $stmt->execute($bind);
    480  
    481          
    // return the results embedded in the prepared statement object
    482          
    $stmt->setFetchMode($this->_fetchMode);
    483          return 
    $stmt;
    484      }
    485  
    486      
    /**
    487       * Leave autocommit mode and begin a transaction.
    488       *
    489       * @return Zend_Db_Adapter_Abstract
    490       */
    491      
    public function beginTransaction()
    492      {
    493          
    $this->_connect();
    494          
    $q $this->_profiler->queryStart('begin'Zend_Db_Profiler::TRANSACTION);
    495          
    $this->_beginTransaction();
    496          
    $this->_profiler->queryEnd($q);
    497          return 
    $this;
    498      }
    499  
    500      
    /**
    501       * Commit a transaction and return to autocommit mode.
    502       *
    503       * @return Zend_Db_Adapter_Abstract
    504       */
    505      
    public function commit()
    506      {
    507          
    $this->_connect();
    508          
    $q $this->_profiler->queryStart('commit'Zend_Db_Profiler::TRANSACTION);
    509          
    $this->_commit();
    510          
    $this->_profiler->queryEnd($q);
    511          return 
    $this;
    512      }
    513  
    514      
    /**
    515       * Roll back a transaction and return to autocommit mode.
    516       *
    517       * @return Zend_Db_Adapter_Abstract
    518       */
    519      
    public function rollBack()
    520      {
    521          
    $this->_connect();
    522          
    $q $this->_profiler->queryStart('rollback'Zend_Db_Profiler::TRANSACTION);
    523          
    $this->_rollBack();
    524          
    $this->_profiler->queryEnd($q);
    525          return 
    $this;
    526      }
    527  
    528      
    /**
    529       * Inserts a table row with specified data.
    530       *
    531       * @param mixed $table The table to insert data into.
    532       * @param array $bind Column-value pairs.
    533       * @return int The number of affected rows.
    534       * @throws Zend_Db_Adapter_Exception
    535       */
    536      
    public function insert($table, array $bind)
    537      {
    538          
    // extract and quote col names from the array keys
    539          
    $cols = array();
    540          
    $vals = array();
    541          
    $i 0;
    542          foreach (
    $bind as $col => $val) {
    543              
    $cols[] = $this->quoteIdentifier($coltrue);
    544              if (
    $val instanceof Zend_Db_Expr) {
    545                  
    $vals[] = $val->__toString();
    546                  unset(
    $bind[$col]);
    547              } else {
    548                  if (
    $this->supportsParameters('positional')) {
    549                      
    $vals[] = '?';
    550                  } else {
    551                      if (
    $this->supportsParameters('named')) {
    552                          unset(
    $bind[$col]);
    553                          
    $bind[':col'.$i] = $val;
    554                          
    $vals[] = ':col'.$i;
    555                          
    $i++;
    556                      } else {
    557                          
    /** @see Zend_Db_Adapter_Exception */
    558                          
    require_once 'Zend/Db/Adapter/Exception.php';
    559                          throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
    560                      }
    561                  }
    562              }
    563          }
    564  
    565          
    // build the statement
    566          
    $sql "INSERT INTO "
    567               
    $this->quoteIdentifier($tabletrue)
    568               . 
    ' (' implode(', '$cols) . ') '
    569               
    'VALUES (' implode(', '$vals) . ')';
    570  
    571          
    // execute the statement and return the number of affected rows
    572          
    if ($this->supportsParameters('positional')) {
    573              
    $bind array_values($bind);
    574          }
    575          
    $stmt $this->query($sql$bind);
    576          
    $result $stmt->rowCount();
    577          return 
    $result;
    578      }
    579  
    580      
    /**
    581       * Updates table rows with specified data based on a WHERE clause.
    582       *
    583       * @param  mixed        $table The table to update.
    584       * @param  array        $bind  Column-value pairs.
    585       * @param  mixed        $where UPDATE WHERE clause(s).
    586       * @return int          The number of affected rows.
    587       * @throws Zend_Db_Adapter_Exception
    588       */
    589      
    public function update($table, array $bind$where '')
    590      {
    591          
    /**
    592           * Build "col = ?" pairs for the statement,
    593           * except for Zend_Db_Expr which is treated literally.
    594           */
    595          
    $set = array();
    596          
    $i 0;
    597          foreach (
    $bind as $col => $val) {
    598              if (
    $val instanceof Zend_Db_Expr) {
    599                  
    $val $val->__toString();
    600                  unset(
    $bind[$col]);
    601              } else {
    602                  if (
    $this->supportsParameters('positional')) {
    603                      
    $val '?';
    604                  } else {
    605                      if (
    $this->supportsParameters('named')) {
    606                          unset(
    $bind[$col]);
    607                          
    $bind[':col'.$i] = $val;
    608                          
    $val ':col'.$i;
    609                          
    $i++;
    610                      } else {
    611                          
    /** @see Zend_Db_Adapter_Exception */
    612                          
    require_once 'Zend/Db/Adapter/Exception.php';
    613                          throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
    614                      }
    615                  }
    616              }
    617              
    $set[] = $this->quoteIdentifier($coltrue) . ' = ' $val;
    618          }
    619  
    620          
    $where $this->_whereExpr($where);
    621  
    622          
    /**
    623           * Build the UPDATE statement
    624           */
    625          
    $sql "UPDATE "
    626               
    $this->quoteIdentifier($tabletrue)
    627               . 
    ' SET ' implode(', '$set)
    628               . ((
    $where) ? " WHERE $where'');
    629  
    630          
    /**
    631           * Execute the statement and return the number of affected rows
    632           */
    633          
    if ($this->supportsParameters('positional')) {
    634              
    $stmt $this->query($sqlarray_values($bind));
    635          } else {
    636              
    $stmt $this->query($sql$bind);
    637          }
    638          
    $result $stmt->rowCount();
    639          return 
    $result;
    640      }
    641  
    642      
    /**
    643       * Deletes table rows based on a WHERE clause.
    644       *
    645       * @param  mixed        $table The table to update.
    646       * @param  mixed        $where DELETE WHERE clause(s).
    647       * @return int          The number of affected rows.
    648       */
    649      
    public function delete($table$where '')
    650      {
    651          
    $where $this->_whereExpr($where);
    652  
    653          
    /**
    654           * Build the DELETE statement
    655           */
    656          
    $sql "DELETE FROM "
    657               
    $this->quoteIdentifier($tabletrue)
    658               . ((
    $where) ? " WHERE $where'');
    659  
    660          
    /**
    661           * Execute the statement and return the number of affected rows
    662           */
    663          
    $stmt $this->query($sql);
    664          
    $result $stmt->rowCount();
    665          return 
    $result;
    666      }
    667  
    668      
    /**
    669       * Convert an array, string, or Zend_Db_Expr object
    670       * into a string to put in a WHERE clause.
    671       *
    672       * @param mixed $where
    673       * @return string
    674       */
    675      
    protected function _whereExpr($where)
    676      {
    677          if (empty(
    $where)) {
    678              return 
    $where;
    679          }
    680          if (!
    is_array($where)) {
    681              
    $where = array($where);
    682          }
    683          foreach (
    $where as $cond => &$term) {
    684              
    // is $cond an int? (i.e. Not a condition)
    685              
    if (is_int($cond)) {
    686                  
    // $term is the full condition
    687                  
    if ($term instanceof Zend_Db_Expr) {
    688                      
    $term $term->__toString();
    689                  }
    690              } else {
    691                  
    // $cond is the condition with placeholder,
    692                  // and $term is quoted into the condition
    693                  
    $term $this->quoteInto($cond$term);
    694              }
    695              
    $term '(' $term ')';
    696          }
    697  
    698          
    $where implode(' AND '$where);
    699          return 
    $where;
    700      }
    701  
    702      
    /**
    703       * Creates and returns a new Zend_Db_Select object for this adapter.
    704       *
    705       * @return Zend_Db_Select
    706       */
    707      
    public function select()
    708      {
    709          return new 
    Zend_Db_Select($this);
    710      }
    711  
    712      
    /**
    713       * Get the fetch mode.
    714       *
    715       * @return int
    716       */
    717      
    public function getFetchMode()
    718      {
    719          return 
    $this->_fetchMode;
    720      }
    721  
    722      
    /**
    723       * Fetches all SQL result rows as a sequential array.
    724       * Uses the current fetchMode for the adapter.
    725       *
    726       * @param string|Zend_Db_Select $sql  An SQL SELECT statement.
    727       * @param mixed                 $bind Data to bind into SELECT placeholders.
    728       * @param mixed                 $fetchMode Override current fetch mode.
    729       * @return array
    730       */
    731      
    public function fetchAll($sql$bind = array(), $fetchMode null)
    732      {
    733          if (
    $fetchMode === null) {
    734              
    $fetchMode $this->_fetchMode;
    735          }
    736          
    $stmt $this->query($sql$bind);
    737          
    $result $stmt->fetchAll($fetchMode);
    738          return 
    $result;
    739      }
    740  
    741      
    /**
    742       * Fetches the first row of the SQL result.
    743       * Uses the current fetchMode for the adapter.
    744       *
    745       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    746       * @param mixed $bind Data to bind into SELECT placeholders.
    747       * @param mixed                 $fetchMode Override current fetch mode.
    748       * @return array
    749       */
    750      
    public function fetchRow($sql$bind = array(), $fetchMode null)
    751      {
    752          if (
    $fetchMode === null) {
    753              
    $fetchMode $this->_fetchMode;
    754          }
    755          
    $stmt $this->query($sql$bind);
    756          
    $result $stmt->fetch($fetchMode);
    757          return 
    $result;
    758      }
    759  
    760      
    /**
    761       * Fetches all SQL result rows as an associative array.
    762       *
    763       * The first column is the key, the entire row array is the
    764       * value.  You should construct the query to be sure that
    765       * the first column contains unique values, or else
    766       * rows with duplicate values in the first column will
    767       * overwrite previous data.
    768       *
    769       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    770       * @param mixed $bind Data to bind into SELECT placeholders.
    771       * @return array
    772       */
    773      
    public function fetchAssoc($sql$bind = array())
    774      {
    775          
    $stmt $this->query($sql$bind);
    776          
    $data = array();
    777          while (
    $row $stmt->fetch(Zend_Db::FETCH_ASSOC)) {
    778              
    $tmp array_values(array_slice($row01));
    779              
    $data[$tmp[0]] = $row;
    780          }
    781          return 
    $data;
    782      }
    783  
    784      
    /**
    785       * Fetches the first column of all SQL result rows as an array.
    786       *
    787       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    788       * @param mixed $bind Data to bind into SELECT placeholders.
    789       * @return array
    790       */
    791      
    public function fetchCol($sql$bind = array())
    792      {
    793          
    $stmt $this->query($sql$bind);
    794          
    $result $stmt->fetchAll(Zend_Db::FETCH_COLUMN0);
    795          return 
    $result;
    796      }
    797  
    798      
    /**
    799       * Fetches all SQL result rows as an array of key-value pairs.
    800       *
    801       * The first column is the key, the second column is the
    802       * value.
    803       *
    804       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    805       * @param mixed $bind Data to bind into SELECT placeholders.
    806       * @return array
    807       */
    808      
    public function fetchPairs($sql$bind = array())
    809      {
    810          
    $stmt $this->query($sql$bind);
    811          
    $data = array();
    812          while (
    $row $stmt->fetch(Zend_Db::FETCH_NUM)) {
    813              
    $data[$row[0]] = $row[1];
    814          }
    815          return 
    $data;
    816      }
    817  
    818      
    /**
    819       * Fetches the first column of the first row of the SQL result.
    820       *
    821       * @param string|Zend_Db_Select $sql An SQL SELECT statement.
    822       * @param mixed $bind Data to bind into SELECT placeholders.
    823       * @return string
    824       */
    825      
    public function fetchOne($sql$bind = array())
    826      {
    827          
    $stmt $this->query($sql$bind);
    828          
    $result $stmt->fetchColumn(0);
    829          return 
    $result;
    830      }
    831  
    832      
    /**
    833       * Quote a raw string.
    834       *
    835       * @param string $value     Raw string
    836       * @return string           Quoted string
    837       */
    838      
    protected function _quote($value)
    839      {
    840          if (
    is_int($value)) {
    841              return 
    $value;
    842          } elseif (
    is_float($value)) {
    843              return 
    sprintf('%F'$value);
    844          }
    845          return 
    "'" addcslashes($value"\000\n\r\\'\"\032") . "'";
    846      }
    847  
    848      
    /**
    849       * Safely quotes a value for an SQL statement.
    850       *
    851       * If an array is passed as the value, the array values are quoted
    852       * and then returned as a comma-separated string.
    853       *
    854       * @param mixed $value The value to quote.
    855       * @param mixed $type  OPTIONAL the SQL datatype name, or constant, or null.
    856       * @return mixed An SQL-safe quoted value (or string of separated values).
    857       */
    858      
    public function quote($value$type null)
    859      {
    860          
    $this->_connect();
    861  
    862          if (
    $value instanceof Zend_Db_Select) {
    863              return 
    '(' $value->assemble() . ')';
    864          }
    865  
    866          if (
    $value instanceof Zend_Db_Expr) {
    867              return 
    $value->__toString();
    868          }
    869  
    870          if (
    is_array($value)) {
    871              foreach (
    $value as &$val) {
    872                  
    $val $this->quote($val$type);
    873              }
    874              return 
    implode(', '$value);
    875          }
    876  
    877          if (
    $type !== null && array_key_exists($type strtoupper($type), $this->_numericDataTypes)) {
    878              
    $quotedValue '0';
    879              switch (
    $this->_numericDataTypes[$type]) {
    880                  case 
    Zend_Db::INT_TYPE// 32-bit integer
    881                      
    $quotedValue = (string) intval($value);
    882                      break;
    883                  case 
    Zend_Db::BIGINT_TYPE// 64-bit integer
    884                      // ANSI SQL-style hex literals (e.g. x'[\dA-F]+')
    885                      // are not supported here, because these are string
    886                      // literals, not numeric literals.
    887                      
    if (preg_match('/^(
    888                            [+-]?                  # optional sign
    889                            (?:
    890                              0[Xx][\da-fA-F]+     # ODBC-style hexadecimal
    891                              |\d+                 # decimal or octal, or MySQL ZEROFILL decimal
    892                              (?:[eE][+-]?\d+)?    # optional exponent on decimals or octals
    893                            )
    894                          )/x'
    ,
    895                          (string) 
    $value$matches)) {
    896                          
    $quotedValue $matches[1];
    897                      }
    898                      break;
    899                  case 
    Zend_Db::FLOAT_TYPE// float or decimal
    900                      
    $quotedValue sprintf('%F'$value);
    901              }
    902              return 
    $quotedValue;
    903          }
    904  
    905          return 
    $this->_quote($value);
    906      }
    907  
    908      
    /**
    909       * Quotes a value and places into a piece of text at a placeholder.
    910       *
    911       * The placeholder is a question-mark; all placeholders will be replaced
    912       * with the quoted value.   For example:
    913       *
    914       * <code>
    915       * $text = "WHERE date < ?";
    916       * $date = "2005-01-02";
    917       * $safe = $sql->quoteInto($text, $date);
    918       * // $safe = "WHERE date < '2005-01-02'"
    919       * </code>
    920       *
    921       * @param string  $text  The text with a placeholder.
    922       * @param mixed   $value The value to quote.
    923       * @param string  $type  OPTIONAL SQL datatype
    924       * @param integer $count OPTIONAL count of placeholders to replace
    925       * @return string An SQL-safe quoted value placed into the original text.
    926       */
    927      
    public function quoteInto($text$value$type null$count null)
    928      {
    929          if (
    $count === null) {
    930              return 
    str_replace('?'$this->quote($value$type), $text);
    931          } else {
    932              while (
    $count 0) {
    933                  if (
    strpos($text'?') !== false) {
    934                      
    $text substr_replace($text$this->quote($value$type), strpos($text'?'), 1);
    935                  }
    936                  --
    $count;
    937              }
    938              return 
    $text;
    939          }
    940      }
    941  
    942      
    /**
    943       * Quotes an identifier.
    944       *
    945       * Accepts a string representing a qualified indentifier. For Example:
    946       * <code>
    947       * $adapter->quoteIdentifier('myschema.mytable')
    948       * </code>
    949       * Returns: "myschema"."mytable"
    950       *
    951       * Or, an array of one or more identifiers that may form a qualified identifier:
    952       * <code>
    953       * $adapter->quoteIdentifier(array('myschema','my.table'))
    954       * </code>
    955       * Returns: "myschema"."my.table"
    956       *
    957       * The actual quote character surrounding the identifiers may vary depending on
    958       * the adapter.
    959       *
    960       * @param string|array|Zend_Db_Expr $ident The identifier.
    961       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    962       * @return string The quoted identifier.
    963       */
    964      
    public function quoteIdentifier($ident$auto=false)
    965      {
    966          return 
    $this->_quoteIdentifierAs($identnull$auto);
    967      }
    968  
    969      
    /**
    970       * Quote a column identifier and alias.
    971       *
    972       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    973       * @param string $alias An alias for the column.
    974       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    975       * @return string The quoted identifier and alias.
    976       */
    977      
    public function quoteColumnAs($ident$alias$auto=false)
    978      {
    979          return 
    $this->_quoteIdentifierAs($ident$alias$auto);
    980      }
    981  
    982      
    /**
    983       * Quote a table identifier and alias.
    984       *
    985       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    986       * @param string $alias An alias for the table.
    987       * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    988       * @return string The quoted identifier and alias.
    989       */
    990      
    public function quoteTableAs($ident$alias null$auto false)
    991      {
    992          return 
    $this->_quoteIdentifierAs($ident$alias$auto);
    993      }
    994  
    995      
    /**
    996       * Quote an identifier and an optional alias.
    997       *
    998       * @param string|array|Zend_Db_Expr $ident The identifier or expression.
    999       * @param string $alias An optional alias.
    1000      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    1001      * @param string $as The string to add between the identifier/expression and the alias.
    1002      * @return string The quoted identifier and alias.
    1003      */
    1004     
    protected function _quoteIdentifierAs($ident$alias null$auto false$as ' AS ')
    1005     {
    1006         if (
    $ident instanceof Zend_Db_Expr) {
    1007             
    $quoted $ident->__toString();
    1008         } elseif (
    $ident instanceof Zend_Db_Select) {
    1009             
    $quoted '(' $ident->assemble() . ')';
    1010         } else {
    1011             if (
    is_string($ident)) {
    1012                 
    $ident explode('.'$ident);
    1013             }
    1014             if (
    is_array($ident)) {
    1015                 
    $segments = array();
    1016                 foreach (
    $ident as $segment) {
    1017                     if (
    $segment instanceof Zend_Db_Expr) {
    1018                         
    $segments[] = $segment->__toString();
    1019                     } else {
    1020                         
    $segments[] = $this->_quoteIdentifier($segment$auto);
    1021                     }
    1022                 }
    1023                 if (
    $alias !== null && end($ident) == $alias) {
    1024                     
    $alias null;
    1025                 }
    1026                 
    $quoted implode('.'$segments);
    1027             } else {
    1028                 
    $quoted $this->_quoteIdentifier($ident$auto);
    1029             }
    1030         }
    1031         if (
    $alias !== null) {
    1032             
    $quoted .= $as $this->_quoteIdentifier($alias$auto);
    1033         }
    1034         return 
    $quoted;
    1035     }
    1036 
    1037     
    /**
    1038      * Quote an identifier.
    1039      *
    1040      * @param  string $value The identifier or expression.
    1041      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
    1042      * @return string        The quoted identifier and alias.
    1043      */
    1044     
    protected function _quoteIdentifier($value$auto=false)
    1045     {
    1046         if (
    $auto === false || $this->_autoQuoteIdentifiers === true) {
    1047             
    $q $this->getQuoteIdentifierSymbol();
    1048             return (
    $q str_replace("$q""$q$q"$value) . $q);
    1049         }
    1050         return 
    $value;
    1051     }
    1052 
    1053     
    /**
    1054      * Returns the symbol the adapter uses for delimited identifiers.
    1055      *
    1056      * @return string
    1057      */
    1058     
    public function getQuoteIdentifierSymbol()
    1059     {
    1060         return 
    '"';
    1061     }
    1062 
    1063     
    /**
    1064      * Return the most recent value from the specified sequence in the database.
    1065      * This is supported only on RDBMS brands that support sequences
    1066      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
    1067      *
    1068      * @param string $sequenceName
    1069      * @return string
    1070      */
    1071     
    public function lastSequenceId($sequenceName)
    1072     {
    1073         return 
    null;
    1074     }
    1075 
    1076     
    /**
    1077      * Generate a new value from the specified sequence in the database, and return it.
    1078      * This is supported only on RDBMS brands that support sequences
    1079      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
    1080      *
    1081      * @param string $sequenceName
    1082      * @return string
    1083      */
    1084     
    public function nextSequenceId($sequenceName)
    1085     {
    1086         return 
    null;
    1087     }
    1088 
    1089     
    /**
    1090      * Helper method to change the case of the strings used
    1091      * when returning result sets in FETCH_ASSOC and FETCH_BOTH
    1092      * modes.
    1093      *
    1094      * This is not intended to be used by application code,
    1095      * but the method must be public so the Statement class
    1096      * can invoke it.
    1097      *
    1098      * @param string $key
    1099      * @return string
    1100      */
    1101     
    public function foldCase($key)
    1102     {
    1103         switch (
    $this->_caseFolding) {
    1104             case 
    Zend_Db::CASE_LOWER:
    1105                 
    $value strtolower((string) $key);
    1106                 break;
    1107             case 
    Zend_Db::CASE_UPPER:
    1108                 
    $value strtoupper((string) $key);
    1109                 break;
    1110             case 
    Zend_Db::CASE_NATURAL:
    1111             default:
    1112                 
    $value = (string) $key;
    1113         }
    1114         return 
    $value;
    1115     }
    1116 
    1117     
    /**
    1118      * called when object is getting serialized
    1119      * This disconnects the DB object that cant be serialized
    1120      *
    1121      * @throws Zend_Db_Adapter_Exception
    1122      * @return array
    1123      */
    1124     
    public function __sleep()
    1125     {
    1126         if (
    $this->_allowSerialization == false) {
    1127             
    /** @see Zend_Db_Adapter_Exception */
    1128             
    require_once 'Zend/Db/Adapter/Exception.php';
    1129             throw new 
    Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized");
    1130         }
    1131         
    $this->_connection false;
    1132         return 
    array_keys(array_diff_key(get_object_vars($this), array('_connection'=>false)));
    1133     }
    1134 
    1135     
    /**
    1136      * called when object is getting unserialized
    1137      *
    1138      * @return void
    1139      */
    1140     
    public function __wakeup()
    1141     {
    1142         if (
    $this->_autoReconnectOnUnserialize == true) {
    1143             
    $this->getConnection();
    1144         }
    1145     }
    1146 
    1147     
    /**
    1148      * Abstract Methods
    1149      */
    1150 
    1151     /**
    1152      * Returns a list of the tables in the database.
    1153      *
    1154      * @return array
    1155      */
    1156     
    abstract public function listTables();
    1157 
    1158     
    /**
    1159      * Returns the column descriptions for a table.
    1160      *
    1161      * The return value is an associative array keyed by the column name,
    1162      * as returned by the RDBMS.
    1163      *
    1164      * The value of each array element is an associative array
    1165      * with the following keys:
    1166      *
    1167      * SCHEMA_NAME => string; name of database or schema
    1168      * TABLE_NAME  => string;
    1169      * COLUMN_NAME => string; column name
    1170      * COLUMN_POSITION => number; ordinal position of column in table
    1171      * DATA_TYPE   => string; SQL datatype name of column
    1172      * DEFAULT     => string; default expression of column, null if none
    1173      * NULLABLE    => boolean; true if column can have nulls
    1174      * LENGTH      => number; length of CHAR/VARCHAR
    1175      * SCALE       => number; scale of NUMERIC/DECIMAL
    1176      * PRECISION   => number; precision of NUMERIC/DECIMAL
    1177      * UNSIGNED    => boolean; unsigned property of an integer type
    1178      * PRIMARY     => boolean; true if column is part of the primary key
    1179      * PRIMARY_POSITION => integer; position of column in primary key
    1180      *
    1181      * @param string $tableName
    1182      * @param string $schemaName OPTIONAL
    1183      * @return array
    1184      */
    1185     
    abstract public function describeTable($tableName$schemaName null);
    1186 
    1187     
    /**
    1188      * Creates a connection to the database.
    1189      *
    1190      * @return void
    1191      */
    1192     
    abstract protected function _connect();
    1193 
    1194     
    /**
    1195      * Test if a connection is active
    1196      *
    1197      * @return boolean
    1198      */
    1199     
    abstract public function isConnected();
    1200 
    1201     
    /**
    1202      * Force the connection to close.
    1203      *
    1204      * @return void
    1205      */
    1206     
    abstract public function closeConnection();
    1207 
    1208     
    /**
    1209      * Prepare a statement and return a PDOStatement-like object.
    1210      *
    1211      * @param string|Zend_Db_Select $sql SQL query
    1212      * @return Zend_Db_Statement|PDOStatement
    1213      */
    1214     
    abstract public function prepare($sql);
    1215 
    1216     
    /**
    1217      * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
    1218      *
    1219      * As a convention, on RDBMS brands that support sequences
    1220      * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
    1221      * from the arguments and returns the last id generated by that sequence.
    1222      * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
    1223      * returns the last value generated for such a column, and the table name
    1224      * argument is disregarded.
    1225      *
    1226      * @param string $tableName   OPTIONAL Name of table.
    1227      * @param string $primaryKey  OPTIONAL Name of primary key column.
    1228      * @return string
    1229      */
    1230     
    abstract public function lastInsertId($tableName null$primaryKey null);
    1231 
    1232     
    /**
    1233      * Begin a transaction.
    1234      */
    1235     
    abstract protected function _beginTransaction();
    1236 
    1237     
    /**
    1238      * Commit a transaction.
    1239      */
    1240     
    abstract protected function _commit();
    1241 
    1242     
    /**
    1243      * Roll-back a transaction.
    1244      */
    1245     
    abstract protected function _rollBack();
    1246 
    1247     
    /**
    1248      * Set the fetch mode.
    1249      *
    1250      * @param integer $mode
    1251      * @return void
    1252      * @throws Zend_Db_Adapter_Exception
    1253      */
    1254     
    abstract public function setFetchMode($mode);
    1255 
    1256     
    /**
    1257      * Adds an adapter-specific LIMIT clause to the SELECT statement.
    1258      *
    1259      * @param mixed $sql
    1260      * @param integer $count
    1261      * @param integer $offset
    1262      * @return string
    1263      */
    1264     
    abstract public function limit($sql$count$offset 0);
    1265 
    1266     
    /**
    1267      * Check if the adapter supports real SQL parameters.
    1268      *
    1269      * @param string $type 'positional' or 'named'
    1270      * @return bool
    1271      */
    1272     
    abstract public function supportsParameters($type);
    1273 
    1274     
    /**
    1275      * Retrieve server version in PHP style
    1276      *
    1277      * @return string
    1278      */
    1279     
    abstract public function getServerVersion();
    1280 }
    1281 
  5. open/srv/www/applover/production/current/application/modules/default/models/DbTable/Apps.php
    Zend_Db_Adapter_Abstract->fetchAll('SELECT *,a.name as app,t.name as tag,a.id as id FROM apps a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=0 ORDER BY RAND() LIMIT 15')
    1     <?php
    2    
    3    
    class Default_Model_DbTable_Apps extends Zend_Db_Table_Abstract
    4    
    {
    5    
    6        protected 
    $_name 'apps';
    7    
    8        public function 
    getAll()
    9        {
    10           
    $q "SELECT * FROM $this->_name ORDER BY name";
    11           return 
    $this->getAdapter()->fetchAll($q);
    12       }
    13   
    14       public function 
    getAllApi()
    15       {
    16           
    $q "SELECT a.*,u.username,a.name as app,t.name as tag,a.id as id FROM $this->_name a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=0";
    17           return 
    $this->getAdapter()->fetchAll($q);
    18       }
    19   
    20   
    21       public function 
    getAllIndex()
    22       {
    23           
    $q "SELECT *,a.name as app,t.name as tag,a.id as id FROM $this->_name a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=0 ORDER BY RAND() LIMIT 15";
    24           return 
    $this->getAdapter()->fetchAll($q);
    25       }
    26   
    27       public function 
    getAllApps()
    28       {
    29           
    $q "SELECT *,a.name as app,a.id as id FROM $this->_name a, users u WHERE a.user_id=u.id ORDER BY a.id DESC";
    30           return 
    $this->getAdapter()->fetchAll($q);
    31       }
    32   
    33       public function 
    getReviewUser()
    34       {
    35           
    $q "SELECT * FROM $this->_name,users u  WHERE a.user_id=u.id AND a.hidden=1";
    36           return 
    $this->getAdapter()->fetchAll($q);
    37       }
    38   
    39   
    40       public function 
    getByUser($user_id)
    41       {
    42           
    $q "SELECT * FROM $this->_name WHERE user_id='$user_id' ORDER BY id DESC";
    43           return 
    $this->getAdapter()->fetchAll($q);
    44       }
    45   
    46       public function 
    updateVersion($app_id)
    47       {
    48           
    $q " UPDATE   $this->_name SET  `version` =  `version`+1 WHERE  id =$app_id";
    49           
    $this->getAdapter()->query($q);
    50           return 
    1;
    51       }
    52   
    53       public function 
    updateFile($id$name)
    54       {
    55           
    $q " UPDATE   $this->_name SET  `filename` =  '$name' WHERE  id ='$id'";
    56           
    $this->getAdapter()->query($q);
    57           return 
    1;
    58       }
    59   
    60       public function 
    addApp($data)
    61       {
    62           
    $data['thumb'] = ($data['thumb'] == '') ? SiteUrl "img/apps.png" $data['thumb'];
    63           
    $data['created_at'] = date("Y-m-d H:i:s");
    64           if (
    approveAllApps == 1)
    65               
    $data['hidden'] = 0;
    66           else
    67               
    $data['hidden'] = 1;
    68   
    69           try {
    70   
    71               
    $this->insert($data);
    72               
    $id $this->getAdapter()->lastInsertId();
    73               
    $users = new Default_Model_DbTable_Users();
    74               
    $users->addApp($_SESSION['id']);
    75               return 
    $id;
    76           } catch (
    Exception $e) {
    77               
    Applover_Logger::log($e);
    78               return 
    0;
    79           }
    80       }
    81   
    82       public function 
    getById($id)
    83       {
    84           
    $q "SELECT *,a.referer as referer,a.name as name,a.id as id,c.name as tag1,c.id as tag1_id FROM  `apps` a,  `users` b,  `tags` c WHERE b.id = a.user_id AND a.tag1 = c.id  AND a.id=$id";
    85           return 
    $this->getAdapter()->fetchRow($q);
    86       }
    87   
    88       public function 
    getByIdApi($id)
    89       {
    90           
    $q "SELECT a.*,a.referer as referer,a.name as name,a.id as id,c.name as tag1,c.id as tag1_id FROM  `apps` a,  `users` b,  `tags` c WHERE b.id = a.user_id AND a.tag1 = c.id  AND a.id=$id";
    91           return 
    $this->getAdapter()->fetchRow($q);
    92       }
    93   
    94       public function 
    getByReferer($id)
    95       {
    96           
    $q "SELECT * FROM $this->_name WHERE referer='$id'";
    97           return 
    $this->getAdapter()->fetchRow($q);
    98       }
    99   
    100  
    101      public function 
    updateApp($id$data)
    102      {
    103          
    $where $this->getAdapter()->quoteInto('id = ?'$id);
    104          
    $this->update($data$where);
    105          return 
    1;
    106  
    107      }
    108  
    109  
    110      public function 
    deleteApp($id)
    111      {
    112          try {
    113              
    $q "DELETE  FROM  $this->_name WHERE id='$id'";
    114              
    $this->getAdapter()->query($q);
    115              
    $q "DELETE  FROM  users_comments WHERE app_id='$id'";
    116              
    $this->getAdapter()->query($q);
    117              
    $q "DELETE  FROM  users_invites WHERE app_id='$id'";
    118              
    $this->getAdapter()->query($q);
    119              
    $q "DELETE  FROM  apps_invites WHERE app_id='$id'";
    120              
    $this->getAdapter()->query($q);
    121              
    $users = new Default_Model_DbTable_Users();
    122              
    $users->deleteApp($_SESSION['id']);
    123              return 
    1;
    124          } catch (
    Exception $e) {
    125  
    126              
    Applover_Logger::log($e);
    127              return 
    0;
    128          }
    129      }
    130  
    131      public function 
    checkAccess($id$app)
    132      {
    133          if ((!empty(
    $_SESSION['id'])) && ($_SESSION['access'] == 'admin')) {
    134              return 
    1;
    135          }
    136  
    137          if (
    $app['user_id'] == $id) {
    138              return 
    1;
    139          }
    140          
    $user_groups = new Default_Model_DbTable_Users_Groups();
    141          
    $result $user_groups->checkMembers($app['user_id'], $id);
    142          if (!empty(
    $result))
    143              return 
    1;
    144          return 
    0;
    145      }
    146  
    147  
    148      public function 
    updateInvite($app_id)
    149      {
    150  
    151          try {
    152  
    153              
    $q " UPDATE   $this->_name SET  `invited` =  `invited`+1 WHERE  id =$app_id";
    154              
    $this->getAdapter()->query($q);
    155              return 
    1;
    156          } catch (
    Exception $e) {
    157              
    Applover_Logger::log($e);
    158              return 
    0;
    159          }
    160      }
    161  
    162  
    163      public function 
    makePublic($app_id$app)
    164      {
    165          try {
    166  
    167              
    $q " UPDATE   $this->_name SET  `hidden` =  0 WHERE  id =$app_id";
    168              
    $this->getAdapter()->query($q);
    169              
    $data = array();
    170              
    $data['user_id'] = $app['user_id'];
    171              
    $data['type'] = 'admin';
    172              
    $data['from_user_id'] = $app['user_id'];
    173              
    $notifications = new Default_Model_DbTable_Users_Notifications();
    174              
    $notifications->addUpgradeNotification($data$app);
    175              return 
    1;
    176          } catch (
    Exception $e) {
    177              
    Applover_Logger::log($e);
    178              return 
    0;
    179          }
    180      }
    181  
    182      public function 
    makePrivate($app_id)
    183      {
    184          try {
    185  
    186              
    $q " UPDATE   $this->_name SET  `hidden` =  1 WHERE  id =$app_id";
    187              
    $this->getAdapter()->query($q);
    188          } catch (
    Exception $e) {
    189              
    Applover_Logger::log($e);
    190              return 
    0;
    191          }
    192      }
    193  
    194  
    195      public function 
    getPendingApps()
    196      {
    197          
    $q "SELECT *,a.name as app,t.name as tag,a.id as id,a.created_at as created_at FROM $this->_name a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.hidden=1";
    198          return 
    $this->getAdapter()->fetchAll($q);
    199      }
    200  
    201      public function 
    getUninvitedApps($user_id$limit 5$start 0)
    202      {
    203          
    $q "SELECT a.id,a.desc,a.thumb,a.name FROM $this->_name  a WHERE a.id NOT IN(SELECT app_id FROM users_invites WHERE user_id='$user_id') AND a.id NOT IN (SELECT app_id FROM apps_requests WHERE user_id='$user_id') ORDER BY version DESC LIMIT $start,$limit";
    204          return 
    $this->getAdapter()->fetchAll($q);
    205      }
    206  
    207      public function 
    getFeaturedApps()
    208      {
    209          
    $app_ids featuredApps;
    210          
    $q "SELECT *,a.name as app,t.name as tag,a.id as id FROM $this->_name a, users u, tags t WHERE a.user_id=u.id AND t.id=a.tag1 AND a.id IN ($app_ids) AND a.hidden=0 ORDER BY RAND()";
    211          return 
    $this->getAdapter()->fetchAll($q);
    212      }
    213  
    214  }
    215  
  6. open/srv/www/applover/production/current/application/modules/default/controllers/IndexController.php
    Default_Model_DbTable_Apps->getAllIndex()
    1     <?php
    2    
    3    
    class Default_IndexController extends Zend_Controller_Action
    4    
    {
    5        public 
    $contexts = array(
    6            
    'add-email' => array('xml''json'),
    7        );
    8    
    9        public function 
    init()
    10       {
    11           
    /* Initialize action controller here */
    12           
    $this->san = new Applover_Sanitizer();
    13           
    $this->san->_params $this->_request->getParams();
    14           
    $this->_helper->contextSwitch()->initContext('json');
    15           
    $this->_redirector $this->_helper->getHelper('Redirector');
    16   
    17   
    18       }
    19   
    20       public function 
    indexLaunchAction()
    21       {
    22           
    /*$invites = new Default_Model_DbTable_Users_Invites();
    23           $this->view->phones = $invites->getAllPhones();
    24           $apps = new Default_Model_DbTable_Apps();
    25           $this->view->apps = $apps->getAll();
    26           $users = new Default_Model_DbTable_Users();
    27           $this->view->users = $users->getAll();
    28           $this->view->headTitle("Applover");
    29           */
    30           
    $this->_helper->layout->setLayout('launch');
    31           
    $this->view->headTitle("Applover");
    32   
    33       }
    34   
    35   
    36       public function 
    indexoldAction()
    37       {
    38           
    $agent = empty($_SERVER["HTTP_USER_AGENT"]) ? "" $_SERVER["HTTP_USER_AGENT"];
    39           if (
    strpos(strtolower($agent), 'android'))
    40               
    $this->_redirector->gotoSimple('android''index');
    41   
    42           if (!empty(
    $_SESSION['id']))
    43               
    $this->_redirector->gotoSimple('index''dashboard');
    44           
    $this->_helper->layout->setLayout('index');
    45           
    $phones = new Default_Model_DbTable_Users_Phones();
    46           
    $this->view->phones $phones->getCount();
    47           
    $this->view->headTitle("AppLover");
    48   
    49       }
    50   
    51   
    52       public function 
    indexAction()
    53       {
    54           
    $agent = empty($_SERVER["HTTP_USER_AGENT"]) ? "" $_SERVER["HTTP_USER_AGENT"];
    55           if (
    strpos(strtolower($agent), 'android'))
    56               
    $this->_redirector->gotoSimple('android''index');
    57   
    58           if (!empty(
    $_SESSION['id']))
    59               
    $this->_redirector->gotoSimple('index''dashboard');
    60           
    $this->_helper->layout->setLayout('mac_index');
    61           
    $this->view->headTitle("AppLover - " seoTitle);
    62           
    $apps = new Default_Model_DbTable_Apps();
    63           
    $this->view->apps $apps->getAllIndex();
    64   
    65       }
    66   
    67       public function 
    androidAction()
    68       {
    69           
    $this->view->headTitle("AppLover");
    70           
    $this->_helper->layout->setLayout('email');
    71           
    $visits = new Default_Model_DbTable_Visits();
    72           
    $_SESSION['visit_id'] = $visits->add();
    73   
    74       }
    75   
    76       public function 
    downloadAction()
    77       {
    78           
    $apps = new Default_Model_DbTable_Apps();
    79           
    $app $apps->getById(apploverAppId);
    80           
    $app_file $app['filename'];
    81           
    $visit_downloads = new Default_Model_DbTable_VisitDownloads();
    82           
    $visit_downloads->add($_SESSION['visit_id'], $app['version']);
    83           
    $this->_redirector->gotoUrl(SiteUrl "apks/$app_file"_$app[version].apk");
    84   
    85   
    86       }
    87   
    88       public function 
    addEmailAction()
    89       {
    90   
    91           
    $email $this->san->get("email""sanitize");
    92           
    $users = new Default_Model_DbTable_Users();
    93           
    $this->view->valid $auth $users->check_email_address($email);
    94           if (!empty(
    $auth)) {
    95               
    $launch = new Default_Model_DbTable_Launch();
    96               
    $this->view->user $user $launch->getByEmail($email);
    97               if (empty(
    $user)) {
    98                   
    $data = array();
    99                   
    $data['email'] = $email;
    100                  
    $data['developer'] = $this->san->get("developer");
    101                  
    $this->view->success $auth $launch->addUser($data);
    102              }
    103          }
    104  
    105      }
    106  
    107      public function 
    launchAction()
    108      {
    109          
    $this->_helper->layout->setLayout('launch');
    110          
    $this->view->headTitle("Applover");
    111  
    112      }
    113  
    114      public function 
    launchMessageAction()
    115      {
    116          
    $this->_helper->layout->setLayout('launch');
    117          
    $this->view->headTitle("Applover");
    118      }
    119  
    120      public function 
    contactAction()
    121      {
    122  
    123          
    $name $this->_request->getParam('name');
    124          
    $email $this->_request->getParam('email');
    125          
    $msg $this->_request->getParam('msg');
    126          
    $headers "MIME-Version: 1.0" "\r\n";
    127          
    $to contactEmail;
    128          
    // More headers
    129          
    $headers .= "From:<$email>\r\n";
    130  
    131  
    132          
    mail($to'AppLover Contact  ' $name$msg$headers);
    133          
    mail(AdminEmail'AppLover Contact  ' $name$msg$headers);
    134  
    135      }
    136  
    137      
    // public function
    138  
    139      
    public function phonesAction()
    140      {
    141  
    142          
    $invites = new Default_Model_DbTable_Users_Invites();
    143          
    $this->view->phones $invites->getAllPhones();
    144      }
    145  
    146      public function 
    appsAction()
    147      {
    148  
    149          
    $this->_helper->layout->setLayout('mac_apps');
    150          
    $apps = new Default_Model_DbTable_Apps();
    151          
    $this->view->apps $apps->getAllIndex();
    152          
    $this->view->featured_apps $apps->getFeaturedApps();
    153      }
    154  
    155      public function 
    featuresAction()
    156      {
    157          
    $this->view->headTitle("Features | AppLover - " seoTitle);
    158          
    $this->_helper->layout->setLayout('mac_index');
    159      }
    160  
    161      public function 
    aboutAction()
    162      {
    163          
    $this->view->headTitle("About | AppLover - " seoTitle);
    164          
    $this->_helper->layout->setLayout('mac_index');
    165      }
    166  
    167      public function 
    usersAction()
    168      {
    169          
    $users = new Default_Model_DbTable_Users();
    170          
    $this->view->users $users->getAll();
    171      }
    172  
    173      public function 
    commentsAction()
    174      {
    175  
    176      }
    177  
    178      public function 
    loginAction()
    179      {
    180  
    181          
    $this->_helper->layout->setLayout('mac_index');
    182          
    $this->view->headTitle("Login | Applover");
    183          
    $register $this->san->get("register");
    184          
    $login $this->_request->getParam('method');
    185          
    $this->_redirector $this->_helper->getHelper('Redirector');
    186          if (
    $login == 'twitter')
    187              
    $this->_redirector->gotoSimple('twitter-login''auth');
    188          elseif (
    $login == 'facebook')
    189              
    $this->_redirector->gotoSimple('facebook-login''auth');
    190          
    $this->view->register = (empty($register)) ? 1;
    191      }
    192  
    193      public function 
    errorAction()
    194      {
    195  
    196      }
    197  
    198      public function 
    deletedAccountAction()
    199      {
    200  
    201      }
    202  
    203      public function 
    previewAction()
    204      {
    205          
    $users = new Default_Model_DbTable_Users();
    206          
    $user $users->getById(9);
    207          
    $apps = new Default_Model_DbTable_Apps();
    208          
    $app $apps->getById(74);
    209          
    $app['desc'] = strip_tags($app['desc']);
    210          
    $app['download_url'] = SiteUrl "download/index/user_id/" md5($user['id']) . "/app_id/" md5($app['id']) . "/version/" $app['version'];
    211          
    $app['review_url'] = SiteUrl "apps/view/id/$app[id]/reply/0/phone_id/0";
    212  
    213          
    $links = array();
    214          
    $links['all_apps'] = SiteUrl "apps/";
    215          
    $links['download_applover_app'] = SiteUrl "index/download/";
    216          
    $links['notification_settings'] = SiteUrl "dashboard/settings/";
    217          
    $links['twitter_url'] = "https://twitter.com/" app;
    218          
    $links['founder_email'] = "founder@applover.me";
    219  
    220          
    $comment = new Default_Model_DbTable_Users_Comments();
    221          
    $comment $comment->getDataById(1);
    222          
    $comment['comment'] = strip_tags($comment['comment']);
    223  
    224          
    $template file_get_contents("../scripts/templates/template.html");
    225          
    $type $this->_request->getParam("type");
    226          
    $body file_get_contents("../scripts/templates/$type.html");
    227          
    $body str_ireplace("{{body}}"$body$template);
    228          
    $data = array();
    229          
    $data['user'] = $user;
    230          
    $data['app'] = $app;
    231          
    $data['links'] = $links;
    232          
    $data['message'] = "Test This app";
    233          
    $data['comment'] = $comment;
    234  
    235          echo 
    $body;
    236          exit;
    237          
    $m = new Mustache_Engine();
    238          echo 
    $m->render($body$data);
    239          exit;
    240      }
    241  
    242      public function 
    testRawAction()
    243      {
    244          
    $users = new Default_Model_DbTable_Users();
    245          
    $user $users->getById(9);
    246          
    $apps = new Default_Model_DbTable_Apps();
    247          
    $app $apps->getById(74);
    248          
    $app['desc'] = strip_tags($app['desc']);
    249          
    $app['download_url'] = SiteUrl "download/index/user_id/" md5($user['id']) . "/app_id/" md5($app['id']) . "/version/" $app['version'];
    250          
    $app['review_url'] = SiteUrl "apps/view/id/$app[id]/reply/0/phone_id/0";
    251  
    252          
    $links = array();
    253          
    $links['all_apps'] = SiteUrl "apps/";
    254          
    $links['download_applover_app'] = SiteUrl "index/download/";
    255          
    $links['notification_settings'] = SiteUrl "dashboard/settings/";
    256          
    $links['twitter_url'] = "https://twitter.com/" app;
    257          
    $links['founder_email'] = "founder@applover.me";
    258  
    259          
    $comment = new Default_Model_DbTable_Users_Comments();
    260          
    $comment $comment->getDataById(1);
    261          
    $comment['comment'] = strip_tags($comment['comment']);
    262  
    263          
    $template file_get_contents("../scripts/templates/raw/template.html");
    264          
    $type $this->_request->getParam("type");
    265          
    $body file_get_contents("../scripts/templates/raw/$type.html");
    266          
    $body str_ireplace("{{body}}"$body$template);
    267          
    $data = array();
    268          
    $data['user'] = $user;
    269          
    $data['app'] = $app;
    270          
    $data['links'] = $links;
    271          
    $data['message'] = "Test This app";
    272          
    $data['comment'] = $comment;
    273  
    274          
    $m = new Mustache_Engine();
    275          
    $html $m->render($body$data);
    276          echo 
    $html;
    277          
    $headers = <<<TEXT
    278  
    MIME-Version: 1.0
    279  Content-type: text/html; charset=iso-8859-1
    280  From:"AppLover"<notifications@applover.me>
    281  Reply-To: <notifications@applover.me>
    282  
    TEXT;
    283  
    284  
    285          
    mail("kmarkiv@gmail.com""$type Template test"$template$headers);
    286          exit;
    287      }
    288  
    289  
    290      public function 
    testNotificationAction()
    291      {
    292          
    $type $this->_request->getParam("type");
    293          
    $template file_get_contents("../scripts/templates/raw/$type"_test.html");
    294          
    $headers = <<<TEXT
    295  
    MIME-Version: 1.0
    296  Content-type: text/html; charset=iso-8859-1
    297  From:"AppLover"<notifications@applover.me>
    298  Reply-To: <notifications@applover.me>
    299  
    TEXT;
    300  
    301  
    302          
    mail("kmarkiv@gmail.com""$type Template test"$template$headers);
    303          echo 
    $template;
    304          exit;
    305      }
    306  
    307      public function 
    testEmailAction()
    308      {
    309          
    $users = new Default_Model_DbTable_Users();
    310          
    $user $users->getById(9);
    311          
    $apps = new Default_Model_DbTable_Apps();
    312          
    $app $apps->getById(74);
    313  
    314          
    $emails = new Default_Model_DbTable_Emails();
    315          
    $emails->sendWelcomeEmail(9);
    316          
    $emails->sendMail("Reminder to test  $app[name]""reminder"$user['id'], $app['id'], "Please test ");
    317          
    $emails->sendMail("Invitation to  $app[name]""invite"$user['id'], $app['id']);
    318          
    $emails->sendMail("Update on $app[name]""update"$user['id'], $app['id'], "I have updated etc  ");
    319          
    $emails->sendMail("New Comment on $app[name]""comment"$user['id'], $app['id'], ""1);
    320          exit;
    321      }
    322  
    323      public function 
    macAction()
    324      {
    325          
    $this->_helper->layout->setLayout('mac_index');
    326          
    $apps = new Default_Model_DbTable_Apps();
    327          
    $this->view->apps $apps->getAllIndex();
    328      }
    329  
    330  
    331      public function 
    macAppsAction()
    332      {
    333          
    $this->view->headTitle("Apps | AppLover" seoTitle);
    334          
    $this->_helper->layout->setLayout('mac_index');
    335          
    $apps = new Default_Model_DbTable_Apps();
    336          
    $this->view->apps $apps->getAllIndex();
    337      }
    338  
    339      public function 
    macLoginAction()
    340      {
    341          
    $this->_helper->layout->setLayout('mac_index');
    342  
    343      }
    344  
    345      public function 
    macKartAction()
    346      {
    347          
    $this->_helper->layout->setLayout('mac_kart');
    348  
    349      }
    350  
    351      public function 
    listAction()
    352      {
    353          
    $this->_helper->layout->setLayout('mac_apps');
    354          
    $apps = new Default_Model_DbTable_Apps();
    355          
    $this->view->apps $apps->getAllIndex();
    356          
    $this->view->featured_apps $apps->getFeaturedApps();
    357  
    358  
    359      }
    360  
    361      public function 
    appAction()
    362      {
    363          
    $this->_helper->layout->setLayout('mac_apps');
    364          
    $apps = new Default_Model_DbTable_Apps();
    365          
    $this->view->app $apps->getById(46);
    366          
    $this->view->featured_apps $apps->getFeaturedApps();
    367  
    368  
    369      }
    370  
    371      public function 
    forgotPasswordAction()
    372      {
    373  
    374          
    $this->_helper->layout->setLayout('referrals_mac');
    375          
    $id 74;
    376          
    $apps = new Default_Model_DbTable_Apps();
    377          
    $app $apps->getById($id);
    378          
    $this->view->app $app;
    379          
    $user = new Default_Model_DbTable_Users();
    380          
    $this->view->user $user->getById($app['user_id']);
    381          
    $this->view->error $this->san->get("error");
    382  
    383      }
    384  
    385      public function 
    sentReminderAction()
    386      {
    387  
    388          
    $email $this->san->get("email""sanitize");
    389  
    390          
    $users = new Default_Model_DbTable_Users();
    391  
    392          
    $user $users->getByEmail($email);
    393  
    394          if (empty(
    $user))
    395              
    $user $users->getByUsername($email);
    396  
    397          if (empty(
    $user))
    398              
    $this->_redirector->gotoSimple('forgot-password'nullnull, array(
    399                  
    'error' => 1
    400              
    ));
    401          else {
    402              
    $user $users->getById($user['id']);
    403              
    $db_emails = new Default_Model_DbTable_Emails();
    404              
    $db_emails->sendMail("Password for AppLover""newsletter"$user['id'], 0"
    405              Your Username is <strong>
    $user[username]</strong> \n <br/>
    406              Your Login password is <strong>
    $user[password]</strong> \n  ");
    407  
    408          }
    409  
    410          
    $this->_helper->layout->setLayout('referrals_mac');
    411          
    $id 74;
    412          
    $apps = new Default_Model_DbTable_Apps();
    413          
    $app $apps->getById($id);
    414          
    $this->view->app $app;
    415          
    $user = new Default_Model_DbTable_Users();
    416          
    $this->view->user $user->getById($app['user_id']);
    417  
    418  
    419      }
    420  
    421  
    422  }
    423  
    424  
    425  
    426  
  7. open/usr/share/php/libzend-framework-php/Zend/Controller/Action.php
    Default_IndexController->indexAction()
    1     <?php
    2    
    /**
    3     * Zend Framework
    4     *
    5     * LICENSE
    6     *
    7     * This source file is subject to the new BSD license that is bundled
    8     * with this package in the file LICENSE.txt.
    9     * It is also available through the world-wide-web at this URL:
    10    * http://framework.zend.com/license/new-bsd
    11    * If you did not receive a copy of the license and are unable to
    12    * obtain it through the world-wide-web, please send an email
    13    * to license@zend.com so we can send you a copy immediately.
    14    *
    15    * @category   Zend
    16    * @package    Zend_Controller
    17    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    18    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    19    * @version    $Id: Action.php 24253 2011-07-22 00:15:05Z adamlundrigan $
    20    */
    21   
    22   /**
    23    * @see Zend_Controller_Action_HelperBroker
    24    */
    25   
    require_once 'Zend/Controller/Action/HelperBroker.php';
    26   
    27   
    /**
    28    * @see Zend_Controller_Action_Interface
    29    */
    30   
    require_once 'Zend/Controller/Action/Interface.php';
    31   
    32   
    /**
    33    * @see Zend_Controller_Front
    34    */
    35   
    require_once 'Zend/Controller/Front.php';
    36   
    37   
    /**
    38    * @category   Zend
    39    * @package    Zend_Controller
    40    * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
    41    * @license    http://framework.zend.com/license/new-bsd     New BSD License
    42    */
    43   
    abstract class Zend_Controller_Action implements Zend_Controller_Action_Interface
    44   
    {
    45       
    /**
    46        * @var array of existing class methods
    47        */
    48       
    protected $_classMethods;
    49   
    50       
    /**
    51        * Word delimiters (used for normalizing view script paths)
    52        * @var array
    53        */
    54       
    protected $_delimiters;
    55   
    56       
    /**
    57        * Array of arguments provided to the constructor, minus the
    58        * {@link $_request Request object}.
    59        * @var array
    60        */
    61       
    protected $_invokeArgs = array();
    62   
    63       
    /**
    64        * Front controller instance
    65        * @var Zend_Controller_Front
    66        */
    67       
    protected $_frontController;
    68   
    69       
    /**
    70        * Zend_Controller_Request_Abstract object wrapping the request environment
    71        * @var Zend_Controller_Request_Abstract
    72        */
    73       
    protected $_request null;
    74   
    75       
    /**
    76        * Zend_Controller_Response_Abstract object wrapping the response
    77        * @var Zend_Controller_Response_Abstract
    78        */
    79       
    protected $_response null;
    80   
    81       
    /**
    82        * View script suffix; defaults to 'phtml'
    83        * @see {render()}
    84        * @var string
    85        */
    86       
    public $viewSuffix 'phtml';
    87   
    88       
    /**
    89        * View object
    90        * @var Zend_View_Interface
    91        */
    92       
    public $view;
    93   
    94       
    /**
    95        * Helper Broker to assist in routing help requests to the proper object
    96        *
    97        * @var Zend_Controller_Action_HelperBroker
    98        */
    99       
    protected $_helper null;
    100  
    101      
    /**
    102       * Class constructor
    103       *
    104       * The request and response objects should be registered with the
    105       * controller, as should be any additional optional arguments; these will be
    106       * available via {@link getRequest()}, {@link getResponse()}, and
    107       * {@link getInvokeArgs()}, respectively.
    108       *
    109       * When overriding the constructor, please consider this usage as a best
    110       * practice and ensure that each is registered appropriately; the easiest
    111       * way to do so is to simply call parent::__construct($request, $response,
    112       * $invokeArgs).
    113       *
    114       * After the request, response, and invokeArgs are set, the
    115       * {@link $_helper helper broker} is initialized.
    116       *
    117       * Finally, {@link init()} is called as the final action of
    118       * instantiation, and may be safely overridden to perform initialization
    119       * tasks; as a general rule, override {@link init()} instead of the
    120       * constructor to customize an action controller's instantiation.
    121       *
    122       * @param Zend_Controller_Request_Abstract $request
    123       * @param Zend_Controller_Response_Abstract $response
    124       * @param array $invokeArgs Any additional invocation arguments
    125       * @return void
    126       */
    127      
    public function __construct(Zend_Controller_Request_Abstract $requestZend_Controller_Response_Abstract $response, array $invokeArgs = array())
    128      {
    129          
    $this->setRequest($request)
    130               ->
    setResponse($response)
    131               ->
    _setInvokeArgs($invokeArgs);
    132          
    $this->_helper = new Zend_Controller_Action_HelperBroker($this);
    133          
    $this->init();
    134      }
    135  
    136      
    /**
    137       * Initialize object
    138       *
    139       * Called from {@link __construct()} as final step of object instantiation.
    140       *
    141       * @return void
    142       */
    143      
    public function init()
    144      {
    145      }
    146  
    147      
    /**
    148       * Initialize View object
    149       *
    150       * Initializes {@link $view} if not otherwise a Zend_View_Interface.
    151       *
    152       * If {@link $view} is not otherwise set, instantiates a new Zend_View
    153       * object, using the 'views' subdirectory at the same level as the
    154       * controller directory for the current module as the base directory.
    155       * It uses this to set the following:
    156       * - script path = views/scripts/
    157       * - helper path = views/helpers/
    158       * - filter path = views/filters/
    159       *
    160       * @return Zend_View_Interface
    161       * @throws Zend_Controller_Exception if base view directory does not exist
    162       */
    163      
    public function initView()
    164      {
    165          if (!
    $this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
    166              return 
    $this->view;
    167          }
    168  
    169          require_once 
    'Zend/View/Interface.php';
    170          if (isset(
    $this->view) && ($this->view instanceof Zend_View_Interface)) {
    171              return 
    $this->view;
    172          }
    173  
    174          
    $request $this->getRequest();
    175          
    $module  $request->getModuleName();
    176          
    $dirs    $this->getFrontController()->getControllerDirectory();
    177          if (empty(
    $module) || !isset($dirs[$module])) {
    178              
    $module $this->getFrontController()->getDispatcher()->getDefaultModule();
    179          }
    180          
    $baseDir dirname($dirs[$module]) . DIRECTORY_SEPARATOR 'views';
    181          if (!
    file_exists($baseDir) || !is_dir($baseDir)) {
    182              require_once 
    'Zend/Controller/Exception.php';
    183              throw new 
    Zend_Controller_Exception('Missing base view directory ("' $baseDir '")');
    184          }
    185  
    186          require_once 
    'Zend/View.php';
    187          
    $this->view = new Zend_View(array('basePath' => $baseDir));
    188  
    189          return 
    $this->view;
    190      }
    191  
    192      
    /**
    193       * Render a view
    194       *
    195       * Renders a view. By default, views are found in the view script path as
    196       * <controller>/<action>.phtml. You may change the script suffix by
    197       * resetting {@link $viewSuffix}. You may omit the controller directory
    198       * prefix by specifying boolean true for $noController.
    199       *
    200       * By default, the rendered contents are appended to the response. You may
    201       * specify the named body content segment to set by specif