count_queries = 0; $this->total_query_time = 0; } function query($query, $link) { global $queryLog; global $queryCache; $this->total_queries++; if(isset($queryCache) && $queryCache->inCache($query)) { $cached_value = $queryCache->getFromCache($query); $this->count_queries--; return($cached_value); } if(isset($queryLog)) $queryLog->start($query); $result = mysql_query($query, $link); if(isset($queryLog)) $queryLog->stop($query, $result); if(isset($queryCache)) $queryCache->cache($query, $result); return($result); } function connect($zf_host, $zf_user, $zf_password, $zf_database, $zf_pconnect = 'false', $zp_real = false) { $this->database = $zf_database; $this->user = $zf_user; $this->host = $zf_host; $this->password = $zf_password; $this->pConnect = $zf_pconnect; $this->real = $zp_real; if (!function_exists('mysql_connect')) die ('Call to undefined function: mysql_connect(). Please install the MySQL Connector for PHP'); $connectionRetry = 10; while (!isset($this->link) || ($this->link == FALSE && $connectionRetry !=0) ) { $this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true); $connectionRetry--; } if ($this->link) { if (@mysql_select_db($zf_database, $this->link)) { if (defined('DB_CHARSET') && version_compare(@mysql_get_server_info(), '4.1.0', '>=')) { @mysql_query("SET NAMES '" . DB_CHARSET . "'", $this->link); if (function_exists('mysql_set_charset')) { @mysql_set_charset(DB_CHARSET, $this->link); } else { @mysql_query("SET CHARACTER SET '" . DB_CHARSET . "'", $this->link); } } $this->db_connected = true; if (getenv('TZ') && !defined('DISABLE_MYSQL_TZ_SET')) @mysql_query("SET time_zone = '" . substr_replace(date("O"),":",-2,0) . "'", $this->link); return true; } else { $this->set_error(mysql_errno(),mysql_error(), $zp_real); return false; } } else { $this->set_error(mysql_errno(),mysql_error(), $zp_real); return false; } } function selectdb($zf_database) { @mysql_select_db($zf_database, $this->link); } function prepare_input($zp_string) { if (function_exists('mysql_real_escape_string')) { return mysql_real_escape_string($zp_string, $this->link); } elseif (function_exists('mysql_escape_string')) { return mysql_escape_string($zp_string, $this->link); } else { return addslashes($zp_string); } } function close() { @mysql_close($this->link); } function set_error($zp_err_num, $zp_err_text, $zp_fatal = true) { $this->error_number = $zp_err_num; $this->error_text = $zp_err_text; if ($zp_fatal && $zp_err_num != 1141) { // error 1141 is okay ... should not die on 1141, but just continue on instead $this->show_error(); die(); } } function show_error() { if ($this->error_number == 0 && $this->error_text == DB_ERROR_NOT_CONNECTED && !headers_sent() && file_exists('nddbc.html') ) include('nddbc.html'); echo '
'; if (defined('STRICT_ERROR_REPORTING') && STRICT_ERROR_REPORTING == true) { echo $this->error_number . ' ' . $this->error_text; echo '
in:
[' . (strstr($this->zf_sql, 'db_cache') ? 'db_cache table' : $this->zf_sql) . ']
'; } else { echo 'WARNING: An Error occurred, please refresh the page and try again.'; } trigger_error($this->error_number . ':' . $this->error_text . ' :: ' . $this->zf_sql, E_USER_ERROR); if (defined('IS_ADMIN_FLAG') && IS_ADMIN_FLAG==true) echo 'If you were entering information, press the BACK button in your browser and re-check the information you had entered to be sure you left no blank fields.
'; echo '
'; } function Execute($zf_sql, $zf_limit = false, $zf_cache = false, $zf_cachetime=0) { // bof: collect database queries if (defined('STORE_DB_TRANSACTIONS') && STORE_DB_TRANSACTIONS=='true') { global $PHP_SELF, $box_id, $current_page_base; if (strtoupper(substr($zf_sql,0,6))=='SELECT' /*&& strstr($zf_sql,'products_id')*/) { $f=@fopen(DIR_FS_SQL_CACHE.'/query_selects_' . $current_page_base . '_' . time() . '.txt','a'); if ($f) { fwrite($f, "\n\n" . 'I AM HERE ' . $current_page_base . /*zen_get_all_get_params() .*/ "\n" . 'sidebox: ' . $box_id . "\n\n" . "Explain \n" . $zf_sql.";\n\n"); fclose($f); } unset($f); } } // eof: collect products_id queries global $zc_cache; if ($zf_limit) { $zf_sql = $zf_sql . ' LIMIT ' . $zf_limit; } $this->zf_sql = $zf_sql; if($zf_cache AND $zc_cache->sql_cache_exists($zf_sql, $zf_cachetime)) { $obj = new queryFactoryResult; $obj->cursor = 0; $obj->is_cached = true; $obj->sql_query = $zf_sql; $zp_result_array = $zc_cache->sql_cache_read($zf_sql); $obj->result = $zp_result_array; if (sizeof($zp_result_array) > 0 ) { $obj->EOF = false; while (list($key, $value) = each($zp_result_array[0])) { $obj->fields[$key] = $value; } } else { $obj->EOF = true; } return $obj; } elseif ($zf_cache) { $zc_cache->sql_cache_expire_now($zf_sql); $time_start = explode(' ', microtime()); $obj = new queryFactoryResult; $obj->sql_query = $zf_sql; if (!$this->db_connected) { if (!$this->connect($this->host, $this->user, $this->password, $this->database, $this->pConnect, $this->real)) $this->set_error('0', DB_ERROR_NOT_CONNECTED); } $zp_db_resource = @$this->query($zf_sql, $this->link); if (!$zp_db_resource) $this->set_error(@mysql_errno(),@mysql_error()); if(!is_resource($zp_db_resource)){ $obj = null; return true; } $obj->resource = $zp_db_resource; $obj->cursor = 0; if ($obj->RecordCount() > 0) { $obj->EOF = false; $zp_ii = 0; while (!$obj->EOF) { $zp_result_array = @mysql_fetch_array($zp_db_resource); if ($zp_result_array) { while (list($key, $value) = each($zp_result_array)) { if (!preg_match('/^[0-9]/', $key)) { $obj->result[$zp_ii][$key] = $value; } } } else { $obj->Limit = $zp_ii; $obj->EOF = true; } $zp_ii++; } while (list($key, $value) = each($obj->result[$obj->cursor])) { if (!preg_match('/^[0-9]/', $key)) { $obj->fields[$key] = $value; } } $obj->EOF = false; } else { $obj->EOF = true; } $obj->is_cached = true; $zc_cache->sql_cache_store($zf_sql, $obj->result); $time_end = explode (' ', microtime()); $query_time = $time_end[1]+$time_end[0]-$time_start[1]-$time_start[0]; $this->total_query_time += $query_time; $this->count_queries++; return($obj); } else { $time_start = explode(' ', microtime()); $obj = new queryFactoryResult; if (!$this->db_connected) { if (!$this->connect($this->host, $this->user, $this->password, $this->database, $this->pConnect, $this->real)) $this->set_error('0', DB_ERROR_NOT_CONNECTED); } $zp_db_resource = @$this->query($zf_sql, $this->link); if (!$zp_db_resource) { if (@mysql_errno($this->link) == 2006) { $this->link = FALSE; $this->connect($this->host, $this->user, $this->password, $this->database, $this->pConnect, $this->real); $zp_db_resource = @mysql_query($zf_sql, $this->link); } if (!$zp_db_resource) { $this->set_error(@mysql_errno($this->link),@mysql_error($this->link)); } } if(!is_resource($zp_db_resource)){ $obj = null; return true; } $obj->resource = $zp_db_resource; $obj->cursor = 0; if ($obj->RecordCount() > 0) { $obj->EOF = false; $zp_result_array = @mysql_fetch_array($zp_db_resource); if ($zp_result_array) { while (list($key, $value) = each($zp_result_array)) { if (!preg_match('/^[0-9]/', $key)) { $obj->fields[$key] = $value; } } $obj->EOF = false; } else { $obj->EOF = true; } } else { $obj->EOF = true; } $time_end = explode (' ', microtime()); $query_time = $time_end[1]+$time_end[0]-$time_start[1]-$time_start[0]; $this->total_query_time += $query_time; $this->count_queries++; return($obj); } } function ExecuteRandomMulti($zf_sql, $zf_limit = 0, $zf_cache = false, $zf_cachetime=0) { $this->zf_sql = $zf_sql; $time_start = explode(' ', microtime()); $obj = new queryFactoryResult; $obj->result = array(); if (!$this->db_connected) { if (!$this->connect($this->host, $this->user, $this->password, $this->database, $this->pConnect, $this->real)) $this->set_error('0', DB_ERROR_NOT_CONNECTED); } $zp_db_resource = @$this->query($zf_sql, $this->link); if (!$zp_db_resource) $this->set_error(mysql_errno(),mysql_error()); if(!is_resource($zp_db_resource)){ $obj = null; return true; } $obj->resource = $zp_db_resource; $obj->cursor = 0; $obj->Limit = $zf_limit; if ($obj->RecordCount() > 0 && $zf_limit > 0) { $obj->EOF = false; $zp_Start_row = 0; if ($zf_limit) { $zp_start_row = zen_rand(0, $obj->RecordCount() - $zf_limit); } $obj->Move($zp_start_row); $obj->Limit = $zf_limit; $zp_ii = 0; while (!$obj->EOF) { $zp_result_array = @mysql_fetch_array($zp_db_resource); if ($zp_ii == $zf_limit) $obj->EOF = true; if ($zp_result_array) { while (list($key, $value) = each($zp_result_array)) { $obj->result[$zp_ii][$key] = $value; } } else { $obj->Limit = $zp_ii; $obj->EOF = true; } $zp_ii++; } $obj->result_random = array_rand($obj->result, sizeof($obj->result)); if (is_array($obj->result_random)) { $zp_ptr = $obj->result_random[$obj->cursor]; } else { $zp_ptr = $obj->result_random; } while (list($key, $value) = each($obj->result[$zp_ptr])) { if (!preg_match('/^[0-9]/', $key)) { $obj->fields[$key] = $value; } } $obj->EOF = false; } else { $obj->EOF = true; } $time_end = explode (' ', microtime()); $query_time = $time_end[1]+$time_end[0]-$time_start[1]-$time_start[0]; $this->total_query_time += $query_time; $this->count_queries++; return($obj); } function insert_ID() { return @mysql_insert_id($this->link); } function metaColumns($zp_table) { $sql = "SHOW COLUMNS from :tableName:"; $sql = $this->bindVars($sql, ':tableName:', $zp_table, 'noquotestring'); $res = $this->execute($sql); while (!$res->EOF) { $obj [strtoupper($res->fields['Field'])] = new queryFactoryMeta($res->fields); $res->MoveNext(); } return $obj; } function get_server_info() { if ($this->link) { return mysql_get_server_info($this->link); } else { return UNKNOWN; } } function queryCount() { return $this->count_queries; } function queryTime() { return $this->total_query_time; } function perform ($tableName, $tableData, $performType='INSERT', $performFilter='', $debug=false) { switch (strtolower($performType)) { case 'insert': $insertString = ""; $insertString = "INSERT INTO " . $tableName . " ("; foreach ($tableData as $key => $value) { if ($debug === true) { echo $value['fieldName'] . '#'; } $insertString .= $value['fieldName'] . ", "; } $insertString = substr($insertString, 0, strlen($insertString)-2) . ') VALUES ('; reset($tableData); foreach ($tableData as $key => $value) { $bindVarValue = $this->getBindVarValue($value['value'], $value['type']); $insertString .= $bindVarValue . ", "; } $insertString = substr($insertString, 0, strlen($insertString)-2) . ')'; if ($debug === true) { echo $insertString; die(); } else { $this->execute($insertString); } break; case 'update': $updateString =""; $updateString = 'UPDATE ' . $tableName . ' SET '; foreach ($tableData as $key => $value) { $bindVarValue = $this->getBindVarValue($value['value'], $value['type']); $updateString .= $value['fieldName'] . '=' . $bindVarValue . ', '; } $updateString = substr($updateString, 0, strlen($updateString)-2); if ($performFilter != '') { $updateString .= ' WHERE ' . $performFilter; } if ($debug === true) { echo $updateString; die(); } else { $this->execute($updateString); } break; } } function getBindVarValue($value, $type) { $typeArray = explode(':',$type); $type = $typeArray[0]; switch ($type) { case 'csv': return $value; break; case 'passthru': return $value; break; case 'float': return (!zen_not_null($value) || $value=='' || $value == 0) ? 0 : $value; break; case 'integer': return (int)$value; break; case 'string': if (isset($typeArray[1])) { $regexp = $typeArray[1]; } return '\'' . $this->prepare_input($value) . '\''; break; case 'noquotestring': return $this->prepare_input($value); break; case 'currency': return '\'' . $this->prepare_input($value) . '\''; break; case 'date': return '\'' . $this->prepare_input($value) . '\''; break; case 'enum': if (isset($typeArray[1])) { $enumArray = explode('|', $typeArray[1]); } return '\'' . $this->prepare_input($value) . '\''; case 'regexp': $searchArray = array('[', ']', '(', ')', '{', '}', '|', '*', '?', '.', '$', '^'); foreach ($searchArray as $searchTerm) { $value = str_replace($searchTerm, '\\' . $searchTerm, $value); } return $this->prepare_input($value); default: die('var-type undefined: ' . $type . '('.$value.')'); } } /** * method to do bind variables to a query **/ function bindVars($sql, $bindVarString, $bindVarValue, $bindVarType, $debug = false) { $bindVarTypeArray = explode(':', $bindVarType); $sqlNew = $this->getBindVarValue($bindVarValue, $bindVarType); $sqlNew = str_replace($bindVarString, $sqlNew, $sql); return $sqlNew; } function prepareInput($string) { return $this->prepare_input($string); } } class queryFactoryResult { function queryFactoryResult() { $this->is_cached = false; } function MoveNext() { global $zc_cache; $this->cursor++; if ($this->is_cached) { if ($this->cursor >= sizeof($this->result)) { $this->EOF = true; } else { while(list($key, $value) = each($this->result[$this->cursor])) { $this->fields[$key] = $value; } } } else { $zp_result_array = @mysql_fetch_array($this->resource); if (!$zp_result_array) { $this->EOF = true; } else { while (list($key, $value) = each($zp_result_array)) { if (!preg_match('/^[0-9]/', $key)) { $this->fields[$key] = $value; } } } } } function MoveNextRandom() { $this->cursor++; if ($this->cursor < $this->Limit) { $zp_result_array = $this->result[$this->result_random[$this->cursor]]; while (list($key, $value) = each($zp_result_array)) { if (!preg_match('/^[0-9]/', $key)) { $this->fields[$key] = $value; } } } else { $this->EOF = true; } } function RecordCount() { if ($this->is_cached) return sizeof($this->result); return @mysql_num_rows($this->resource); } function Move($zp_row) { global $db; if ($this->is_cached) { if($zp_row >= sizeof($this->result)) { $this->cursor = sizeof($this->result); $this->EOF = true; } else { $this->cursor = $zp_row; while(list($key, $value) = each($this->result[$this->cursor])) { $this->fields[$key] = $value; } $this->EOF = false; } } else if (@mysql_data_seek($this->resource, $zp_row)) { $zp_result_array = @mysql_fetch_array($this->resource); while (list($key, $value) = each($zp_result_array)) { $this->fields[$key] = $value; } @mysql_data_seek($this->resource, $zp_row); $this->EOF = false; return; } else { $this->EOF = true; $db->set_error(mysql_errno(),mysql_error()); } } } class queryFactoryMeta { function queryFactoryMeta($zp_field) { $type = $zp_field['Type']; $rgx = preg_match('/^[a-z]*/', $type, $matches); $this->type = $matches[0]; $this->max_length = preg_replace('/[a-z\(\)]/', '', $type); } }