|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 /* 00003 V5.14 8 Sept 2011 (c) 2000-2011 John Lim (jlim#natsoft.com). All rights reserved. 00004 Released under both BSD license and Lesser GPL library license. 00005 Whenever there is any discrepancy between the two licenses, 00006 the BSD license will take precedence. 00007 Set tabs to 4 for best viewing. 00008 00009 Latest version is available at http://adodb.sourceforge.net 00010 00011 Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version. 00012 */ 00013 00014 // security - hide paths 00015 if (!defined('ADODB_DIR')) die(); 00016 00017 define("_ADODB_ADO_LAYER", 1 ); 00018 /*-------------------------------------------------------------------------------------- 00019 --------------------------------------------------------------------------------------*/ 00020 00021 00022 class ADODB_ado extends ADOConnection { 00023 var $databaseType = "ado"; 00024 var $_bindInputArray = false; 00025 var $fmtDate = "'Y-m-d'"; 00026 var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; 00027 var $replaceQuote = "''"; // string to use to replace quotes 00028 var $dataProvider = "ado"; 00029 var $hasAffectedRows = true; 00030 var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary 00031 var $_affectedRows = false; 00032 var $_thisTransactions; 00033 var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic 00034 var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient; 00035 var $_lock_type = -1; 00036 var $_execute_option = -1; 00037 var $poorAffectedRows = true; 00038 var $charPage; 00039 00040 function ADODB_ado() 00041 { 00042 $this->_affectedRows = new VARIANT; 00043 } 00044 00045 function ServerInfo() 00046 { 00047 if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; 00048 return array('description' => $desc, 'version' => ''); 00049 } 00050 00051 function _affectedrows() 00052 { 00053 if (PHP_VERSION >= 5) return $this->_affectedRows; 00054 00055 return $this->_affectedRows->value; 00056 } 00057 00058 // you can also pass a connection string like this: 00059 // 00060 // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); 00061 function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '') 00062 { 00063 // two modes 00064 // - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat 00065 // - if $argProvider is not empty, then $argDBorProvider holds db 00066 00067 00068 if ($argProvider) { 00069 $argDatabasename = $argDBorProvider; 00070 } else { 00071 $argDatabasename = ''; 00072 if ($argDBorProvider) $argProvider = $argDBorProvider; 00073 else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */ 00074 $argProvider = 'MSDASQL'; 00075 } 00076 00077 00078 try { 00079 $u = 'UID'; 00080 $p = 'PWD'; 00081 00082 if (!empty($this->charPage)) 00083 $dbc = new COM('ADODB.Connection',null,$this->charPage); 00084 else 00085 $dbc = new COM('ADODB.Connection'); 00086 00087 if (! $dbc) return false; 00088 00089 /* special support if provider is mssql or access */ 00090 if ($argProvider=='mssql') { 00091 $u = 'User Id'; //User parameter name for OLEDB 00092 $p = 'Password'; 00093 $argProvider = "SQLOLEDB"; // SQL Server Provider 00094 00095 // not yet 00096 //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; 00097 00098 //use trusted conection for SQL if username not specified 00099 if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; 00100 } else if ($argProvider=='access') 00101 $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider 00102 00103 if ($argProvider) $dbc->Provider = $argProvider; 00104 00105 if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname"; 00106 00107 00108 if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; 00109 if ($argUsername) $argHostname .= ";$u=$argUsername"; 00110 if ($argPassword)$argHostname .= ";$p=$argPassword"; 00111 00112 if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version"); 00113 // @ added below for php 4.0.1 and earlier 00114 @$dbc->Open((string) $argHostname); 00115 00116 $this->_connectionID = $dbc; 00117 00118 $dbc->CursorLocation = $this->_cursor_location; 00119 return $dbc->State > 0; 00120 } catch (exception $e) { 00121 if ($this->debug) echo "<pre>",$argHostname,"\n",$e,"</pre>\n"; 00122 } 00123 00124 return false; 00125 } 00126 00127 // returns true or false 00128 function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') 00129 { 00130 return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); 00131 } 00132 00133 /* 00134 adSchemaCatalogs = 1, 00135 adSchemaCharacterSets = 2, 00136 adSchemaCollations = 3, 00137 adSchemaColumns = 4, 00138 adSchemaCheckConstraints = 5, 00139 adSchemaConstraintColumnUsage = 6, 00140 adSchemaConstraintTableUsage = 7, 00141 adSchemaKeyColumnUsage = 8, 00142 adSchemaReferentialContraints = 9, 00143 adSchemaTableConstraints = 10, 00144 adSchemaColumnsDomainUsage = 11, 00145 adSchemaIndexes = 12, 00146 adSchemaColumnPrivileges = 13, 00147 adSchemaTablePrivileges = 14, 00148 adSchemaUsagePrivileges = 15, 00149 adSchemaProcedures = 16, 00150 adSchemaSchemata = 17, 00151 adSchemaSQLLanguages = 18, 00152 adSchemaStatistics = 19, 00153 adSchemaTables = 20, 00154 adSchemaTranslations = 21, 00155 adSchemaProviderTypes = 22, 00156 adSchemaViews = 23, 00157 adSchemaViewColumnUsage = 24, 00158 adSchemaViewTableUsage = 25, 00159 adSchemaProcedureParameters = 26, 00160 adSchemaForeignKeys = 27, 00161 adSchemaPrimaryKeys = 28, 00162 adSchemaProcedureColumns = 29, 00163 adSchemaDBInfoKeywords = 30, 00164 adSchemaDBInfoLiterals = 31, 00165 adSchemaCubes = 32, 00166 adSchemaDimensions = 33, 00167 adSchemaHierarchies = 34, 00168 adSchemaLevels = 35, 00169 adSchemaMeasures = 36, 00170 adSchemaProperties = 37, 00171 adSchemaMembers = 38 00172 00173 */ 00174 00175 function MetaTables() 00176 { 00177 $arr= array(); 00178 $dbc = $this->_connectionID; 00179 00180 $adors=@$dbc->OpenSchema(20);//tables 00181 if ($adors){ 00182 $f = $adors->Fields(2);//table/view name 00183 $t = $adors->Fields(3);//table type 00184 while (!$adors->EOF){ 00185 $tt=substr($t->value,0,6); 00186 if ($tt!='SYSTEM' && $tt !='ACCESS') 00187 $arr[]=$f->value; 00188 //print $f->value . ' ' . $t->value.'<br>'; 00189 $adors->MoveNext(); 00190 } 00191 $adors->Close(); 00192 } 00193 00194 return $arr; 00195 } 00196 00197 function MetaColumns($table, $normalize=true) 00198 { 00199 $table = strtoupper($table); 00200 $arr= array(); 00201 $dbc = $this->_connectionID; 00202 00203 $adors=@$dbc->OpenSchema(4);//tables 00204 00205 if ($adors){ 00206 $t = $adors->Fields(2);//table/view name 00207 while (!$adors->EOF){ 00208 00209 00210 if (strtoupper($t->Value) == $table) { 00211 00212 $fld = new ADOFieldObject(); 00213 $c = $adors->Fields(3); 00214 $fld->name = $c->Value; 00215 $fld->type = 'CHAR'; // cannot discover type in ADO! 00216 $fld->max_length = -1; 00217 $arr[strtoupper($fld->name)]=$fld; 00218 } 00219 00220 $adors->MoveNext(); 00221 } 00222 $adors->Close(); 00223 } 00224 00225 return $arr; 00226 } 00227 00228 /* returns queryID or false */ 00229 function _query($sql,$inputarr=false) 00230 { 00231 try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour... 00232 00233 $dbc = $this->_connectionID; 00234 00235 // return rs 00236 00237 $false = false; 00238 00239 if ($inputarr) { 00240 00241 if (!empty($this->charPage)) 00242 $oCmd = new COM('ADODB.Command',null,$this->charPage); 00243 else 00244 $oCmd = new COM('ADODB.Command'); 00245 $oCmd->ActiveConnection = $dbc; 00246 $oCmd->CommandText = $sql; 00247 $oCmd->CommandType = 1; 00248 00249 while(list(, $val) = each($inputarr)) { 00250 $type = gettype($val); 00251 $len=strlen($val); 00252 if ($type == 'boolean') 00253 $this->adoParameterType = 11; 00254 else if ($type == 'integer') 00255 $this->adoParameterType = 3; 00256 else if ($type == 'double') 00257 $this->adoParameterType = 5; 00258 elseif ($type == 'string') 00259 $this->adoParameterType = 202; 00260 else if (($val === null) || (!defined($val))) 00261 $len=1; 00262 else 00263 $this->adoParameterType = 130; 00264 00265 // name, type, direction 1 = input, len, 00266 $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); 00267 00268 $oCmd->Parameters->Append($p); 00269 } 00270 00271 $p = false; 00272 $rs = $oCmd->Execute(); 00273 $e = $dbc->Errors; 00274 if ($dbc->Errors->Count > 0) return $false; 00275 return $rs; 00276 } 00277 00278 $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); 00279 00280 if ($dbc->Errors->Count > 0) return $false; 00281 if (! $rs) return $false; 00282 00283 if ($rs->State == 0) { 00284 $true = true; 00285 return $true; // 0 = adStateClosed means no records returned 00286 } 00287 return $rs; 00288 00289 } catch (exception $e) { 00290 00291 } 00292 return $false; 00293 } 00294 00295 00296 function BeginTrans() 00297 { 00298 if ($this->transOff) return true; 00299 00300 if (isset($this->_thisTransactions)) 00301 if (!$this->_thisTransactions) return false; 00302 else { 00303 $o = $this->_connectionID->Properties("Transaction DDL"); 00304 $this->_thisTransactions = $o ? true : false; 00305 if (!$o) return false; 00306 } 00307 @$this->_connectionID->BeginTrans(); 00308 $this->transCnt += 1; 00309 return true; 00310 } 00311 function CommitTrans($ok=true) 00312 { 00313 if (!$ok) return $this->RollbackTrans(); 00314 if ($this->transOff) return true; 00315 00316 @$this->_connectionID->CommitTrans(); 00317 if ($this->transCnt) @$this->transCnt -= 1; 00318 return true; 00319 } 00320 function RollbackTrans() { 00321 if ($this->transOff) return true; 00322 @$this->_connectionID->RollbackTrans(); 00323 if ($this->transCnt) @$this->transCnt -= 1; 00324 return true; 00325 } 00326 00327 /* Returns: the last error message from previous database operation */ 00328 00329 function ErrorMsg() 00330 { 00331 if (!$this->_connectionID) return "No connection established"; 00332 $errmsg = ''; 00333 00334 try { 00335 $errc = $this->_connectionID->Errors; 00336 if (!$errc) return "No Errors object found"; 00337 if ($errc->Count == 0) return ''; 00338 $err = $errc->Item($errc->Count-1); 00339 $errmsg = $err->Description; 00340 }catch(exception $e) { 00341 } 00342 return $errmsg; 00343 } 00344 00345 function ErrorNo() 00346 { 00347 $errc = $this->_connectionID->Errors; 00348 if ($errc->Count == 0) return 0; 00349 $err = $errc->Item($errc->Count-1); 00350 return $err->NativeError; 00351 } 00352 00353 // returns true or false 00354 function _close() 00355 { 00356 if ($this->_connectionID) $this->_connectionID->Close(); 00357 $this->_connectionID = false; 00358 return true; 00359 } 00360 00361 00362 } 00363 00364 /*-------------------------------------------------------------------------------------- 00365 Class Name: Recordset 00366 --------------------------------------------------------------------------------------*/ 00367 00368 class ADORecordSet_ado extends ADORecordSet { 00369 00370 var $bind = false; 00371 var $databaseType = "ado"; 00372 var $dataProvider = "ado"; 00373 var $_tarr = false; // caches the types 00374 var $_flds; // and field objects 00375 var $canSeek = true; 00376 var $hideErrors = true; 00377 00378 function ADORecordSet_ado($id,$mode=false) 00379 { 00380 if ($mode === false) { 00381 global $ADODB_FETCH_MODE; 00382 $mode = $ADODB_FETCH_MODE; 00383 } 00384 $this->fetchMode = $mode; 00385 return $this->ADORecordSet($id,$mode); 00386 } 00387 00388 00389 // returns the field object 00390 function FetchField($fieldOffset = -1) { 00391 $off=$fieldOffset+1; // offsets begin at 1 00392 00393 $o= new ADOFieldObject(); 00394 $rs = $this->_queryID; 00395 if (!$rs) return false; 00396 00397 $f = $rs->Fields($fieldOffset); 00398 $o->name = $f->Name; 00399 $t = $f->Type; 00400 $o->type = $this->MetaType($t); 00401 $o->max_length = $f->DefinedSize; 00402 $o->ado_type = $t; 00403 00404 00405 //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>"; 00406 return $o; 00407 } 00408 00409 /* Use associative array to get fields array */ 00410 function Fields($colname) 00411 { 00412 if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; 00413 if (!$this->bind) { 00414 $this->bind = array(); 00415 for ($i=0; $i < $this->_numOfFields; $i++) { 00416 $o = $this->FetchField($i); 00417 $this->bind[strtoupper($o->name)] = $i; 00418 } 00419 } 00420 00421 return $this->fields[$this->bind[strtoupper($colname)]]; 00422 } 00423 00424 00425 function _initrs() 00426 { 00427 $rs = $this->_queryID; 00428 00429 try { 00430 $this->_numOfRows = $rs->RecordCount; 00431 } catch (Exception $e) { 00432 $this->_numOfRows = -1; 00433 } 00434 $f = $rs->Fields; 00435 $this->_numOfFields = $f->Count; 00436 } 00437 00438 00439 // should only be used to move forward as we normally use forward-only cursors 00440 function _seek($row) 00441 { 00442 $rs = $this->_queryID; 00443 // absoluteposition doesn't work -- my maths is wrong ? 00444 // $rs->AbsolutePosition->$row-2; 00445 // return true; 00446 if ($this->_currentRow > $row) return false; 00447 @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst 00448 return true; 00449 } 00450 00451 /* 00452 OLEDB types 00453 00454 enum DBTYPEENUM 00455 { DBTYPE_EMPTY = 0, 00456 DBTYPE_NULL = 1, 00457 DBTYPE_I2 = 2, 00458 DBTYPE_I4 = 3, 00459 DBTYPE_R4 = 4, 00460 DBTYPE_R8 = 5, 00461 DBTYPE_CY = 6, 00462 DBTYPE_DATE = 7, 00463 DBTYPE_BSTR = 8, 00464 DBTYPE_IDISPATCH = 9, 00465 DBTYPE_ERROR = 10, 00466 DBTYPE_BOOL = 11, 00467 DBTYPE_VARIANT = 12, 00468 DBTYPE_IUNKNOWN = 13, 00469 DBTYPE_DECIMAL = 14, 00470 DBTYPE_UI1 = 17, 00471 DBTYPE_ARRAY = 0x2000, 00472 DBTYPE_BYREF = 0x4000, 00473 DBTYPE_I1 = 16, 00474 DBTYPE_UI2 = 18, 00475 DBTYPE_UI4 = 19, 00476 DBTYPE_I8 = 20, 00477 DBTYPE_UI8 = 21, 00478 DBTYPE_GUID = 72, 00479 DBTYPE_VECTOR = 0x1000, 00480 DBTYPE_RESERVED = 0x8000, 00481 DBTYPE_BYTES = 128, 00482 DBTYPE_STR = 129, 00483 DBTYPE_WSTR = 130, 00484 DBTYPE_NUMERIC = 131, 00485 DBTYPE_UDT = 132, 00486 DBTYPE_DBDATE = 133, 00487 DBTYPE_DBTIME = 134, 00488 DBTYPE_DBTIMESTAMP = 135 00489 00490 ADO Types 00491 00492 adEmpty = 0, 00493 adTinyInt = 16, 00494 adSmallInt = 2, 00495 adInteger = 3, 00496 adBigInt = 20, 00497 adUnsignedTinyInt = 17, 00498 adUnsignedSmallInt = 18, 00499 adUnsignedInt = 19, 00500 adUnsignedBigInt = 21, 00501 adSingle = 4, 00502 adDouble = 5, 00503 adCurrency = 6, 00504 adDecimal = 14, 00505 adNumeric = 131, 00506 adBoolean = 11, 00507 adError = 10, 00508 adUserDefined = 132, 00509 adVariant = 12, 00510 adIDispatch = 9, 00511 adIUnknown = 13, 00512 adGUID = 72, 00513 adDate = 7, 00514 adDBDate = 133, 00515 adDBTime = 134, 00516 adDBTimeStamp = 135, 00517 adBSTR = 8, 00518 adChar = 129, 00519 adVarChar = 200, 00520 adLongVarChar = 201, 00521 adWChar = 130, 00522 adVarWChar = 202, 00523 adLongVarWChar = 203, 00524 adBinary = 128, 00525 adVarBinary = 204, 00526 adLongVarBinary = 205, 00527 adChapter = 136, 00528 adFileTime = 64, 00529 adDBFileTime = 137, 00530 adPropVariant = 138, 00531 adVarNumeric = 139 00532 */ 00533 function MetaType($t,$len=-1,$fieldobj=false) 00534 { 00535 if (is_object($t)) { 00536 $fieldobj = $t; 00537 $t = $fieldobj->type; 00538 $len = $fieldobj->max_length; 00539 } 00540 00541 if (!is_numeric($t)) return $t; 00542 00543 switch ($t) { 00544 case 0: 00545 case 12: // variant 00546 case 8: // bstr 00547 case 129: //char 00548 case 130: //wc 00549 case 200: // varc 00550 case 202:// varWC 00551 case 128: // bin 00552 case 204: // varBin 00553 case 72: // guid 00554 if ($len <= $this->blobSize) return 'C'; 00555 00556 case 201: 00557 case 203: 00558 return 'X'; 00559 case 128: 00560 case 204: 00561 case 205: 00562 return 'B'; 00563 case 7: 00564 case 133: return 'D'; 00565 00566 case 134: 00567 case 135: return 'T'; 00568 00569 case 11: return 'L'; 00570 00571 case 16:// adTinyInt = 16, 00572 case 2://adSmallInt = 2, 00573 case 3://adInteger = 3, 00574 case 4://adBigInt = 20, 00575 case 17://adUnsignedTinyInt = 17, 00576 case 18://adUnsignedSmallInt = 18, 00577 case 19://adUnsignedInt = 19, 00578 case 20://adUnsignedBigInt = 21, 00579 return 'I'; 00580 default: return 'N'; 00581 } 00582 } 00583 00584 // time stamp not supported yet 00585 function _fetch() 00586 { 00587 $rs = $this->_queryID; 00588 if (!$rs or $rs->EOF) { 00589 $this->fields = false; 00590 return false; 00591 } 00592 $this->fields = array(); 00593 00594 if (!$this->_tarr) { 00595 $tarr = array(); 00596 $flds = array(); 00597 for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { 00598 $f = $rs->Fields($i); 00599 $flds[] = $f; 00600 $tarr[] = $f->Type; 00601 } 00602 // bind types and flds only once 00603 $this->_tarr = $tarr; 00604 $this->_flds = $flds; 00605 } 00606 $t = reset($this->_tarr); 00607 $f = reset($this->_flds); 00608 00609 if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null 00610 for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { 00611 //echo "<p>",$t,' ';var_dump($f->value); echo '</p>'; 00612 switch($t) { 00613 case 135: // timestamp 00614 if (!strlen((string)$f->value)) $this->fields[] = false; 00615 else { 00616 if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); 00617 // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 00618 $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600; 00619 else 00620 $val = $f->value; 00621 $this->fields[] = adodb_date('Y-m-d H:i:s',$val); 00622 } 00623 break; 00624 case 133:// A date value (yyyymmdd) 00625 if ($val = $f->value) { 00626 $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); 00627 } else 00628 $this->fields[] = false; 00629 break; 00630 case 7: // adDate 00631 if (!strlen((string)$f->value)) $this->fields[] = false; 00632 else { 00633 if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); 00634 else $val = $f->value; 00635 00636 if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); 00637 else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); 00638 } 00639 break; 00640 case 1: // null 00641 $this->fields[] = false; 00642 break; 00643 case 20: 00644 case 21: // bigint (64 bit) 00645 $this->fields[] = (float) $f->value; // if 64 bit PHP, could use (int) 00646 break; 00647 case 6: // currency is not supported properly; 00648 ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>'); 00649 $this->fields[] = (float) $f->value; 00650 break; 00651 case 11: //BIT; 00652 $val = ""; 00653 if(is_bool($f->value)) { 00654 if($f->value==true) $val = 1; 00655 else $val = 0; 00656 } 00657 if(is_null($f->value)) $val = null; 00658 00659 $this->fields[] = $val; 00660 break; 00661 default: 00662 $this->fields[] = $f->value; 00663 break; 00664 } 00665 //print " $f->value $t, "; 00666 $f = next($this->_flds); 00667 $t = next($this->_tarr); 00668 } // for 00669 if ($this->hideErrors) error_reporting($olde); 00670 @$rs->MoveNext(); // @ needed for some versions of PHP! 00671 00672 if ($this->fetchMode & ADODB_FETCH_ASSOC) { 00673 $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); 00674 } 00675 return true; 00676 } 00677 00678 function NextRecordSet() 00679 { 00680 $rs = $this->_queryID; 00681 $this->_queryID = $rs->NextRecordSet(); 00682 //$this->_queryID = $this->_QueryId->NextRecordSet(); 00683 if ($this->_queryID == null) return false; 00684 00685 $this->_currentRow = -1; 00686 $this->_currentPage = -1; 00687 $this->bind = false; 00688 $this->fields = false; 00689 $this->_flds = false; 00690 $this->_tarr = false; 00691 00692 $this->_inited = false; 00693 $this->Init(); 00694 return true; 00695 } 00696 00697 function _close() { 00698 $this->_flds = false; 00699 try { 00700 @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) 00701 } catch (Exception $e) { 00702 } 00703 $this->_queryID = false; 00704 } 00705 00706 } 00707 00708 ?>