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 Statement
18: * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
19: * @license http://framework.zend.com/license/new-bsd New BSD License
20: * @version $Id: Pdo.php 20096 2010-01-06 02:05:09Z bkarwin $
21: */
22:
23: /**
24: * @see Zend_Db_Statement
25: */
26: require_once 'Zend/Db/Statement.php';
27:
28: /**
29: * Proxy class to wrap a PDOStatement object.
30: * Matches the interface of PDOStatement. All methods simply proxy to the
31: * matching method in PDOStatement. PDOExceptions thrown by PDOStatement
32: * are re-thrown as Zend_Db_Statement_Exception.
33: *
34: * @category Zend
35: * @package Zend_Db
36: * @subpackage Statement
37: * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
38: * @license http://framework.zend.com/license/new-bsd New BSD License
39: */
40: class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggregate
41: {
42:
43: /**
44: * @var int
45: */
46: protected $_fetchMode = PDO::FETCH_ASSOC;
47:
48: /**
49: * Prepare a string SQL statement and create a statement object.
50: *
51: * @param string $sql
52: * @return void
53: * @throws Zend_Db_Statement_Exception
54: */
55: protected function _prepare($sql)
56: {
57: try {
58: $this->_stmt = $this->_adapter->getConnection()->prepare($sql);
59: } catch (PDOException $e) {
60: require_once 'Zend/Db/Statement/Exception.php';
61: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
62: }
63: }
64:
65: /**
66: * Bind a column of the statement result set to a PHP variable.
67: *
68: * @param string $column Name the column in the result set, either by
69: * position or by name.
70: * @param mixed $param Reference to the PHP variable containing the value.
71: * @param mixed $type OPTIONAL
72: * @return bool
73: * @throws Zend_Db_Statement_Exception
74: */
75: public function bindColumn($column, &$param, $type = null)
76: {
77: try {
78: if ($type === null) {
79: return $this->_stmt->bindColumn($column, $param);
80: } else {
81: return $this->_stmt->bindColumn($column, $param, $type);
82: }
83: } catch (PDOException $e) {
84: require_once 'Zend/Db/Statement/Exception.php';
85: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
86: }
87: }
88:
89: /**
90: * Binds a parameter to the specified variable name.
91: *
92: * @param mixed $parameter Name the parameter, either integer or string.
93: * @param mixed $variable Reference to PHP variable containing the value.
94: * @param mixed $type OPTIONAL Datatype of SQL parameter.
95: * @param mixed $length OPTIONAL Length of SQL parameter.
96: * @param mixed $options OPTIONAL Other options.
97: * @return bool
98: * @throws Zend_Db_Statement_Exception
99: */
100: protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null)
101: {
102: try {
103: if ($type === null) {
104: if (is_bool($variable)) {
105: $type = PDO::PARAM_BOOL;
106: } elseif ($variable === null) {
107: $type = PDO::PARAM_NULL;
108: } elseif (is_integer($variable)) {
109: $type = PDO::PARAM_INT;
110: } else {
111: $type = PDO::PARAM_STR;
112: }
113: }
114: return $this->_stmt->bindParam($parameter, $variable, $type, $length, $options);
115: } catch (PDOException $e) {
116: require_once 'Zend/Db/Statement/Exception.php';
117: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
118: }
119: }
120:
121: /**
122: * Binds a value to a parameter.
123: *
124: * @param mixed $parameter Name the parameter, either integer or string.
125: * @param mixed $value Scalar value to bind to the parameter.
126: * @param mixed $type OPTIONAL Datatype of the parameter.
127: * @return bool
128: * @throws Zend_Db_Statement_Exception
129: */
130: public function bindValue($parameter, $value, $type = null)
131: {
132: if (is_string($parameter) && $parameter[0] != ':') {
133: $parameter = ":$parameter";
134: }
135:
136: $this->_bindParam[$parameter] = $value;
137:
138: try {
139: if ($type === null) {
140: return $this->_stmt->bindValue($parameter, $value);
141: } else {
142: return $this->_stmt->bindValue($parameter, $value, $type);
143: }
144: } catch (PDOException $e) {
145: require_once 'Zend/Db/Statement/Exception.php';
146: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
147: }
148: }
149:
150: /**
151: * Closes the cursor, allowing the statement to be executed again.
152: *
153: * @return bool
154: * @throws Zend_Db_Statement_Exception
155: */
156: public function closeCursor()
157: {
158: try {
159: return $this->_stmt->closeCursor();
160: } catch (PDOException $e) {
161: require_once 'Zend/Db/Statement/Exception.php';
162: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
163: }
164: }
165:
166: /**
167: * Returns the number of columns in the result set.
168: * Returns null if the statement has no result set metadata.
169: *
170: * @return int The number of columns.
171: * @throws Zend_Db_Statement_Exception
172: */
173: public function columnCount()
174: {
175: try {
176: return $this->_stmt->columnCount();
177: } catch (PDOException $e) {
178: require_once 'Zend/Db/Statement/Exception.php';
179: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
180: }
181: }
182:
183: /**
184: * Retrieves the error code, if any, associated with the last operation on
185: * the statement handle.
186: *
187: * @return string error code.
188: * @throws Zend_Db_Statement_Exception
189: */
190: public function errorCode()
191: {
192: try {
193: return $this->_stmt->errorCode();
194: } catch (PDOException $e) {
195: require_once 'Zend/Db/Statement/Exception.php';
196: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
197: }
198: }
199:
200: /**
201: * Retrieves an array of error information, if any, associated with the
202: * last operation on the statement handle.
203: *
204: * @return array
205: * @throws Zend_Db_Statement_Exception
206: */
207: public function errorInfo()
208: {
209: try {
210: return $this->_stmt->errorInfo();
211: } catch (PDOException $e) {
212: require_once 'Zend/Db/Statement/Exception.php';
213: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
214: }
215: }
216:
217: /**
218: * Executes a prepared statement.
219: *
220: * @param array $params OPTIONAL Values to bind to parameter placeholders.
221: * @return bool
222: * @throws Zend_Db_Statement_Exception
223: */
224: public function _execute(array $params = null)
225: {
226: try {
227: if ($params !== null) {
228: return $this->_stmt->execute($params);
229: } else {
230: return $this->_stmt->execute();
231: }
232: } catch (PDOException $e) {
233: require_once 'Zend/Db/Statement/Exception.php';
234: throw new Zend_Db_Statement_Exception($e->getMessage(), (int) $e->getCode(), $e);
235: }
236: }
237:
238: /**
239: * Fetches a row from the result set.
240: *
241: * @param int $style OPTIONAL Fetch mode for this fetch operation.
242: * @param int $cursor OPTIONAL Absolute, relative, or other.
243: * @param int $offset OPTIONAL Number for absolute or relative cursors.
244: * @return mixed Array, object, or scalar depending on fetch mode.
245: * @throws Zend_Db_Statement_Exception
246: */
247: public function fetch($style = null, $cursor = null, $offset = null)
248: {
249: if ($style === null) {
250: $style = $this->_fetchMode;
251: }
252: try {
253: return $this->_stmt->fetch($style, $cursor, $offset);
254: } catch (PDOException $e) {
255: require_once 'Zend/Db/Statement/Exception.php';
256: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
257: }
258: }
259:
260: /**
261: * Required by IteratorAggregate interface
262: *
263: * @return IteratorIterator
264: */
265: public function getIterator()
266: {
267: return new IteratorIterator($this->_stmt);
268: }
269:
270: /**
271: * Returns an array containing all of the result set rows.
272: *
273: * @param int $style OPTIONAL Fetch mode.
274: * @param int $col OPTIONAL Column number, if fetch mode is by column.
275: * @return array Collection of rows, each in a format by the fetch mode.
276: * @throws Zend_Db_Statement_Exception
277: */
278: public function fetchAll($style = null, $col = null)
279: {
280: if ($style === null) {
281: $style = $this->_fetchMode;
282: }
283: try {
284: if ($style == PDO::FETCH_COLUMN) {
285: if ($col === null) {
286: $col = 0;
287: }
288: return $this->_stmt->fetchAll($style, $col);
289: } else {
290: return $this->_stmt->fetchAll($style);
291: }
292: } catch (PDOException $e) {
293: require_once 'Zend/Db/Statement/Exception.php';
294: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
295: }
296: }
297:
298: /**
299: * Returns a single column from the next row of a result set.
300: *
301: * @param int $col OPTIONAL Position of the column to fetch.
302: * @return string
303: * @throws Zend_Db_Statement_Exception
304: */
305: public function fetchColumn($col = 0)
306: {
307: try {
308: return $this->_stmt->fetchColumn($col);
309: } catch (PDOException $e) {
310: require_once 'Zend/Db/Statement/Exception.php';
311: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
312: }
313: }
314:
315: /**
316: * Fetches the next row and returns it as an object.
317: *
318: * @param string $class OPTIONAL Name of the class to create.
319: * @param array $config OPTIONAL Constructor arguments for the class.
320: * @return mixed One object instance of the specified class.
321: * @throws Zend_Db_Statement_Exception
322: */
323: public function fetchObject($class = 'stdClass', array $config = array())
324: {
325: try {
326: return $this->_stmt->fetchObject($class, $config);
327: } catch (PDOException $e) {
328: require_once 'Zend/Db/Statement/Exception.php';
329: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
330: }
331: }
332:
333: /**
334: * Retrieve a statement attribute.
335: *
336: * @param integer $key Attribute name.
337: * @return mixed Attribute value.
338: * @throws Zend_Db_Statement_Exception
339: */
340: public function getAttribute($key)
341: {
342: try {
343: return $this->_stmt->getAttribute($key);
344: } catch (PDOException $e) {
345: require_once 'Zend/Db/Statement/Exception.php';
346: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
347: }
348: }
349:
350: /**
351: * Returns metadata for a column in a result set.
352: *
353: * @param int $column
354: * @return mixed
355: * @throws Zend_Db_Statement_Exception
356: */
357: public function getColumnMeta($column)
358: {
359: try {
360: return $this->_stmt->getColumnMeta($column);
361: } catch (PDOException $e) {
362: require_once 'Zend/Db/Statement/Exception.php';
363: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
364: }
365: }
366:
367: /**
368: * Retrieves the next rowset (result set) for a SQL statement that has
369: * multiple result sets. An example is a stored procedure that returns
370: * the results of multiple queries.
371: *
372: * @return bool
373: * @throws Zend_Db_Statement_Exception
374: */
375: public function nextRowset()
376: {
377: try {
378: return $this->_stmt->nextRowset();
379: } catch (PDOException $e) {
380: require_once 'Zend/Db/Statement/Exception.php';
381: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
382: }
383: }
384:
385: /**
386: * Returns the number of rows affected by the execution of the
387: * last INSERT, DELETE, or UPDATE statement executed by this
388: * statement object.
389: *
390: * @return int The number of rows affected.
391: * @throws Zend_Db_Statement_Exception
392: */
393: public function rowCount()
394: {
395: try {
396: return $this->_stmt->rowCount();
397: } catch (PDOException $e) {
398: require_once 'Zend/Db/Statement/Exception.php';
399: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
400: }
401: }
402:
403: /**
404: * Set a statement attribute.
405: *
406: * @param string $key Attribute name.
407: * @param mixed $val Attribute value.
408: * @return bool
409: * @throws Zend_Db_Statement_Exception
410: */
411: public function setAttribute($key, $val)
412: {
413: try {
414: return $this->_stmt->setAttribute($key, $val);
415: } catch (PDOException $e) {
416: require_once 'Zend/Db/Statement/Exception.php';
417: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
418: }
419: }
420:
421: /**
422: * Set the default fetch mode for this statement.
423: *
424: * @param int $mode The fetch mode.
425: * @return bool
426: * @throws Zend_Db_Statement_Exception
427: */
428: public function setFetchMode($mode)
429: {
430: $this->_fetchMode = $mode;
431: try {
432: return $this->_stmt->setFetchMode($mode);
433: } catch (PDOException $e) {
434: require_once 'Zend/Db/Statement/Exception.php';
435: throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
436: }
437: }
438:
439: }
440: