1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- <?php
- function tables(&$link) {
- $tables=array();
- $res=mysqli_query($link,'SHOW TABLES')
- or mexit(mysqli_error($link).N,1);
- while ($row=mysqli_fetch_row($res)) {
- $resb=mysqli_query($link,'SHOW COLUMNS FROM '.$row[0])
- or mexit(mysqli_error($link).N,1);
- $fields=array();
- // lo uso solo per alcuni tipi, quindi non sto a cercare completezza
- while ($rowb=mysqli_fetch_assoc($resb)) {
- if (preg_match('/(\w+)\((.*)\)( unsigned)?/',$rowb['Type'],$buf)===1) {
- switch ($buf[1]) {
- case 'char':
- case 'varchar':
- $fields[$rowb['Field']]=$buf[2];
- break;
- case 'tinyint':
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>0,'max'=>255);
- else
- $fields[$rowb['Field']]=array('min'=>-128,'max'=>127);
- break;
- case 'smallint':
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>0,'max'=>65535);
- else
- $fields[$rowb['Field']]=array('min'=>-32768,'max'=>32767);
- break;
- case 'mediumint':
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>0,'max'=>16777215);
- else
- $fields[$rowb['Field']]=array('min'=>-8388608,'max'=>8388607);
- break;
- case 'int':
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>0,'max'=>4294967295);
- else
- $fields[$rowb['Field']]=array('min'=>-2147483648,'max'=>2147483647);
- break;
- // bigint non ci sta in php a meno di usare bcmath o gmp che non è detto siano abilitate sul server, in ogni caso poco importa perché valori bigint vengono usati solo internamente al db, non "vengono da fuori"
- case 'bigint':
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>'0','max'=>'18446744073709551615');
- else
- $fields[$rowb['Field']]=array('min'=>'-9223372036854775808','max'=>'9223372036854775807');
- break;
- case 'decimal':
- // questo è da testare contro un decimale vero
- // fatto, il risultato è che in mysql devo usare decimal(14,4)
- if (preg_match('/,/',$buf[2])===1) {
- $lim=explode(',',$buf[2]);
- } else {
- $lim[0]=$buf[2];
- $lim[1]=0;
- }
- $int=$lim[0]-$lim[1];
- $sint='';
- for ($i=0; $i<$int; $i++)
- $sint.='9';
- $sdec='';
- for ($i=0; $i<$lim[1]; $i++)
- $sdec.='9';
- $max=$sint.'.'.$sdec;
- if (array_key_exists(3,$buf))
- $fields[$rowb['Field']]=array('min'=>0,'max'=>floatval($max));
- else
- $fields[$rowb['Field']]=array('min'=>floatval('-'.$max),'max'=>floatval($max));
- break;
- default:
- $fields[$rowb['Field']]=$rowb['Type'];
- break;
- }
- } elseif ($rowb['Type']=='text') {
- $fields[$rowb['Field']]=65535;
- } else {
- $fields[$rowb['Field']]=$rowb['Type'];
- }
- }
- $tables[$row[0]]=$fields;
- }
- return($tables);
- }
- ?>
|