home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / adodb / drivers / adodb-ado5.inc.php < prev    next >
Encoding:
PHP Script  |  2008-02-13  |  16.2 KB  |  675 lines

  1. <?php
  2. /* 
  3. V4.98 13 Feb 2008  (c) 2000-2008 John Lim (jlim#natsoft.com.my). All rights reserved.
  4.   Released under both BSD license and Lesser GPL library license. 
  5.   Whenever there is any discrepancy between the two licenses, 
  6.   the BSD license will take precedence. 
  7. Set tabs to 4 for best viewing.
  8.   
  9.   Latest version is available at http://adodb.sourceforge.net
  10.   
  11.     Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version.
  12. */
  13.  
  14. // security - hide paths
  15. if (!defined('ADODB_DIR')) die();
  16.     
  17. define("_ADODB_ADO_LAYER", 1 );
  18. /*--------------------------------------------------------------------------------------
  19. --------------------------------------------------------------------------------------*/
  20.  
  21.     
  22. class ADODB_ado extends ADOConnection {
  23.     var $databaseType = "ado";    
  24.     var $_bindInputArray = false;
  25.     var $fmtDate = "'Y-m-d'";
  26.     var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
  27.     var $replaceQuote = "''"; // string to use to replace quotes
  28.     var $dataProvider = "ado";    
  29.     var $hasAffectedRows = true;
  30.     var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
  31.     var $_affectedRows = false;
  32.     var $_thisTransactions;
  33.     var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
  34.     var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
  35.     var $_lock_type = -1;
  36.     var $_execute_option = -1;
  37.     var $poorAffectedRows = true; 
  38.     var $charPage;
  39.         
  40.     function ADODB_ado() 
  41.     {     
  42.         $this->_affectedRows = new VARIANT;
  43.     }
  44.  
  45.     function ServerInfo()
  46.     {
  47.         if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
  48.         return array('description' => $desc, 'version' => '');
  49.     }
  50.     
  51.     function _affectedrows()
  52.     {
  53.         if (PHP_VERSION >= 5) return $this->_affectedRows;
  54.         
  55.         return $this->_affectedRows->value;
  56.     }
  57.     
  58.     // you can also pass a connection string like this:
  59.     //
  60.     // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
  61.     function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '')
  62.     {
  63.     // two modes
  64.     //    -    if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat
  65.     //    -     if $argProvider is not empty, then $argDBorProvider holds db
  66.     
  67.         
  68.          if ($argProvider) {
  69.              $argDatabasename = $argDBorProvider;
  70.          } else {
  71.              $argDatabasename = '';
  72.              if ($argDBorProvider) $argProvider = $argDBorProvider;
  73.             else $argProvider = 'MSDASQL';
  74.         }
  75.         
  76.         
  77.         try {
  78.         $u = 'UID';
  79.         $p = 'PWD';
  80.     
  81.         if (!empty($this->charPage))
  82.             $dbc = new COM('ADODB.Connection',null,$this->charPage);
  83.         else
  84.             $dbc = new COM('ADODB.Connection');
  85.             
  86.         if (! $dbc) return false;
  87.  
  88.         /* special support if provider is mssql or access */
  89.         if ($argProvider=='mssql') {
  90.             $u = 'User Id';  //User parameter name for OLEDB
  91.             $p = 'Password'; 
  92.             $argProvider = "SQLOLEDB"; // SQL Server Provider
  93.             
  94.             // not yet
  95.             //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
  96.             
  97.             //use trusted conection for SQL if username not specified
  98.             if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
  99.         } else if ($argProvider=='access')
  100.             $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
  101.         
  102.         if ($argProvider) $dbc->Provider = $argProvider;    
  103.  
  104.         if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename";        
  105.         if ($argUsername) $argHostname .= ";$u=$argUsername";
  106.         if ($argPassword)$argHostname .= ";$p=$argPassword";
  107.         
  108.         if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
  109.         // @ added below for php 4.0.1 and earlier
  110.         @$dbc->Open((string) $argHostname);
  111.         
  112.         $this->_connectionID = $dbc;
  113.         
  114.         $dbc->CursorLocation = $this->_cursor_location;
  115.         return  $dbc->State > 0;
  116.         } catch (exception $e) {
  117.         }
  118.         
  119.         return false;
  120.     }
  121.     
  122.     // returns true or false
  123.     function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
  124.     {
  125.         return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
  126.     }    
  127.     
  128. /*
  129.     adSchemaCatalogs    = 1,
  130.     adSchemaCharacterSets    = 2,
  131.     adSchemaCollations    = 3,
  132.     adSchemaColumns    = 4,
  133.     adSchemaCheckConstraints    = 5,
  134.     adSchemaConstraintColumnUsage    = 6,
  135.     adSchemaConstraintTableUsage    = 7,
  136.     adSchemaKeyColumnUsage    = 8,
  137.     adSchemaReferentialContraints    = 9,
  138.     adSchemaTableConstraints    = 10,
  139.     adSchemaColumnsDomainUsage    = 11,
  140.     adSchemaIndexes    = 12,
  141.     adSchemaColumnPrivileges    = 13,
  142.     adSchemaTablePrivileges    = 14,
  143.     adSchemaUsagePrivileges    = 15,
  144.     adSchemaProcedures    = 16,
  145.     adSchemaSchemata    = 17,
  146.     adSchemaSQLLanguages    = 18,
  147.     adSchemaStatistics    = 19,
  148.     adSchemaTables    = 20,
  149.     adSchemaTranslations    = 21,
  150.     adSchemaProviderTypes    = 22,
  151.     adSchemaViews    = 23,
  152.     adSchemaViewColumnUsage    = 24,
  153.     adSchemaViewTableUsage    = 25,
  154.     adSchemaProcedureParameters    = 26,
  155.     adSchemaForeignKeys    = 27,
  156.     adSchemaPrimaryKeys    = 28,
  157.     adSchemaProcedureColumns    = 29,
  158.     adSchemaDBInfoKeywords    = 30,
  159.     adSchemaDBInfoLiterals    = 31,
  160.     adSchemaCubes    = 32,
  161.     adSchemaDimensions    = 33,
  162.     adSchemaHierarchies    = 34,
  163.     adSchemaLevels    = 35,
  164.     adSchemaMeasures    = 36,
  165.     adSchemaProperties    = 37,
  166.     adSchemaMembers    = 38
  167.  
  168. */
  169.     
  170.     function &MetaTables()
  171.     {
  172.         $arr= array();
  173.         $dbc = $this->_connectionID;
  174.         
  175.         $adors=@$dbc->OpenSchema(20);//tables
  176.         if ($adors){
  177.             $f = $adors->Fields(2);//table/view name
  178.             $t = $adors->Fields(3);//table type
  179.             while (!$adors->EOF){
  180.                 $tt=substr($t->value,0,6);
  181.                 if ($tt!='SYSTEM' && $tt !='ACCESS')
  182.                     $arr[]=$f->value;
  183.                 //print $f->value . ' ' . $t->value.'<br>';
  184.                 $adors->MoveNext();
  185.             }
  186.             $adors->Close();
  187.         }
  188.         
  189.         return $arr;
  190.     }
  191.     
  192.     function &MetaColumns($table)
  193.     {
  194.         $table = strtoupper($table);
  195.         $arr= array();
  196.         $dbc = $this->_connectionID;
  197.         
  198.         $adors=@$dbc->OpenSchema(4);//tables
  199.     
  200.         if ($adors){
  201.             $t = $adors->Fields(2);//table/view name
  202.             while (!$adors->EOF){
  203.                 
  204.                 
  205.                 if (strtoupper($t->Value) == $table) {
  206.                 
  207.                     $fld = new ADOFieldObject();
  208.                     $c = $adors->Fields(3);
  209.                     $fld->name = $c->Value;
  210.                     $fld->type = 'CHAR'; // cannot discover type in ADO!
  211.                     $fld->max_length = -1;
  212.                     $arr[strtoupper($fld->name)]=$fld;
  213.                 }
  214.         
  215.                 $adors->MoveNext();
  216.             }
  217.             $adors->Close();
  218.         }
  219.         
  220.         return $arr;
  221.     }
  222.     
  223.     /* returns queryID or false */
  224.     function &_query($sql,$inputarr=false) 
  225.     {
  226.         try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour...
  227.         
  228.         $dbc = $this->_connectionID;
  229.         
  230.     //    return rs    
  231.     
  232.         $false = false;
  233.         
  234.         if ($inputarr) {
  235.             
  236.             if (!empty($this->charPage))
  237.                 $oCmd = new COM('ADODB.Command',null,$this->charPage);
  238.             else
  239.                 $oCmd = new COM('ADODB.Command');
  240.             $oCmd->ActiveConnection = $dbc;
  241.             $oCmd->CommandText = $sql;
  242.             $oCmd->CommandType = 1;
  243.  
  244.             foreach($inputarr as $val) {
  245.                 // name, type, direction 1 = input, len,
  246.                 $this->adoParameterType = 130;
  247.                 $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
  248.                 //print $p->Type.' '.$p->value;
  249.                 $oCmd->Parameters->Append($p);
  250.             }
  251.             $p = false;
  252.             $rs = $oCmd->Execute();
  253.             $e = $dbc->Errors;
  254.             if ($dbc->Errors->Count > 0) return $false;
  255.             return $rs;
  256.         }
  257.         
  258.         $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
  259.             
  260.         if ($dbc->Errors->Count > 0) return $false;
  261.         if (! $rs) return $false;
  262.         
  263.         if ($rs->State == 0) {
  264.             $true = true;
  265.             return $true; // 0 = adStateClosed means no records returned
  266.         }
  267.         return $rs;
  268.         
  269.         } catch (exception $e) {
  270.             
  271.         }
  272.         return $false;
  273.     }
  274.  
  275.     
  276.     function BeginTrans() 
  277.     { 
  278.         if ($this->transOff) return true;
  279.         
  280.         if (isset($this->_thisTransactions))
  281.             if (!$this->_thisTransactions) return false;
  282.         else {
  283.             $o = $this->_connectionID->Properties("Transaction DDL");
  284.             $this->_thisTransactions = $o ? true : false;
  285.             if (!$o) return false;
  286.         }
  287.         @$this->_connectionID->BeginTrans();
  288.         $this->transCnt += 1;
  289.         return true;
  290.     }
  291.     function CommitTrans($ok=true) 
  292.     { 
  293.         if (!$ok) return $this->RollbackTrans();
  294.         if ($this->transOff) return true;
  295.         
  296.         @$this->_connectionID->CommitTrans();
  297.         if ($this->transCnt) @$this->transCnt -= 1;
  298.         return true;
  299.     }
  300.     function RollbackTrans() {
  301.         if ($this->transOff) return true;
  302.         @$this->_connectionID->RollbackTrans();
  303.         if ($this->transCnt) @$this->transCnt -= 1;
  304.         return true;
  305.     }
  306.     
  307.     /*    Returns: the last error message from previous database operation    */    
  308.  
  309.     function ErrorMsg() 
  310.     {
  311.         if (!$this->_connectionID) return "No connection established";
  312.         $errmsg = '';
  313.         
  314.         try {
  315.             $errc = $this->_connectionID->Errors;
  316.             if (!$errc) return "No Errors object found";
  317.             if ($errc->Count == 0) return '';
  318.             $err = $errc->Item($errc->Count-1);
  319.             $errmsg = $err->Description;
  320.         }catch(exception $e) {
  321.         }
  322.         return $errmsg;
  323.     }
  324.     
  325.     function ErrorNo() 
  326.     {
  327.         $errc = $this->_connectionID->Errors;
  328.         if ($errc->Count == 0) return 0;
  329.         $err = $errc->Item($errc->Count-1);
  330.         return $err->NativeError;
  331.     }
  332.  
  333.     // returns true or false
  334.     function _close()
  335.     {
  336.         if ($this->_connectionID) $this->_connectionID->Close();
  337.         $this->_connectionID = false;
  338.         return true;
  339.     }
  340.     
  341.     
  342. }
  343.     
  344. /*--------------------------------------------------------------------------------------
  345.      Class Name: Recordset
  346. --------------------------------------------------------------------------------------*/
  347.  
  348. class ADORecordSet_ado extends ADORecordSet {    
  349.     
  350.     var $bind = false;
  351.     var $databaseType = "ado";    
  352.     var $dataProvider = "ado";    
  353.     var $_tarr = false; // caches the types
  354.     var $_flds; // and field objects
  355.     var $canSeek = true;
  356.       var $hideErrors = true;
  357.           
  358.     function ADORecordSet_ado($id,$mode=false)
  359.     {
  360.         if ($mode === false) { 
  361.             global $ADODB_FETCH_MODE;
  362.             $mode = $ADODB_FETCH_MODE;
  363.         }
  364.         $this->fetchMode = $mode;
  365.         return $this->ADORecordSet($id,$mode);
  366.     }
  367.  
  368.  
  369.     // returns the field object
  370.     function &FetchField($fieldOffset = -1) {
  371.         $off=$fieldOffset+1; // offsets begin at 1
  372.         
  373.         $o= new ADOFieldObject();
  374.         $rs = $this->_queryID;
  375.         $f = $rs->Fields($fieldOffset);
  376.         $o->name = $f->Name;
  377.         $t = $f->Type;
  378.         $o->type = $this->MetaType($t);
  379.         $o->max_length = $f->DefinedSize;
  380.         $o->ado_type = $t;
  381.         
  382.  
  383.         //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
  384.         return $o;
  385.     }
  386.     
  387.     /* Use associative array to get fields array */
  388.     function Fields($colname)
  389.     {
  390.         if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
  391.         if (!$this->bind) {
  392.             $this->bind = array();
  393.             for ($i=0; $i < $this->_numOfFields; $i++) {
  394.                 $o = $this->FetchField($i);
  395.                 $this->bind[strtoupper($o->name)] = $i;
  396.             }
  397.         }
  398.         
  399.          return $this->fields[$this->bind[strtoupper($colname)]];
  400.     }
  401.  
  402.         
  403.     function _initrs()
  404.     {
  405.         $rs = $this->_queryID;
  406.         $this->_numOfRows = $rs->RecordCount;
  407.         
  408.         $f = $rs->Fields;
  409.         $this->_numOfFields = $f->Count;
  410.     }
  411.     
  412.     
  413.      // should only be used to move forward as we normally use forward-only cursors
  414.     function _seek($row)
  415.     {
  416.        $rs = $this->_queryID; 
  417.         // absoluteposition doesn't work -- my maths is wrong ?
  418.         //    $rs->AbsolutePosition->$row-2;
  419.         //    return true;
  420.         if ($this->_currentRow > $row) return false;
  421.         @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
  422.         return true;
  423.     }
  424.     
  425. /*
  426.     OLEDB types
  427.     
  428.      enum DBTYPEENUM
  429.     {    DBTYPE_EMPTY    = 0,
  430.     DBTYPE_NULL    = 1,
  431.     DBTYPE_I2    = 2,
  432.     DBTYPE_I4    = 3,
  433.     DBTYPE_R4    = 4,
  434.     DBTYPE_R8    = 5,
  435.     DBTYPE_CY    = 6,
  436.     DBTYPE_DATE    = 7,
  437.     DBTYPE_BSTR    = 8,
  438.     DBTYPE_IDISPATCH    = 9,
  439.     DBTYPE_ERROR    = 10,
  440.     DBTYPE_BOOL    = 11,
  441.     DBTYPE_VARIANT    = 12,
  442.     DBTYPE_IUNKNOWN    = 13,
  443.     DBTYPE_DECIMAL    = 14,
  444.     DBTYPE_UI1    = 17,
  445.     DBTYPE_ARRAY    = 0x2000,
  446.     DBTYPE_BYREF    = 0x4000,
  447.     DBTYPE_I1    = 16,
  448.     DBTYPE_UI2    = 18,
  449.     DBTYPE_UI4    = 19,
  450.     DBTYPE_I8    = 20,
  451.     DBTYPE_UI8    = 21,
  452.     DBTYPE_GUID    = 72,
  453.     DBTYPE_VECTOR    = 0x1000,
  454.     DBTYPE_RESERVED    = 0x8000,
  455.     DBTYPE_BYTES    = 128,
  456.     DBTYPE_STR    = 129,
  457.     DBTYPE_WSTR    = 130,
  458.     DBTYPE_NUMERIC    = 131,
  459.     DBTYPE_UDT    = 132,
  460.     DBTYPE_DBDATE    = 133,
  461.     DBTYPE_DBTIME    = 134,
  462.     DBTYPE_DBTIMESTAMP    = 135
  463.     
  464.     ADO Types
  465.     
  466.        adEmpty    = 0,
  467.     adTinyInt    = 16,
  468.     adSmallInt    = 2,
  469.     adInteger    = 3,
  470.     adBigInt    = 20,
  471.     adUnsignedTinyInt    = 17,
  472.     adUnsignedSmallInt    = 18,
  473.     adUnsignedInt    = 19,
  474.     adUnsignedBigInt    = 21,
  475.     adSingle    = 4,
  476.     adDouble    = 5,
  477.     adCurrency    = 6,
  478.     adDecimal    = 14,
  479.     adNumeric    = 131,
  480.     adBoolean    = 11,
  481.     adError    = 10,
  482.     adUserDefined    = 132,
  483.     adVariant    = 12,
  484.     adIDispatch    = 9,
  485.     adIUnknown    = 13,    
  486.     adGUID    = 72,
  487.     adDate    = 7,
  488.     adDBDate    = 133,
  489.     adDBTime    = 134,
  490.     adDBTimeStamp    = 135,
  491.     adBSTR    = 8,
  492.     adChar    = 129,
  493.     adVarChar    = 200,
  494.     adLongVarChar    = 201,
  495.     adWChar    = 130,
  496.     adVarWChar    = 202,
  497.     adLongVarWChar    = 203,
  498.     adBinary    = 128,
  499.     adVarBinary    = 204,
  500.     adLongVarBinary    = 205,
  501.     adChapter    = 136,
  502.     adFileTime    = 64,
  503.     adDBFileTime    = 137,
  504.     adPropVariant    = 138,
  505.     adVarNumeric    = 139
  506. */
  507.     function MetaType($t,$len=-1,$fieldobj=false)
  508.     {
  509.         if (is_object($t)) {
  510.             $fieldobj = $t;
  511.             $t = $fieldobj->type;
  512.             $len = $fieldobj->max_length;
  513.         }
  514.         
  515.         if (!is_numeric($t)) return $t;
  516.         
  517.         switch ($t) {
  518.         case 0:
  519.         case 12: // variant
  520.         case 8: // bstr
  521.         case 129: //char
  522.         case 130: //wc
  523.         case 200: // varc
  524.         case 202:// varWC
  525.         case 128: // bin
  526.         case 204: // varBin
  527.         case 72: // guid
  528.             if ($len <= $this->blobSize) return 'C';
  529.         
  530.         case 201:
  531.         case 203:
  532.             return 'X';
  533.         case 128:
  534.         case 204:
  535.         case 205:
  536.              return 'B';
  537.         case 7:
  538.         case 133: return 'D';
  539.         
  540.         case 134:
  541.         case 135: return 'T';
  542.         
  543.         case 11: return 'L';
  544.         
  545.         case 16://    adTinyInt    = 16,
  546.         case 2://adSmallInt    = 2,
  547.         case 3://adInteger    = 3,
  548.         case 4://adBigInt    = 20,
  549.         case 17://adUnsignedTinyInt    = 17,
  550.         case 18://adUnsignedSmallInt    = 18,
  551.         case 19://adUnsignedInt    = 19,
  552.         case 20://adUnsignedBigInt    = 21,
  553.             return 'I';
  554.         default: return 'N';
  555.         }
  556.     }
  557.     
  558.     // time stamp not supported yet
  559.     function _fetch()
  560.     {    
  561.         $rs = $this->_queryID;
  562.         if (!$rs or $rs->EOF) {
  563.             $this->fields = false;
  564.             return false;
  565.         }
  566.         $this->fields = array();
  567.     
  568.         if (!$this->_tarr) {
  569.             $tarr = array();
  570.             $flds = array();
  571.             for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
  572.                 $f = $rs->Fields($i);
  573.                 $flds[] = $f;
  574.                 $tarr[] = $f->Type;
  575.             }
  576.             // bind types and flds only once
  577.             $this->_tarr = $tarr; 
  578.             $this->_flds = $flds;
  579.         }
  580.         $t = reset($this->_tarr);
  581.         $f = reset($this->_flds);
  582.         
  583.         if ($this->hideErrors)  $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
  584.         for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
  585.             //echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
  586.             switch($t) {
  587.             case 135: // timestamp
  588.                 if (!strlen((string)$f->value)) $this->fields[] = false;
  589.                 else {
  590.                     if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
  591.                         // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
  592.                         $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
  593.                     else 
  594.                         $val = $f->value;
  595.                     $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
  596.                 }
  597.                 break;            
  598.             case 133:// A date value (yyyymmdd) 
  599.                 if ($val = $f->value) {
  600.                     $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
  601.                 } else
  602.                     $this->fields[] = false;
  603.                 break;
  604.             case 7: // adDate
  605.                 if (!strlen((string)$f->value)) $this->fields[] = false;
  606.                 else {
  607.                     if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
  608.                     else $val = $f->value;
  609.                     
  610.                     if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
  611.                     else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
  612.                 }
  613.                 break;
  614.             case 1: // null
  615.                 $this->fields[] = false;
  616.                 break;
  617.             case 6: // currency is not supported properly;
  618.                 ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
  619.                 $this->fields[] = (float) $f->value;
  620.                 break;
  621.             case 11: //BIT;
  622.                 $val = "";
  623.                 if(is_bool($f->value))    {
  624.                     if($f->value==true) $val = 1;
  625.                     else $val = 0;
  626.                 }
  627.                 if(is_null($f->value)) $val = null;
  628.                 
  629.                 $this->fields[] = $val;
  630.                 break;
  631.             default:
  632.                 $this->fields[] = $f->value; 
  633.                 break;
  634.             }
  635.             //print " $f->value $t, ";
  636.             $f = next($this->_flds);
  637.             $t = next($this->_tarr);
  638.         } // for
  639.         if ($this->hideErrors) error_reporting($olde);
  640.         @$rs->MoveNext(); // @ needed for some versions of PHP!
  641.         
  642.         if ($this->fetchMode & ADODB_FETCH_ASSOC) {
  643.             $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
  644.         }
  645.         return true;
  646.     }
  647.     
  648.         function NextRecordSet()
  649.         {
  650.             $rs = $this->_queryID;
  651.             $this->_queryID = $rs->NextRecordSet();
  652.             //$this->_queryID = $this->_QueryId->NextRecordSet();
  653.             if ($this->_queryID == null) return false;
  654.             
  655.             $this->_currentRow = -1;
  656.             $this->_currentPage = -1;
  657.             $this->bind = false;
  658.             $this->fields = false;
  659.             $this->_flds = false;
  660.             $this->_tarr = false;
  661.             
  662.             $this->_inited = false;
  663.             $this->Init();
  664.             return true;
  665.         }
  666.  
  667.     function _close() {
  668.         $this->_flds = false;
  669.         @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
  670.         $this->_queryID = false;    
  671.     }
  672.  
  673. }
  674.  
  675. ?>