<?php
////////////////////////////////////////////////////////////////////
class MySQLResultSet {
  //dane składowe
  private $strSQL;
  private $databasename;
  private $connection;
  private $result;
////////////////////////////////////////////////////////////////////
//konstruktor
////////////////////////////////////////////////////////////////////
  public function MySQLResultSet( $strSQL, $databasename, $connection ){
    $this->strSQL = $strSQL;
    $this->connection = $connection;
    $this->databasename = $databasename;
    mysql_selectdb($databasename, $connection) or
      die ( mysql_error(). " Błąd nr:".mysql_errno());
    $this->result = mysql_query($strSQL, $connection) or
      die ( mysql_error(). " Błąd nr:".mysql_errno());
    //sprawdza obecność SQL_CALC_FOUND_ROWS
    if(stristr($strSQL,"SQL_CALC_FOUND_ROWS")){ 
      $msg = "No need to use SQL_CALC_FOUND_ROWS.";
      die($msg);
    }
  }
////////////////////////////////////////////////////////////////////
//destruktor - wywoływany jawnie w PHP 4
////////////////////////////////////////////////////////////////////
  public function __destruct(){
    $this->close();
  }
////////////////////////////////////////////////////////////////////
// metody publiczne
////////////////////////////////////////////////////////////////////
  public function getRow(){
    return mysql_fetch_array($this->result);
  }
////////////////////////////////////////////////////////////////////
  public function getDatabaseName(){
    return $this->databasename;
  }
////////////////////////////////////////////////////////////////////
  public function getNumberColumns(){
    return mysql_num_fields($this->result);
  }
////////////////////////////////////////////////////////////////////
//tylko zapytania select
////////////////////////////////////////////////////////////////////
  public function getNumberRows(){
    return mysql_num_rows($this->result);
  }
////////////////////////////////////////////////////////////////////
  public function getInsertId(){
    return mysql_insert_id($this->connection); 
  }
////////////////////////////////////////////////////////////////////
//Oblicza całkowitą liczbę rekordów, jeśli obecny jest warunek ograniczający
//Przydaje się w wyznaczaniu liczby stron w wersjach niższych niż 4
//Użycie DISTRICT daje niewiarygodne wyniki
////////////////////////////////////////////////////////////////////
  public function getUnlimitedNumberRows(){    
    $number = 0;
    $versionnumber = $this->findVersionNumber();
    //potrzebna jedynie skrajna cyfra
    $version = substr($versionnumber,0,1);    
    //CHECK SELECT
    if (!$this->checkForSelect()){
      $msg = "Nielegalne wywołanie metody - to nie jest zapytanie SELECT";
      die( $msg );
    }
    //sprawdza warunek ograniczający
    $tempsql = strtoupper($this->strSQL);
    $end = strpos($tempsql,"LIMIT");    
    if ($end === false){ //bez warunku limit
      $number = mysql_num_rows($this->result);
    }elseif ($version < 4){
      $number = $this->countVersionThree($end);
    }else{ //wersja 4 lub wyższa korzysta z funkcji SQL_CALC_FOUND_ROWS
      $number = $this->countVersionFour();                
    }
    return $number;  
  }
////////////////////////////////////////////////////////////////////
  public function getFieldNames(){
    $fieldnames = array();
    if(isset($this->result)){
      $num = mysql_numfields($this->result);
      for($i = 0; $i < $num; $i++) {        
        $meta = mysql_fetch_field($this->result, $i) or
          die ( mysql_error(). " Błąd nr:".mysql_errno());
         $fieldnames[$i] = $meta->name;        
      }
    }
    return $fieldnames;
  }
////////////////////////////////////////////////////////////////////
  public function findVersionNumber(){
    //mysql_get_server_info
    return mysql_get_server_info($this->connection);
  }
////////////////////////////////////////////////////////////////////
//metody prywatne
////////////////////////////////////////////////////////////////////  
  private function checkForSelect(){
    $bln = true;
    $strtemp = trim(strtoupper($this->strSQL));
    if(substr($strtemp,0,6)!= "SELECT"){
      $bln = false;
    }
    return $bln;  
  }
////////////////////////////////////////////////////////////////////
  private function close(){
    if(isset($this->result)){
      mysql_free_result($this->result);
      unset($this->result);
    }
  }
////////////////////////////////////////////////////////////////////  
  private function countVersionFour(){
    $tempsql = trim($this->strSQL);
   //wstawia SQL_CALC_FOUND_ROWS
    $insertstr = " SQL_CALC_FOUND_ROWS ";
   //już wie, że rozpoczyna się wyrażeniem "SELECT"
    $tempsql = substr_replace($tempsql, $insertstr, 6, 1);          
    $rs = mysql_query($tempsql, $this->connection) or
      die ( mysql_error(). " Błąd nr:".mysql_errno());
    $tempsql = "SELECT FOUND_ROWS()";
    $rs = mysql_query($tempsql) or
      die ( mysql_error(). " Błąd nr:".mysql_errno());
    $row = mysql_fetch_row($rs);
    $number = $row[0];
    //pozbywa się $rs
    mysql_free_result($rs);
    return $number;
  }
////////////////////////////////////////////////////////////////////  
  private function countVersionThree($end){
    $tempsql = strtoupper($this->strSQL);
    //sprawdza DISTINCT - będzie odrzucać 
     if(!strpos($tempsql,"DISTINCT")){
      //tworzy zestaw zmiennych
      $start =  strpos($tempsql,"FROM");
      $numchars = $end-$start;
      $countsql = "SELECT COUNT(*) ";
      $countsql .= substr($this->strSQL, $start, $numchars);
      $rs = mysql_query($countsql, $this->connection) or
        die ( mysql_error(). " Błąd nr:".mysql_errno());
      $row = mysql_fetch_row($rs);
      $number = $row[0];
      //pozbywa się $rs
      mysql_free_result($rs);          
    }else{         
      $msg = "Korzystanie ze słowa kluczowego DISTINCT, ".
        "oblicza całkowitą liczbę ręcznie.";
      die($msg);
    }
    return $number;
  }
}//koniec klasy
?>
