'Require $dsn and $user and $password to create a connection' ); /********************************************************************** * ezSQL Database specific class - PDO */ if ( ! class_exists ('PDO') ) die('Fatal Error: ezSQL_pdo requires PDO Lib to be compiled and or linked in to the PHP engine'); if ( ! class_exists ('ezSQLcore') ) die('Fatal Error: ezSQL_pdo requires ezSQLcore (ez_sql_core.php) to be included/loaded before it can be used'); class ezSQL_pdo extends ezSQLcore { var $dsn; var $user; var $password; var $rows_affected = false; /********************************************************************** * Constructor - allow the user to perform a qucik connect at the * same time as initialising the ezSQL_pdo class */ function ezSQL_pdo($dsn='', $user='', $password='', $ssl=array()) { // Turn on track errors ini_set('track_errors',1); if ( $dsn && $user ) { $this->connect($dsn, $user, $password); } } /********************************************************************** * Try to connect to database server */ function connect($dsn='', $user='', $password='', $ssl=array()) { global $ezsql_pdo_str; $return_val = false; // Must have a dsn and user if ( ! $dsn || ! $user ) { $this->register_error($ezsql_pdo_str[1].' in '.__FILE__.' on line '.__LINE__); $this->show_errors ? trigger_error($ezsql_pdo_str[1],E_USER_WARNING) : null; } // Establish PDO connection try { if(!empty($ssl)) { $this->dbh = new PDO($dsn, $user, $password, $ssl); } else { $this->dbh = new PDO($dsn, $user, $password); } $return_val = true; } catch (PDOException $e) { $this->register_error($e->getMessage()); $this->show_errors ? trigger_error($e->getMessage(),E_USER_WARNING) : null; } return $return_val; } /********************************************************************** * In the case of PDO quick_connect is not really needed * because std. connect already does what quick connect does - * but for the sake of consistency it has been included */ function quick_connect($dsn='', $user='', $password='', $ssl=array()) { return $this->connect($dsn, $user, $password); } /********************************************************************** * No real equivalent of mySQL select in PDO * once again, function included for the sake of consistency */ function select($dsn='', $user='', $password='', $ssl=array()) { return $this->connect($dsn, $user, $password); } /********************************************************************** * Format a string correctly for safe PDO insert * (no mater if magic quotes are on or not) */ function escape($str) { switch (gettype($str)) { case 'string' : $str = addslashes(stripslashes($str)); break; case 'boolean' : $str = ($str === FALSE) ? 0 : 1; break; default : $str = ($str === NULL) ? 'NULL' : $str; break; } return $str; } /********************************************************************** * Return specific system date syntax * i.e. Oracle: SYSDATE Mysql: NOW() */ function sysdate() { return "NOW()"; } /********************************************************************** * Hooks into PDO error system and reports it to user */ function catch_error() { $error_str = 'No error info'; $err_array = $this->dbh->errorInfo(); // Note: Ignoring error - bind or column index out of range if ( isset($err_array[1]) && $err_array[1] != 25) { $error_str = ''; foreach ( $err_array as $entry ) { $error_str .= $entry . ', '; } $error_str = substr($error_str,0,-2); $this->register_error($error_str); $this->show_errors ? trigger_error($error_str.' '.$this->last_query,E_USER_WARNING) : null; return true; } } // ================================================================== // Basic Query - see docs for more detail function query($query) { // For reg expressions $query = str_replace("/[\n\r]/",'',trim($query)); // initialise return $return_val = 0; // Flush cached values.. $this->flush(); // Log how the function was called $this->func_call = "\$db->query(\"$query\")"; // Keep track of the last query for debug.. $this->last_query = $query; $this->num_queries++; // Start timer $this->timer_start($this->num_queries); // Use core file cache function if ( $cache = $this->get_cache($query) ) { // Keep tack of how long all queries have taken $this->timer_update_global($this->num_queries); // Trace all queries if ( $this->use_trace_log ) { $this->trace_log[] = $this->debug(false); } return $cache; } // If there is no existing database connection then try to connect if ( ! isset($this->dbh) || ! $this->dbh ) { $this->connect($this->dsn, $this->user, $this->password); } // Query was an insert, delete, update, replace if ( preg_match("/^(insert|delete|update|replace|drop|create)\s+/i",$query) ) { // Perform the query and log number of affected rows $this->rows_affected = $this->dbh->exec($query); // If there is an error then take note of it.. if ( $this->catch_error() ) return false; $is_insert = true; // Take note of the insert_id if ( preg_match("/^(insert|replace)\s+/i",$query) ) { $this->insert_id = @$this->dbh->lastInsertId(); } // Return number fo rows affected $return_val = $this->rows_affected; } // Query was an select else { // Perform the query and log number of affected rows $sth = $this->dbh->query($query); // If there is an error then take note of it.. if ( $this->catch_error() ) return false; $is_insert = false; $col_count = $sth->columnCount(); for ( $i=0 ; $i < $col_count ; $i++ ) { $this->col_info[$i] = new stdClass(); if ( $meta = $sth->getColumnMeta($i) ) { $this->col_info[$i]->name = $meta['name']; $this->col_info[$i]->type = !empty($meta['native_type']) ? $meta['native_type'] : 'undefined'; $this->col_info[$i]->max_length = ''; } else { $this->col_info[$i]->name = 'undefined'; $this->col_info[$i]->type = 'undefined'; $this->col_info[$i]->max_length = ''; } } // Store Query Results $num_rows=0; while ( $row = @$sth->fetch(PDO::FETCH_ASSOC) ) { // Store relults as an objects within main array $this->last_result[$num_rows] = (object) $row; $num_rows++; } // Log number of rows the query returned $this->num_rows = $num_rows; // Return number of rows selected $return_val = $this->num_rows; } // disk caching of queries $this->store_cache($query,$is_insert); // If debug ALL queries $this->trace || $this->debug_all ? $this->debug() : null ; // Keep tack of how long all queries have taken $this->timer_update_global($this->num_queries); // Trace all queries if ( $this->use_trace_log ) { $this->trace_log[] = $this->debug(false); } return $return_val; } }