]> CyberLeo.Net >> Repos - Github/YOURLS.git/blob - includes/ezSQL/ez_sql_pdo.php
#total_clicks -> #overall_tracking in surrnd. <p>
[Github/YOURLS.git] / includes / ezSQL / ez_sql_pdo.php
1 <?php
2
3         /**********************************************************************
4         *  Author: Justin Vincent (jv@jvmultimedia.com)
5         *  Web...: http://twitter.com/justinvincent
6         *  Name..: ezSQL_pdo
7         *  Desc..: PDO component (part of ezSQL databse abstraction library)
8         *
9         */
10
11         /**********************************************************************
12         *  ezSQL error strings - PDO
13         */
14     
15     global $ezsql_pdo_str;
16
17         $ezsql_pdo_str = array
18         (
19                 1 => 'Require $dsn and $user and $password to create a connection'
20         );
21
22         /**********************************************************************
23         *  ezSQL Database specific class - PDO
24         */
25
26         if ( ! class_exists ('PDO') ) die('<b>Fatal Error:</b> ezSQL_pdo requires PDO Lib to be compiled and or linked in to the PHP engine');
27         if ( ! class_exists ('ezSQLcore') ) die('<b>Fatal Error:</b> ezSQL_pdo requires ezSQLcore (ez_sql_core.php) to be included/loaded before it can be used');
28
29         class ezSQL_pdo extends ezSQLcore
30         {
31
32                 var $dsn;
33                 var $user;
34                 var $password;
35                 var $rows_affected = false;
36
37                 /**********************************************************************
38                 *  Constructor - allow the user to perform a qucik connect at the 
39                 *  same time as initialising the ezSQL_pdo class
40                 */
41
42                 function __construct($dsn='', $user='', $password='', $ssl=array())
43                 {
44                         // Turn on track errors 
45                         ini_set('track_errors',1);
46                         
47                         if ( $dsn && $user )
48                         {
49                                 $this->connect($dsn, $user, $password);
50                         }
51                 }
52
53                 /**********************************************************************
54                 *  Try to connect to database server
55                 */
56
57                 function connect($dsn='', $user='', $password='', $ssl=array())
58                 {
59                         global $ezsql_pdo_str; $return_val = false;
60                         
61                         // Must have a dsn and user
62                         if ( ! $dsn || ! $user )
63                         {
64                                 $this->register_error($ezsql_pdo_str[1].' in '.__FILE__.' on line '.__LINE__);
65                                 $this->show_errors ? trigger_error($ezsql_pdo_str[1],E_USER_WARNING) : null;
66                         }
67                         
68                         // Establish PDO connection
69                         try 
70                         {
71                                 if(!empty($ssl))
72                                 {
73                                         $this->dbh = new PDO($dsn, $user, $password, $ssl);
74                                 }
75                                 else
76                                 {
77                                         $this->dbh = new PDO($dsn, $user, $password);
78                                 }
79                                 
80                                 $return_val = true;
81                         } 
82                         catch (PDOException $e) 
83                         {
84                                 $this->register_error($e->getMessage());
85                                 $this->show_errors ? trigger_error($e->getMessage(),E_USER_WARNING) : null;
86                         }
87
88                         return $return_val;                     
89                 }
90
91                 /**********************************************************************
92                 *  In the case of PDO quick_connect is not really needed
93                 *  because std. connect already does what quick connect does - 
94                 *  but for the sake of consistency it has been included
95                 */
96
97                 function quick_connect($dsn='', $user='', $password='', $ssl=array())
98                 {
99                         return $this->connect($dsn, $user, $password);
100                 }
101
102                 /**********************************************************************
103                 *  No real equivalent of mySQL select in PDO 
104                 *  once again, function included for the sake of consistency
105                 */
106
107                 function select($dsn='', $user='', $password='', $ssl=array())
108                 {
109                         return $this->connect($dsn, $user, $password);
110                 }
111                 
112                 /**********************************************************************
113                 *  Format a string correctly for safe PDO insert
114                 *  (no mater if magic quotes are on or not)
115                 */
116
117                 function escape($str)
118                 {
119                         switch (gettype($str))
120                         {
121                                 case 'string' : $str = addslashes(stripslashes($str));
122                                 break;
123                                 case 'boolean' : $str = ($str === FALSE) ? 0 : 1;
124                                 break;
125                                 default : $str = ($str === NULL) ? 'NULL' : $str;
126                                 break;
127                         }
128
129                         return $str;
130                 }
131
132                 /**********************************************************************
133                 *  Return specific system date syntax 
134                 *  i.e. Oracle: SYSDATE Mysql: NOW()
135                 */
136
137                 function sysdate()
138                 {
139                         return "NOW()";                 
140                 }
141
142                 /**********************************************************************
143                 *  Hooks into PDO error system and reports it to user
144                 */
145
146                 function catch_error()
147                 {
148                         $error_str = 'No error info';
149                                                 
150                         $err_array = $this->dbh->errorInfo();
151                         
152                         // Note: Ignoring error - bind or column index out of range
153                         if ( isset($err_array[1]) && $err_array[1] != 25)
154                         {
155                                 
156                                 $error_str = '';
157                                 foreach ( $err_array as $entry )
158                                 {
159                                         $error_str .= $entry . ', ';
160                                 }
161
162                                 $error_str = substr($error_str,0,-2);
163
164                                 $this->register_error($error_str);
165                                 $this->show_errors ? trigger_error($error_str.' '.$this->last_query,E_USER_WARNING) : null;
166                                 
167                                 return true;
168                         }
169
170                 }
171
172                 // ==================================================================
173                 //      Basic Query     - see docs for more detail
174
175                 function query($query)
176                 {
177
178                         // For reg expressions
179                         $query = str_replace("/[\n\r]/",'',trim($query)); 
180
181                         // initialise return
182                         $return_val = 0;
183
184                         // Flush cached values..
185                         $this->flush();
186
187                         // Log how the function was called
188                         $this->func_call = "\$db->query(\"$query\")";
189
190                         // Keep track of the last query for debug..
191                         $this->last_query = $query;
192
193                         $this->num_queries++;
194
195                         // Start timer
196                         $this->timer_start($this->num_queries);
197
198                         // Use core file cache function
199                         if ( $cache = $this->get_cache($query) )
200                         {
201
202                                 // Keep tack of how long all queries have taken
203                                 $this->timer_update_global($this->num_queries);
204
205                                 // Trace all queries
206                                 if ( $this->use_trace_log )
207                                 {
208                                         $this->trace_log[] = $this->debug(false);
209                                 }
210
211                                 return $cache;
212                         }
213
214                         // If there is no existing database connection then try to connect
215                         if ( ! isset($this->dbh) || ! $this->dbh )
216                         {
217                                 $this->connect($this->dsn, $this->user, $this->password);
218                 if ( ! isset($this->dbh) || ! $this->dbh )
219                     return false;
220                         }
221
222                         // Query was an insert, delete, update, replace
223                         if ( preg_match("/^(insert|delete|update|replace|drop|create)\s+/i",$query) )
224                         {               
225
226                                 // Perform the query and log number of affected rows
227                                 $this->rows_affected = $this->dbh->exec($query);
228         
229                                 // If there is an error then take note of it..
230                                 if ( $this->catch_error() ) return false;
231
232                                 $is_insert = true;
233
234                                 // Take note of the insert_id
235                                 if ( preg_match("/^(insert|replace)\s+/i",$query) )
236                                 {
237                                         $this->insert_id = @$this->dbh->lastInsertId(); 
238                                 }
239
240                                 // Return number fo rows affected
241                                 $return_val = $this->rows_affected;
242         
243                         }
244                         // Query was an select
245                         else
246                         {
247
248                                 // Perform the query and log number of affected rows
249                                 $sth = $this->dbh->query($query);
250         
251                                 // If there is an error then take note of it..
252                                 if ( $this->catch_error() ) return false;
253
254                                 $is_insert = false;
255                                 
256                                 $col_count = $sth->columnCount();
257                                 
258                                 for ( $i=0 ; $i < $col_count ; $i++ )
259                                 {
260                                         $this->col_info[$i] = new stdClass();
261                                         
262                                         if ( $meta = $sth->getColumnMeta($i) )
263                                         {                                       
264                                                 $this->col_info[$i]->name =  $meta['name'];
265                                                 $this->col_info[$i]->type =  !empty($meta['native_type']) ? $meta['native_type'] : 'undefined';
266                                                 $this->col_info[$i]->max_length =  '';
267                                         }
268                                         else
269                                         {
270                                                 $this->col_info[$i]->name =  'undefined';
271                                                 $this->col_info[$i]->type =  'undefined';
272                                                 $this->col_info[$i]->max_length = '';
273                                         }
274                                 }
275
276                                 // Store Query Results
277                                 $num_rows=0;
278                                 while ( $row = @$sth->fetch(PDO::FETCH_ASSOC) )
279                                 {
280                                         // Store relults as an objects within main array
281                                         $this->last_result[$num_rows] = (object) $row;
282                                         $num_rows++;
283                                 }
284
285                                 // Log number of rows the query returned
286                                 $this->num_rows = $num_rows;
287
288                                 // Return number of rows selected
289                                 $return_val = $this->num_rows;
290
291                         }
292                         
293                         // disk caching of queries
294                         $this->store_cache($query,$is_insert);
295
296                         // If debug ALL queries
297                         $this->trace || $this->debug_all ? $this->debug() : null ;
298
299                         // Keep tack of how long all queries have taken
300                         $this->timer_update_global($this->num_queries);
301
302                         // Trace all queries
303                         if ( $this->use_trace_log )
304                         {
305                                 $this->trace_log[] = $this->debug(false);
306                         }
307                         
308                         return $return_val;
309
310                 }
311
312         }