tables.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. function tables(&$link) {
  3. $tables=array();
  4. $res=mysqli_query($link,'SHOW TABLES')
  5. or mexit(mysqli_error($link).N,1);
  6. while ($row=mysqli_fetch_row($res)) {
  7. $resb=mysqli_query($link,'SHOW COLUMNS FROM '.$row[0])
  8. or mexit(mysqli_error($link).N,1);
  9. $fields=array();
  10. // lo uso solo per alcuni tipi, quindi non sto a cercare completezza
  11. while ($rowb=mysqli_fetch_assoc($resb)) {
  12. if (preg_match('/(\w+)\((.*)\)( unsigned)?/',$rowb['Type'],$buf)===1) {
  13. switch ($buf[1]) {
  14. case 'char':
  15. case 'varchar':
  16. $fields[$rowb['Field']]=$buf[2];
  17. break;
  18. case 'tinyint':
  19. if (array_key_exists(3,$buf))
  20. $fields[$rowb['Field']]=array('min'=>0,'max'=>255);
  21. else
  22. $fields[$rowb['Field']]=array('min'=>-128,'max'=>127);
  23. break;
  24. case 'smallint':
  25. if (array_key_exists(3,$buf))
  26. $fields[$rowb['Field']]=array('min'=>0,'max'=>65535);
  27. else
  28. $fields[$rowb['Field']]=array('min'=>-32768,'max'=>32767);
  29. break;
  30. case 'mediumint':
  31. if (array_key_exists(3,$buf))
  32. $fields[$rowb['Field']]=array('min'=>0,'max'=>16777215);
  33. else
  34. $fields[$rowb['Field']]=array('min'=>-8388608,'max'=>8388607);
  35. break;
  36. case 'int':
  37. if (array_key_exists(3,$buf))
  38. $fields[$rowb['Field']]=array('min'=>0,'max'=>4294967295);
  39. else
  40. $fields[$rowb['Field']]=array('min'=>-2147483648,'max'=>2147483647);
  41. break;
  42. // 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"
  43. case 'bigint':
  44. if (array_key_exists(3,$buf))
  45. $fields[$rowb['Field']]=array('min'=>'0','max'=>'18446744073709551615');
  46. else
  47. $fields[$rowb['Field']]=array('min'=>'-9223372036854775808','max'=>'9223372036854775807');
  48. break;
  49. case 'decimal':
  50. // questo è da testare contro un decimale vero
  51. // fatto, il risultato è che in mysql devo usare decimal(14,4)
  52. if (preg_match('/,/',$buf[2])===1) {
  53. $lim=explode(',',$buf[2]);
  54. } else {
  55. $lim[0]=$buf[2];
  56. $lim[1]=0;
  57. }
  58. $int=$lim[0]-$lim[1];
  59. $sint='';
  60. for ($i=0; $i<$int; $i++)
  61. $sint.='9';
  62. $sdec='';
  63. for ($i=0; $i<$lim[1]; $i++)
  64. $sdec.='9';
  65. $max=$sint.'.'.$sdec;
  66. if (array_key_exists(3,$buf))
  67. $fields[$rowb['Field']]=array('min'=>0,'max'=>floatval($max));
  68. else
  69. $fields[$rowb['Field']]=array('min'=>floatval('-'.$max),'max'=>floatval($max));
  70. break;
  71. default:
  72. $fields[$rowb['Field']]=$rowb['Type'];
  73. break;
  74. }
  75. } elseif ($rowb['Type']=='text') {
  76. $fields[$rowb['Field']]=65535;
  77. } else {
  78. $fields[$rowb['Field']]=$rowb['Type'];
  79. }
  80. }
  81. $tables[$row[0]]=$fields;
  82. }
  83. return($tables);
  84. }
  85. ?>