TYPO3 CMS  TYPO3_7-6
adodb-mysql.inc.php
Go to the documentation of this file.
1 <?php
2 /*
3 @version v5.20.3 01-Jan-2016
4 @copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.
5 @copyright (c) 2014 Damien Regad, Mark Newnham and the ADOdb community
6  Released under both BSD license and Lesser GPL library license.
7  Whenever there is any discrepancy between the two licenses,
8  the BSD license will take precedence.
9  Set tabs to 8.
10 
11  This driver only supports the original non-transactional MySQL driver. It
12  is deprected in PHP version 5.5 and removed in PHP version 7. It is deprecated
13  as of ADOdb version 5.20.0. Use the mysqli driver instead, which supports both
14  transactional and non-transactional updates
15 
16  Requires mysql client. Works on Windows and Unix.
17 
18  28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com)
19 */
20 
21 // security - hide paths
22 if (!defined('ADODB_DIR')) die();
23 
24 if (! defined("_ADODB_MYSQL_LAYER")) {
25  define("_ADODB_MYSQL_LAYER", 1 );
26 
27 class ADODB_mysql extends ADOConnection {
28  var $databaseType = 'mysql';
29  var $dataProvider = 'mysql';
30  var $hasInsertID = true;
31  var $hasAffectedRows = true;
32  var $metaTablesSQL = "SELECT
33  TABLE_NAME,
34  CASE WHEN TABLE_TYPE = 'VIEW' THEN 'V' ELSE 'T' END
35  FROM INFORMATION_SCHEMA.TABLES
36  WHERE TABLE_SCHEMA=";
37  var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
38  var $fmtTimeStamp = "'Y-m-d H:i:s'";
39  var $hasLimit = true;
40  var $hasMoveFirst = true;
41  var $hasGenID = true;
42  var $isoDates = true; // accepts dates in ISO format
43  var $sysDate = 'CURDATE()';
44  var $sysTimeStamp = 'NOW()';
45  var $hasTransactions = false;
46  var $forceNewConnect = false;
47  var $poorAffectedRows = true;
48  var $clientFlags = 0;
49  var $charSet = '';
50  var $substr = "substring";
51  var $nameQuote = '`';
52  var $compat323 = false; // true if compat with mysql 3.23
53 
54  function __construct()
55  {
56  if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
57  }
58 
59 
60  // SetCharSet - switch the client encoding
61  function SetCharSet($charset_name)
62  {
63  if (!function_exists('mysql_set_charset')) {
64  return false;
65  }
66 
67  if ($this->charSet !== $charset_name) {
68  $ok = @mysql_set_charset($charset_name,$this->_connectionID);
69  if ($ok) {
70  $this->charSet = $charset_name;
71  return true;
72  }
73  return false;
74  }
75  return true;
76  }
77 
78  function ServerInfo()
79  {
80  $arr['description'] = ADOConnection::GetOne("select version()");
81  $arr['version'] = ADOConnection::_findvers($arr['description']);
82  return $arr;
83  }
84 
85  function IfNull( $field, $ifNull )
86  {
87  return " IFNULL($field, $ifNull) "; // if MySQL
88  }
89 
90  function MetaProcedures($NamePattern = false, $catalog = null, $schemaPattern = null)
91  {
92  // save old fetch mode
93  global $ADODB_FETCH_MODE;
94 
95  $false = false;
96  $save = $ADODB_FETCH_MODE;
97  $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
98 
99  if ($this->fetchMode !== FALSE) {
100  $savem = $this->SetFetchMode(FALSE);
101  }
102 
103  $procedures = array ();
104 
105  // get index details
106 
107  $likepattern = '';
108  if ($NamePattern) {
109  $likepattern = " LIKE '".$NamePattern."'";
110  }
111  $rs = $this->Execute('SHOW PROCEDURE STATUS'.$likepattern);
112  if (is_object($rs)) {
113 
114  // parse index data into array
115  while ($row = $rs->FetchRow()) {
116  $procedures[$row[1]] = array(
117  'type' => 'PROCEDURE',
118  'catalog' => '',
119  'schema' => '',
120  'remarks' => $row[7],
121  );
122  }
123  }
124 
125  $rs = $this->Execute('SHOW FUNCTION STATUS'.$likepattern);
126  if (is_object($rs)) {
127  // parse index data into array
128  while ($row = $rs->FetchRow()) {
129  $procedures[$row[1]] = array(
130  'type' => 'FUNCTION',
131  'catalog' => '',
132  'schema' => '',
133  'remarks' => $row[7]
134  );
135  }
136  }
137 
138  // restore fetchmode
139  if (isset($savem)) {
140  $this->SetFetchMode($savem);
141  }
142  $ADODB_FETCH_MODE = $save;
143 
144  return $procedures;
145  }
146 
156  function MetaTables($ttype=false,$showSchema=false,$mask=false)
157  {
158  $save = $this->metaTablesSQL;
159  if ($showSchema && is_string($showSchema)) {
160  $this->metaTablesSQL .= $this->qstr($showSchema);
161  } else {
162  $this->metaTablesSQL .= "schema()";
163  }
164 
165  if ($mask) {
166  $mask = $this->qstr($mask);
167  $this->metaTablesSQL .= " AND table_name LIKE $mask";
168  }
169  $ret = ADOConnection::MetaTables($ttype,$showSchema);
170 
171  $this->metaTablesSQL = $save;
172  return $ret;
173  }
174 
175 
176  function MetaIndexes ($table, $primary = FALSE, $owner=false)
177  {
178  // save old fetch mode
179  global $ADODB_FETCH_MODE;
180 
181  $false = false;
182  $save = $ADODB_FETCH_MODE;
183  $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
184  if ($this->fetchMode !== FALSE) {
185  $savem = $this->SetFetchMode(FALSE);
186  }
187 
188  // get index details
189  $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
190 
191  // restore fetchmode
192  if (isset($savem)) {
193  $this->SetFetchMode($savem);
194  }
195  $ADODB_FETCH_MODE = $save;
196 
197  if (!is_object($rs)) {
198  return $false;
199  }
200 
201  $indexes = array ();
202 
203  // parse index data into array
204  while ($row = $rs->FetchRow()) {
205  if ($primary == FALSE AND $row[2] == 'PRIMARY') {
206  continue;
207  }
208 
209  if (!isset($indexes[$row[2]])) {
210  $indexes[$row[2]] = array(
211  'unique' => ($row[1] == 0),
212  'columns' => array()
213  );
214  }
215 
216  $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
217  }
218 
219  // sort columns by order in the index
220  foreach ( array_keys ($indexes) as $index )
221  {
222  ksort ($indexes[$index]['columns']);
223  }
224 
225  return $indexes;
226  }
227 
228 
229  // if magic quotes disabled, use mysql_real_escape_string()
230  function qstr($s,$magic_quotes=false)
231  {
232  if (is_null($s)) return 'NULL';
233  if (!$magic_quotes) {
234 
235  if (ADODB_PHPVER >= 0x4300) {
236  if (is_resource($this->_connectionID))
237  return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
238  }
239  if ($this->replaceQuote[0] == '\\'){
240  $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
241  }
242  return "'".str_replace("'",$this->replaceQuote,$s)."'";
243  }
244 
245  // undo magic quotes for "
246  $s = str_replace('\\"','"',$s);
247  return "'$s'";
248  }
249 
250  function _insertid()
251  {
252  return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
253  //return mysql_insert_id($this->_connectionID);
254  }
255 
256  function GetOne($sql,$inputarr=false)
257  {
258  global $ADODB_GETONE_EOF;
259  if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
260  $rs = $this->SelectLimit($sql,1,-1,$inputarr);
261  if ($rs) {
262  $rs->Close();
263  if ($rs->EOF) return $ADODB_GETONE_EOF;
264  return reset($rs->fields);
265  }
266  } else {
267  return ADOConnection::GetOne($sql,$inputarr);
268  }
269  return false;
270  }
271 
272  function BeginTrans()
273  {
274  if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
275  }
276 
277  function _affectedrows()
278  {
279  return mysql_affected_rows($this->_connectionID);
280  }
281 
282  // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
283  // Reference on Last_Insert_ID on the recommended way to simulate sequences
284  var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
285  var $_genSeqSQL = "create table if not exists %s (id int not null)";
286  var $_genSeqCountSQL = "select count(*) from %s";
287  var $_genSeq2SQL = "insert into %s values (%s)";
288  var $_dropSeqSQL = "drop table if exists %s";
289 
290  function CreateSequence($seqname='adodbseq',$startID=1)
291  {
292  if (empty($this->_genSeqSQL)) return false;
293  $u = strtoupper($seqname);
294 
295  $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
296  if (!$ok) return false;
297  return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
298  }
299 
300 
301  function GenID($seqname='adodbseq',$startID=1)
302  {
303  // post-nuke sets hasGenID to false
304  if (!$this->hasGenID) return false;
305 
306  $savelog = $this->_logsql;
307  $this->_logsql = false;
308  $getnext = sprintf($this->_genIDSQL,$seqname);
309  $holdtransOK = $this->_transOK; // save the current status
310  $rs = @$this->Execute($getnext);
311  if (!$rs) {
312  if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
313  $u = strtoupper($seqname);
314  $this->Execute(sprintf($this->_genSeqSQL,$seqname));
315  $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
316  if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
317  $rs = $this->Execute($getnext);
318  }
319 
320  if ($rs) {
321  $this->genID = mysql_insert_id($this->_connectionID);
322  $rs->Close();
323  } else
324  $this->genID = 0;
325 
326  $this->_logsql = $savelog;
327  return $this->genID;
328  }
329 
330  function MetaDatabases()
331  {
332  $qid = mysql_list_dbs($this->_connectionID);
333  $arr = array();
334  $i = 0;
335  $max = mysql_num_rows($qid);
336  while ($i < $max) {
337  $db = mysql_tablename($qid,$i);
338  if ($db != 'mysql') $arr[] = $db;
339  $i += 1;
340  }
341  return $arr;
342  }
343 
344 
345  // Format date column in sql string given an input format that understands Y M D
346  function SQLDate($fmt, $col=false)
347  {
348  if (!$col) $col = $this->sysTimeStamp;
349  $s = 'DATE_FORMAT('.$col.",'";
350  $concat = false;
351  $len = strlen($fmt);
352  for ($i=0; $i < $len; $i++) {
353  $ch = $fmt[$i];
354  switch($ch) {
355 
356  default:
357  if ($ch == '\\') {
358  $i++;
359  $ch = substr($fmt,$i,1);
360  }
362  case '-':
363  case '/':
364  $s .= $ch;
365  break;
366 
367  case 'Y':
368  case 'y':
369  $s .= '%Y';
370  break;
371  case 'M':
372  $s .= '%b';
373  break;
374 
375  case 'm':
376  $s .= '%m';
377  break;
378  case 'D':
379  case 'd':
380  $s .= '%d';
381  break;
382 
383  case 'Q':
384  case 'q':
385  $s .= "'),Quarter($col)";
386 
387  if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
388  else $s .= ",('";
389  $concat = true;
390  break;
391 
392  case 'H':
393  $s .= '%H';
394  break;
395 
396  case 'h':
397  $s .= '%I';
398  break;
399 
400  case 'i':
401  $s .= '%i';
402  break;
403 
404  case 's':
405  $s .= '%s';
406  break;
407 
408  case 'a':
409  case 'A':
410  $s .= '%p';
411  break;
412 
413  case 'w':
414  $s .= '%w';
415  break;
416 
417  case 'W':
418  $s .= '%U';
419  break;
420 
421  case 'l':
422  $s .= '%W';
423  break;
424  }
425  }
426  $s.="')";
427  if ($concat) $s = "CONCAT($s)";
428  return $s;
429  }
430 
431 
432  // returns concatenated string
433  // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
434  function Concat()
435  {
436  $s = "";
437  $arr = func_get_args();
438 
439  // suggestion by andrew005@mnogo.ru
440  $s = implode(',',$arr);
441  if (strlen($s) > 0) return "CONCAT($s)";
442  else return '';
443  }
444 
445  function OffsetDate($dayFraction,$date=false)
446  {
447  if (!$date) $date = $this->sysDate;
448 
449  $fraction = $dayFraction * 24 * 3600;
450  return '('. $date . ' + INTERVAL ' . $fraction.' SECOND)';
451 
452 // return "from_unixtime(unix_timestamp($date)+$fraction)";
453  }
454 
455  // returns true or false
456  function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
457  {
458  if (!empty($this->port)) $argHostname .= ":".$this->port;
459 
460  if (ADODB_PHPVER >= 0x4300)
461  $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
462  $this->forceNewConnect,$this->clientFlags);
463  else if (ADODB_PHPVER >= 0x4200)
464  $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
465  $this->forceNewConnect);
466  else
467  $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
468 
469  if ($this->_connectionID === false) return false;
470  if ($argDatabasename) return $this->SelectDB($argDatabasename);
471  return true;
472  }
473 
474  // returns true or false
475  function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
476  {
477  if (!empty($this->port)) $argHostname .= ":".$this->port;
478 
479  if (ADODB_PHPVER >= 0x4300)
480  $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
481  else
482  $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
483  if ($this->_connectionID === false) return false;
484  if ($this->autoRollback) $this->RollbackTrans();
485  if ($argDatabasename) return $this->SelectDB($argDatabasename);
486  return true;
487  }
488 
489  function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
490  {
491  $this->forceNewConnect = true;
492  return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
493  }
494 
495  function MetaColumns($table, $normalize=true)
496  {
497  $this->_findschema($table,$schema);
498  if ($schema) {
499  $dbName = $this->database;
500  $this->SelectDB($schema);
501  }
502  global $ADODB_FETCH_MODE;
503  $save = $ADODB_FETCH_MODE;
504  $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
505 
506  if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
507  $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
508 
509  if ($schema) {
510  $this->SelectDB($dbName);
511  }
512 
513  if (isset($savem)) $this->SetFetchMode($savem);
514  $ADODB_FETCH_MODE = $save;
515  if (!is_object($rs)) {
516  $false = false;
517  return $false;
518  }
519 
520  $retarr = array();
521  while (!$rs->EOF){
522  $fld = new ADOFieldObject();
523  $fld->name = $rs->fields[0];
524  $type = $rs->fields[1];
525 
526  // split type into type(length):
527  $fld->scale = null;
528  if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
529  $fld->type = $query_array[1];
530  $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
531  $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
532  } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
533  $fld->type = $query_array[1];
534  $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
535  } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
536  $fld->type = $query_array[1];
537  $arr = explode(",",$query_array[2]);
538  $fld->enums = $arr;
539  $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
540  $fld->max_length = ($zlen > 0) ? $zlen : 1;
541  } else {
542  $fld->type = $type;
543  $fld->max_length = -1;
544  }
545  $fld->not_null = ($rs->fields[2] != 'YES');
546  $fld->primary_key = ($rs->fields[3] == 'PRI');
547  $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
548  $fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
549  $fld->unsigned = (strpos($type,'unsigned') !== false);
550  $fld->zerofill = (strpos($type,'zerofill') !== false);
551 
552  if (!$fld->binary) {
553  $d = $rs->fields[4];
554  if ($d != '' && $d != 'NULL') {
555  $fld->has_default = true;
556  $fld->default_value = $d;
557  } else {
558  $fld->has_default = false;
559  }
560  }
561 
562  if ($save == ADODB_FETCH_NUM) {
563  $retarr[] = $fld;
564  } else {
565  $retarr[strtoupper($fld->name)] = $fld;
566  }
567  $rs->MoveNext();
568  }
569 
570  $rs->Close();
571  return $retarr;
572  }
573 
574  // returns true or false
575  function SelectDB($dbName)
576  {
577  $this->database = $dbName;
578  $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
579  if ($this->_connectionID) {
580  return @mysql_select_db($dbName,$this->_connectionID);
581  }
582  else return false;
583  }
584 
585  // parameters use PostgreSQL convention, not MySQL
586  function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
587  {
588  $offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
589  // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
590  if ($nrows < 0) $nrows = '18446744073709551615';
591 
592  if ($secs)
593  $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
594  else
595  $rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
596  return $rs;
597  }
598 
599  // returns queryID or false
600  function _query($sql,$inputarr=false)
601  {
602 
603  return mysql_query($sql,$this->_connectionID);
604  /*
605  global $ADODB_COUNTRECS;
606  if($ADODB_COUNTRECS)
607  return mysql_query($sql,$this->_connectionID);
608  else
609  return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
610  */
611  }
612 
613  /* Returns: the last error message from previous database operation */
614  function ErrorMsg()
615  {
616 
617  if ($this->_logsql) return $this->_errorMsg;
618  if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
619  else $this->_errorMsg = @mysql_error($this->_connectionID);
620  return $this->_errorMsg;
621  }
622 
623  /* Returns: the last error number from previous database operation */
624  function ErrorNo()
625  {
626  if ($this->_logsql) return $this->_errorCode;
627  if (empty($this->_connectionID)) return @mysql_errno();
628  else return @mysql_errno($this->_connectionID);
629  }
630 
631  // returns true or false
632  function _close()
633  {
634  @mysql_close($this->_connectionID);
635 
636  $this->charSet = '';
637  $this->_connectionID = false;
638  }
639 
640 
641  /*
642  * Maximum size of C field
643  */
644  function CharMax()
645  {
646  return 255;
647  }
648 
649  /*
650  * Maximum size of X field
651  */
652  function TextMax()
653  {
654  return 4294967295;
655  }
656 
657  // "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
658  function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
659  {
660  global $ADODB_FETCH_MODE;
661  if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
662 
663  if ( !empty($owner) ) {
664  $table = "$owner.$table";
665  }
666  $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
667  if ($associative) {
668  $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
669  } else {
670  $create_sql = $a_create_table[1];
671  }
672 
673  $matches = array();
674 
675  if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
676  $foreign_keys = array();
677  $num_keys = count($matches[0]);
678  for ( $i = 0; $i < $num_keys; $i ++ ) {
679  $my_field = explode('`, `', $matches[1][$i]);
680  $ref_table = $matches[2][$i];
681  $ref_field = explode('`, `', $matches[3][$i]);
682 
683  if ( $upper ) {
684  $ref_table = strtoupper($ref_table);
685  }
686 
687  // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
688  if (!isset($foreign_keys[$ref_table])) {
689  $foreign_keys[$ref_table] = array();
690  }
691  $num_fields = count($my_field);
692  for ( $j = 0; $j < $num_fields; $j ++ ) {
693  if ( $associative ) {
694  $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
695  } else {
696  $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
697  }
698  }
699  }
700 
701  return $foreign_keys;
702  }
703 
704 
705 }
706 
707 /*--------------------------------------------------------------------------------------
708  Class Name: Recordset
709 --------------------------------------------------------------------------------------*/
710 
711 
712 class ADORecordSet_mysql extends ADORecordSet{
713 
714  var $databaseType = "mysql";
715  var $canSeek = true;
716 
717  function __construct($queryID,$mode=false)
718  {
719  if ($mode === false) {
720  global $ADODB_FETCH_MODE;
721  $mode = $ADODB_FETCH_MODE;
722  }
723  switch ($mode)
724  {
725  case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
726  case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
727  case ADODB_FETCH_DEFAULT:
728  case ADODB_FETCH_BOTH:
729  default:
730  $this->fetchMode = MYSQL_BOTH; break;
731  }
732  $this->adodbFetchMode = $mode;
733  parent::__construct($queryID);
734  }
735 
736  function _initrs()
737  {
738  //GLOBAL $ADODB_COUNTRECS;
739  // $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
740  $this->_numOfRows = @mysql_num_rows($this->_queryID);
741  $this->_numOfFields = @mysql_num_fields($this->_queryID);
742  }
743 
744  function FetchField($fieldOffset = -1)
745  {
746  if ($fieldOffset != -1) {
747  $o = @mysql_fetch_field($this->_queryID, $fieldOffset);
748  $f = @mysql_field_flags($this->_queryID,$fieldOffset);
749  if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
750  //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
751  if ($o) $o->binary = (strpos($f,'binary')!== false);
752  }
753  else { /* The $fieldOffset argument is not provided thus its -1 */
754  $o = @mysql_fetch_field($this->_queryID);
755  //if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
756  $o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
757  }
758 
759  return $o;
760  }
761 
762  function GetRowAssoc($upper = ADODB_ASSOC_CASE)
763  {
764  if ($this->fetchMode == MYSQL_ASSOC && $upper == ADODB_ASSOC_CASE_LOWER) {
765  $row = $this->fields;
766  }
767  else {
768  $row = ADORecordSet::GetRowAssoc($upper);
769  }
770  return $row;
771  }
772 
773  /* Use associative array to get fields array */
774  function Fields($colname)
775  {
776  // added @ by "Michael William Miller" <mille562@pilot.msu.edu>
777  if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
778 
779  if (!$this->bind) {
780  $this->bind = array();
781  for ($i=0; $i < $this->_numOfFields; $i++) {
782  $o = $this->FetchField($i);
783  $this->bind[strtoupper($o->name)] = $i;
784  }
785  }
786  return $this->fields[$this->bind[strtoupper($colname)]];
787  }
788 
789  function _seek($row)
790  {
791  if ($this->_numOfRows == 0) return false;
792  return @mysql_data_seek($this->_queryID,$row);
793  }
794 
795  function MoveNext()
796  {
797  //return adodb_movenext($this);
798  //if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
799  if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
800  $this->_updatefields();
801  $this->_currentRow += 1;
802  return true;
803  }
804  if (!$this->EOF) {
805  $this->_currentRow += 1;
806  $this->EOF = true;
807  }
808  return false;
809  }
810 
811  function _fetch()
812  {
813  $this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode);
814  $this->_updatefields();
815  return is_array($this->fields);
816  }
817 
818  function _close() {
819  @mysql_free_result($this->_queryID);
820  $this->_queryID = false;
821  }
822 
823  function MetaType($t,$len=-1,$fieldobj=false)
824  {
825  if (is_object($t)) {
826  $fieldobj = $t;
827  $t = $fieldobj->type;
828  $len = $fieldobj->max_length;
829  }
830 
831  $len = -1; // mysql max_length is not accurate
832  switch (strtoupper($t)) {
833  case 'STRING':
834  case 'CHAR':
835  case 'VARCHAR':
836  case 'TINYBLOB':
837  case 'TINYTEXT':
838  case 'ENUM':
839  case 'SET':
840  if ($len <= $this->blobSize) return 'C';
841 
842  case 'TEXT':
843  case 'LONGTEXT':
844  case 'MEDIUMTEXT':
845  return 'X';
846 
847  // php_mysql extension always returns 'blob' even if 'text'
848  // so we have to check whether binary...
849  case 'IMAGE':
850  case 'LONGBLOB':
851  case 'BLOB':
852  case 'MEDIUMBLOB':
853  case 'BINARY':
854  return !empty($fieldobj->binary) ? 'B' : 'X';
855 
856  case 'YEAR':
857  case 'DATE': return 'D';
858 
859  case 'TIME':
860  case 'DATETIME':
861  case 'TIMESTAMP': return 'T';
862 
863  case 'INT':
864  case 'INTEGER':
865  case 'BIGINT':
866  case 'TINYINT':
867  case 'MEDIUMINT':
868  case 'SMALLINT':
869 
870  if (!empty($fieldobj->primary_key)) return 'R';
871  else return 'I';
872 
873  default: return 'N';
874  }
875  }
876 
877 }
878 
879 class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
880  function __construct($queryID,$mode=false)
881  {
882  parent::__construct($queryID,$mode);
883  }
884 
885  function MoveNext()
886  {
887  return @adodb_movenext($this);
888  }
889 }
890 
891 }
$database
Definition: server.php:40
if(isset($_REQUEST['nrows'])) else $rs
Definition: server.php:94
debug($variable='', $name=' *variable *', $line=' *line *', $file=' *file *', $recursiveDepth=3, $debugLevel='E_DEBUG')
$sql
Definition: server.php:84