source: sourcecode/system/database/DB_result.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 8.8 KB
Line 
1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * CodeIgniter
4 *
5 * An open source application development framework for PHP 5.1.6 or newer
6 *
7 * @package             CodeIgniter
8 * @author              ExpressionEngine Dev Team
9 * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc.
10 * @license             http://codeigniter.com/user_guide/license.html
11 * @link                http://codeigniter.com
12 * @since               Version 1.0
13 * @filesource
14 */
15
16// ------------------------------------------------------------------------
17
18/**
19 * Database Result Class
20 *
21 * This is the platform-independent result class.
22 * This class will not be called directly. Rather, the adapter
23 * class for the specific database will extend and instantiate it.
24 *
25 * @category    Database
26 * @author              ExpressionEngine Dev Team
27 * @link                http://codeigniter.com/user_guide/database/
28 */
29class CI_DB_result {
30
31        var $conn_id                            = NULL;
32        var $result_id                          = NULL;
33        var $result_array                       = array();
34        var $result_object                      = array();
35        var $custom_result_object       = array();
36        var $current_row                        = 0;
37        var $num_rows                           = 0;
38        var $row_data                           = NULL;
39
40
41        /**
42         * Query result.  Acts as a wrapper function for the following functions.
43         *
44         * @access      public
45         * @param       string  can be "object" or "array"
46         * @return      mixed   either a result object or array
47         */
48        public function result($type = 'object')
49        {
50                if ($type == 'array') return $this->result_array();
51                else if ($type == 'object') return $this->result_object();
52                else return $this->custom_result_object($type);
53        }
54
55        // --------------------------------------------------------------------
56
57        /**
58         * Custom query result.
59         *
60         * @param class_name A string that represents the type of object you want back
61         * @return array of objects
62         */
63        public function custom_result_object($class_name)
64        {
65                if (array_key_exists($class_name, $this->custom_result_object))
66                {
67                        return $this->custom_result_object[$class_name];
68                }
69
70                if ($this->result_id === FALSE OR $this->num_rows() == 0)
71                {
72                        return array();
73                }
74
75                // add the data to the object
76                $this->_data_seek(0);
77                $result_object = array();
78
79                while ($row = $this->_fetch_object())
80                {
81                        $object = new $class_name();
82
83                        foreach ($row as $key => $value)
84                        {
85                                $object->$key = $value;
86                        }
87
88                        $result_object[] = $object;
89                }
90
91                // return the array
92                return $this->custom_result_object[$class_name] = $result_object;
93        }
94
95        // --------------------------------------------------------------------
96
97        /**
98         * Query result.  "object" version.
99         *
100         * @access      public
101         * @return      object
102         */
103        public function result_object()
104        {
105                if (count($this->result_object) > 0)
106                {
107                        return $this->result_object;
108                }
109
110                // In the event that query caching is on the result_id variable
111                // will return FALSE since there isn't a valid SQL resource so
112                // we'll simply return an empty array.
113                if ($this->result_id === FALSE OR $this->num_rows() == 0)
114                {
115                        return array();
116                }
117
118                $this->_data_seek(0);
119                while ($row = $this->_fetch_object())
120                {
121                        $this->result_object[] = $row;
122                }
123
124                return $this->result_object;
125        }
126
127        // --------------------------------------------------------------------
128
129        /**
130         * Query result.  "array" version.
131         *
132         * @access      public
133         * @return      array
134         */
135        public function result_array()
136        {
137                if (count($this->result_array) > 0)
138                {
139                        return $this->result_array;
140                }
141
142                // In the event that query caching is on the result_id variable
143                // will return FALSE since there isn't a valid SQL resource so
144                // we'll simply return an empty array.
145                if ($this->result_id === FALSE OR $this->num_rows() == 0)
146                {
147                        return array();
148                }
149
150                $this->_data_seek(0);
151                while ($row = $this->_fetch_assoc())
152                {
153                        $this->result_array[] = $row;
154                }
155
156                return $this->result_array;
157        }
158
159        // --------------------------------------------------------------------
160
161        /**
162         * Query result.  Acts as a wrapper function for the following functions.
163         *
164         * @access      public
165         * @param       string
166         * @param       string  can be "object" or "array"
167         * @return      mixed   either a result object or array
168         */
169        public function row($n = 0, $type = 'object')
170        {
171                if ( ! is_numeric($n))
172                {
173                        // We cache the row data for subsequent uses
174                        if ( ! is_array($this->row_data))
175                        {
176                                $this->row_data = $this->row_array(0);
177                        }
178
179                        // array_key_exists() instead of isset() to allow for MySQL NULL values
180                        if (array_key_exists($n, $this->row_data))
181                        {
182                                return $this->row_data[$n];
183                        }
184                        // reset the $n variable if the result was not achieved
185                        $n = 0;
186                }
187
188                if ($type == 'object') return $this->row_object($n);
189                else if ($type == 'array') return $this->row_array($n);
190                else return $this->custom_row_object($n, $type);
191        }
192
193        // --------------------------------------------------------------------
194
195        /**
196         * Assigns an item into a particular column slot
197         *
198         * @access      public
199         * @return      object
200         */
201        public function set_row($key, $value = NULL)
202        {
203                // We cache the row data for subsequent uses
204                if ( ! is_array($this->row_data))
205                {
206                        $this->row_data = $this->row_array(0);
207                }
208
209                if (is_array($key))
210                {
211                        foreach ($key as $k => $v)
212                        {
213                                $this->row_data[$k] = $v;
214                        }
215
216                        return;
217                }
218
219                if ($key != '' AND ! is_null($value))
220                {
221                        $this->row_data[$key] = $value;
222                }
223        }
224
225        // --------------------------------------------------------------------
226
227        /**
228         * Returns a single result row - custom object version
229         *
230         * @access      public
231         * @return      object
232         */
233        public function custom_row_object($n, $type)
234        {
235                $result = $this->custom_result_object($type);
236
237                if (count($result) == 0)
238                {
239                        return $result;
240                }
241
242                if ($n != $this->current_row AND isset($result[$n]))
243                {
244                        $this->current_row = $n;
245                }
246
247                return $result[$this->current_row];
248        }
249
250        /**
251         * Returns a single result row - object version
252         *
253         * @access      public
254         * @return      object
255         */
256        public function row_object($n = 0)
257        {
258                $result = $this->result_object();
259
260                if (count($result) == 0)
261                {
262                        return $result;
263                }
264
265                if ($n != $this->current_row AND isset($result[$n]))
266                {
267                        $this->current_row = $n;
268                }
269
270                return $result[$this->current_row];
271        }
272
273        // --------------------------------------------------------------------
274
275        /**
276         * Returns a single result row - array version
277         *
278         * @access      public
279         * @return      array
280         */
281        public function row_array($n = 0)
282        {
283                $result = $this->result_array();
284
285                if (count($result) == 0)
286                {
287                        return $result;
288                }
289
290                if ($n != $this->current_row AND isset($result[$n]))
291                {
292                        $this->current_row = $n;
293                }
294
295                return $result[$this->current_row];
296        }
297
298
299        // --------------------------------------------------------------------
300
301        /**
302         * Returns the "first" row
303         *
304         * @access      public
305         * @return      object
306         */
307        public function first_row($type = 'object')
308        {
309                $result = $this->result($type);
310
311                if (count($result) == 0)
312                {
313                        return $result;
314                }
315                return $result[0];
316        }
317
318        // --------------------------------------------------------------------
319
320        /**
321         * Returns the "last" row
322         *
323         * @access      public
324         * @return      object
325         */
326        public function last_row($type = 'object')
327        {
328                $result = $this->result($type);
329
330                if (count($result) == 0)
331                {
332                        return $result;
333                }
334                return $result[count($result) -1];
335        }
336
337        // --------------------------------------------------------------------
338
339        /**
340         * Returns the "next" row
341         *
342         * @access      public
343         * @return      object
344         */
345        public function next_row($type = 'object')
346        {
347                $result = $this->result($type);
348
349                if (count($result) == 0)
350                {
351                        return $result;
352                }
353
354                if (isset($result[$this->current_row + 1]))
355                {
356                        ++$this->current_row;
357                }
358
359                return $result[$this->current_row];
360        }
361
362        // --------------------------------------------------------------------
363
364        /**
365         * Returns the "previous" row
366         *
367         * @access      public
368         * @return      object
369         */
370        public function previous_row($type = 'object')
371        {
372                $result = $this->result($type);
373
374                if (count($result) == 0)
375                {
376                        return $result;
377                }
378
379                if (isset($result[$this->current_row - 1]))
380                {
381                        --$this->current_row;
382                }
383                return $result[$this->current_row];
384        }
385
386        // --------------------------------------------------------------------
387
388        /**
389         * The following functions are normally overloaded by the identically named
390         * methods in the platform-specific driver -- except when query caching
391         * is used.  When caching is enabled we do not load the other driver.
392         * These functions are primarily here to prevent undefined function errors
393         * when a cached result object is in use.  They are not otherwise fully
394         * operational due to the unavailability of the database resource IDs with
395         * cached results.
396         */
397        public function num_rows() { return $this->num_rows; }
398        public function num_fields() { return 0; }
399        public function list_fields() { return array(); }
400        public function field_data() { return array(); }
401        public function free_result() { return TRUE; }
402        protected function _data_seek() { return TRUE; }
403        protected function _fetch_assoc() { return array(); }
404        protected function _fetch_object() { return array(); }
405
406}
407// END DB_result class
408
409/* End of file DB_result.php */
410/* Location: ./system/database/DB_result.php */
Note: See TracBrowser for help on using the repository browser.