Version: 0.1
Type: Class
Category: Databases
License: GNU General Public License
Description: Database abstraction layer for MySQL. Caching of the resultset in both numeric and asscociative arrays. Enables you to jump both forwards and backwards in the resultset. Basic XML-output of the resultsets. Debug and logging functions.
<? class dbObject { var $hostname; var $database = "music"; var $username = "www-data"; var $password; var $conLink = false; var $conLinkID; var $result = false; var $errorMsg = false; var $resultArray = false; var $curRow = false; var $resultCount = false; var $queryString; var $queryExecTime; var $queryStoreTime; var $queryTime; var $resultXML; var $XMLHeader = "<?xml version="1.0"?>"; var $logfile = "/usr/share/pear/dbObject.log"; var $insert_id; var $affected_rows; var $debug = true; function dbObject ($hostname="",$database="",$username="",$password="") { $this->conLinkID = rand(); if($hostname) $this->hostname = $hostname; if($database) $this->database = $database; if($username) $this->username = $username; if($password) $this->password = $password; if(@!$this->conLink = mysql_connect("$this->hostname","$this->username","$this->password")) { $this->logger("Could not create object: ".$this->error()); return false; } if(!mysql_select_db($this->database,$this->conLink)) { $this->logger("Could not create object: ".$this->error()); return false; } $this->logger("New instance created for '$this->hostname' using '$this->database'"); return $this->conLink; } function close() { if(@!mysql_close($this->conLink)) { $this->logger("Connection closed failed: no open connection"); return false; } $this->logger("Connection closed: [$this->conLink]"); return true; } function logger($string) { if(!string || !$this->logfile) return false; $fp = fopen($this->logfile,"a"); $write = fputs($fp,date('Y-m-d H:i:s')." [$this->conLinkID] From: ".getenv("REMOTE_ADDR")." [$this->username] $string".chr(13).chr(10)); fclose($fp); if($this->debug) echo $string."<br>"; return true; } function error() { @$this->errorMsg = mysql_error(); return $this->errorMsg; } function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } function query($str,$store=true,$insert=false) { if(!$this->conLink) { $this->logger("Query failed: '$this->queryString' ".$this->error()); return false; } $db = $this->conLink; $this->queryString = $str; $start = $this->getmicrotime(); if(!$this->result = mysql_query($this->queryString)) { $this->logger("Query failed: '$this->queryString' ".$this->error()); return false; } if(!$store) { if($insert) $this->insert_id = mysql_insert_id($this->conLink); $end = $this->getmicrotime(); $this->queryExecTime = round($end-$start,4); $this->logger("Query executed: '$this->queryString' in $this->queryExecTime"); return $result; } $i = 0; $storetime = $this->getmicrotime(); while($row = mysql_fetch_assoc($this->result)) { $keys = $this->buildKeys($row); $this->resultArray[$i] = $keys; $i++; } $storetimee = $this->getmicrotime(); $this->queryStoreTime = round($storetimee-$storetime,4); $this->logger("Stored resultset and built keys on $i rows in $this->queryStoreTime"); mysql_free_result($this->result); $this->resultCount = $i; $this->curRow = -1; $end = $this->getmicrotime(); $this->queryExecTime = round($end-$start,4); $this->queryTime = $this->queryExecTime+$this->queryStoreTime; $this->logger("Query executed: '$this->queryString' in $this->queryExecTime"); $this->logger("Total querytime: $this->queryTime"); return true; } function buildKeys($row) { $i = 0; $keys = array(); while(list($key,$val) = each($row)) { $keys[$key] = $val; $keys[$i] = $val; $i++; } return $keys; } function insert($inserts,$table) { if(!$inserts || !$table) return false; if(!is_array($inserts)) { $this->logger("INSERT: parameter was not an array."); return false; } while(list($key,$val) = each($inserts)) { $values = $values . "'$val',"; $cols = $cols . "$key,"; } $str = "insert into $table(".substr($cols,0,strlen($cols)-1).") values(".substr($values,0,strlen($values)-1).")"; return $this->query($str,0,1); } function del($string) { $start = $this->getmicrotime(); if(!$string) return false; $this->queryString = $string; if(!$result = mysql_query($this->queryString)) { $this->logger("DEL: error while executing query '$this->queryString'".chr(13).chr(10).$this->error()); return false; } $this->affected_rows = mysql_affected_rows($this->conLink); $end = $this->getmicrotime(); $this->queryExecTime = round($end-$start,4); $this->logger("Delete query executed: '$this->queryString' in $this->queryExecTime"); return true; } function upd($fields=false,$table=false,$where=false,$string=false) { if(!is_array($fields) && !$table && !$where && !$string) return false; $start = $this->getmicrotime(); if(is_array($fields) && $table) { while(list($key,$val) = each($fields)) { $values = $values . "$key='$val',"; } if($where) $this->queryString = "update $table set ".substr($values,0,strlen($values)-1) ." where $where"; else $this->queryString = "update $table set ".substr($values,0,strlen($values)-1); } else { if($string) $this->queryString = $string; else return false; } if(!$result = mysql_unbuffered_query($this->queryString)) { $this->logger("UPD: error while executing query '$this->queryString'".chr(13).chr(10).$this->error()); return false; } else { $this->affected_rows = mysql_affected_rows($this->conLink); $end = $this->getmicrotime(); $this->queryExecTime = round($end-$start,4); $this->logger("Update query executed: '$this->queryString' in $this->queryExecTime"); return true; } if(!$result = mysql_unbuffered_query($string)) { $this->logger("UPD: error while executing query '$string'".chr(13).chr(10).$this->error()); return false; } else { $this->affected_rows = mysql_affected_rows($this->conLink); $end = $this->getmicrotime(); $this->queryExecTime = round($end-$start,4); $this->logger("Update query executed: '$string' in $this->queryExecTime"); return true; } } function first($format="") { $fields = $this->resultArray[0]; if(!$fields) { $this->logger("FIRST: could not get first row in resultset."); return false; } $this->curRow = 0; if(!$format) return $fields; $formatTmp = $format; while( list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function curr($format="") { $fields = $this->resultArray[$this->curRow]; if(!$fields) { $this->logger("CURRENT: could not get current row in resultset."); } if(!$format) return $fields; $formatTmp = $format; while( list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function last($format="") { $fields = $this->resultArray[$this->resultCount-1]; if(!$fields) { $this->logger("LAST: could not get last row in resultset."); return false; } $this->curRow = $this->resultCount; if(!$format) return $fields; $formatTmp = $format; while( list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function getRow($format="",$curRow=-1) { if($curRow == -1) $curRow = $this->curRow; $fields = $this->resultArray[$curRow]; if(!$fields) { $this->logger("ROW: could not get row $curRow in resultset."); return false; } if(!$format) return $fields; $formatTmp = $format; while( list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function next($format="") { $this->curRow++; if($this->resultCount <= $this->curRow) return false; $fields = $this->resultArray[$this->curRow]; if(!$fields) { $this->logger("NEXT: could not get next row in resultset ($this->curRow / $this->resultCount)"); return false; } if(!$format) return true; $formatTmp = $format; while(list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function prev($format="") { $this->curRow--; if($this->curRow < 0) return false; $fields = $this->resultArray[$this->curRow]; if(!$fields) { $this->logger("PREV: could not get previous row in resultset ($this->curRow / $this->resultCount)"); return false; } if(!$format) return true; $formatTmp = $format; while( list($key,$val) = each($fields) ) { $formatTmp = str_replace("<!--$key-->",$val,$formatTmp); } return $formatTmp; } function getVal($fieldname,$curRow=-1,$keys=-1) { if($curRow == -1) $curRow = $this->curRow; $row = $this->resultArray[$curRow]; if($keys == -1) { $value = $row[$fieldname]; if(!$value) { $this->logger("GETVAL: Could not get requested field '$fieldname'"); return false; } return $value; } while(list($key,$val) = each($row) ) { echo "Key: $key - $val<br>"; } } function showResult() { $string = "<table border=0>"; while(list($rowkey,$row) = each($this->resultArray)) { $string = $string . "<tr><td width=40><b>row:</b></td><td colspan=2>$rowkey</td></tr>n"; while(list($key,$val) = each($row)) { if($bg == "#ffffff") { $bg = "#f0f0f0"; } else { $bg = "#ffffff"; } $string = $string . "<tr><td> </td> <td bgcolor="$bg" width=60><b>name:</b></td> <td bgcolor="$bg">$key</td> </tr> <tr> <td> </td> <td bgcolor="$bg"><b>value:</b></td> <td bgcolor="$bg">$val</td> </tr>n"; } } $string = $string . "</table>"; return $string; } function resetResult() { $this->curRow = -1; $this->logger("Reseted resultset."); } function clearResult() { $this->resultArray = false; $this->curRow = -1; $this->resultCount = 0; $db = $this->conLink; $this->logger("Resultset cleared"); } function reverseResult() { rsort($this->resultArray); $this->logger("Resultset reversed"); } function getValXML($fieldname,$curRow=-1,$keys=-1) { if($curRow == -1) $curRow = $this->curRow; $row = $this->resultArray[$curRow]; if($keys == -1) return "<record name="$fieldname"><![CDATA[".trim(htmlentities($row[$fieldname]))."]]></value>n"; while(list($key,$val) = each($row) ) { echo "Key: $key - $val<br>"; } } function showResultXML($header=false) { if($header) { $string = $string . $this->XMLHeader; } $string = $string . "<resultset>n"; while(list($rowkey,$row) = each($this->resultArray)) { $string = $string . "<row nr="$rowkey">n"; $i = 0; while(list($key,$val) = each($row)) { $string = $string . "<column nr="$i" name="$key"><![CDATA[".trim(htmlentities($val))."]]></column>n"; $i++; } $string = $string . "</row>n"; } $string = $string . "</resultset>n"; return $string; } function getRowXML($format=-1,$curRow=-1) { $i = 0; $xml = $xml . "<row nr="$curRow">n"; if($curRow == -1) $curRow = $this->curRow; $fields = $this->resultArray[$curRow]; if(!$fields) return "dbObject: Could not get row <b>$row</b> in resultset<br>"; if($format == -1) { while( list($key,$val) = each($fields) ) { $xml = $xml . "<column nr="$i" name="$key"><![CDATA[".trim(htmlentities($val))."]]></column>n"; $i++; } $xml = $xml . "</row>n"; return $xml; } if(strstr($format,",")) { $format = strtok($format,","); while($format) { $formatTmp = str_replace("$format",$fields[$format],$format); $xml = $xml . "<column nr="$i" name="$format"><![CDATA[".trim(htmlentities($formatTmp))."]]></column>n"; $format = strtok(","); $i++; } } else { $formatTmp = str_replace("$format",$fields[$format],$format); $xml = $xml . "<column nr="$i" name="$format"><![CDATA[".trim(htmlentities($formatTmp))."]]></column>n"; $i++; } $xml = $xml . "</row>n"; return $xml; } } ?>