home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / src / PHP / genmysql.php3.txt < prev    next >
Encoding:
Text File  |  2002-05-06  |  12.8 KB  |  417 lines

  1. General-Purpose MySQL
  2.  
  3. Accepts database & hostname from user and then HTTP username and password. Uses this to connect to a MySQL database. Produces a form based on the tables it finds there to allow the user to do SELECTs, INSERTs, and DELETEs. 
  4.  
  5.  
  6. <?php_track_vars?> 
  7. <? 
  8. # $Header: /usr/local/www/docs/lorentz.com/RCS/mysql.php3,v 1.24 1998/07/28 15:04:13 franklin Exp $ 
  9. # Author: Jack McKinney jackmc@lorentz.com 
  10. # You may redistribute this as long as you leave this attribution in. 
  11. # This script accepts a hostname and database name from the user and then 
  12. # uses HTTP basic authentication to get a username and password from the 
  13. # user.  It tries to connect to the named mysql database on the named host 
  14. # using the supplied username and password.  If it fails, it prompts the 
  15. # user for a new username and password. 
  16. # Once successful, the script queries the database for all tables, and then 
  17. # queries each table for all fields.  It outputs a form that has a section 
  18. # each each table listing each field. 
  19. # The user can then fill in some or all of the fields, and press one of three 
  20. # supplied buttons, SELECT, INSERT, DELETE, to take an appropriate action. 
  21. # In using SELECT, there are several special options: 
  22. # If the value supplied is prefixed by an <, =, >, or ~, then that specific 
  23. # comparison is used instead of the default = (~ becomes LIKE). 
  24. # If the value begins with a '$', the remainder is taken as a field name 
  25. # in this or another table (i.e., it is not quoted), so that an inner join or 
  26. # self-join can be performed. 
  27. # FUTURE 
  28. # - Limit number of results returned per page. 
  29. # - Have option to show query as well as results. 
  30. # - Have option to not perform query (i.e., use above option to preview first) 
  31. # - Have option to enter own query in a TEXTAREA (preferably combined with 
  32. #   previous option: display query in a TEXTAREA for editing). 
  33. # - Ability to click on a record and have the original form displayed with 
  34. #   this data filled in (for updates and future inserts). 
  35. # - Add UPDATE.  Hmmm... tricky, tricky, tricky. 
  36. # - Add a create table interface (probably in a second script). 
  37. # - Add a place to type in special expressions to select (e.g., 
  38. #    ROOM.LENGTH*ROOM.WIDTH AS AREA) 
  39.  
  40. function bad_auth() 
  41.  { 
  42.   global $database; 
  43.   Header( "WWW-authenticate: basic realm=\"Database ".$database. "\""); 
  44.   Header( "HTTP/1.0 401 Unauthorized"); 
  45.   $title =  "Invalid login"; 
  46.   echo  "<HTML>\n"; 
  47.   echo  " <HEAD>\n"; 
  48.   echo  " <TITLE>Authorization Required</TITLE>\n"; 
  49.   echo  " </HEAD>\n"; 
  50.   echo  " <BODY BGCOLOR=#FFFFFF TEXT=#000000>\n"; 
  51.   echo  "  I need a username and password with which to access the database.<P>\n"; 
  52.   echo  " </BODY>\n"; 
  53.   echo  "</HTML>\n"; 
  54.   exit; 
  55.  } 
  56.  
  57. $database=$HTTP_POST_VARS[ "DATABASE"]; 
  58. $hostname=$HTTP_POST_VARS[ "HOSTNAME"]; 
  59. if(!$database) 
  60.  { 
  61. ?> 
  62. <HTML> 
  63.  <HEAD> 
  64.   <TITLE>MySQL/PHP Interface</TITLE> 
  65.  </HEAD> 
  66.  <BODY BGCOLOR=#FFFFFF TEXT=#000000> 
  67.   <CENTER> 
  68.    <FORM ACTION= <? echo $SCRIPT_NAME ?> METHOD=POST> 
  69.     <TABLE> 
  70.      <TR> 
  71.       <TD>Hostname:</TD> 
  72.       <TD><INPUT TYPE=TEXT NAME=HOSTNAME VALUE="localhost" SIZE=40> 
  73.      </TR> 
  74.      <TR> 
  75.       <TD>Database:</TD> 
  76.       <TD><INPUT TYPE=TEXT NAME=DATABASE SIZE=40> 
  77.      </TR> 
  78.      <TR> 
  79.       <TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT NAME=SHOW VALUE=SHOW></TD> 
  80.      </TR> 
  81.     </TABLE> 
  82.    </FORM> 
  83.  </BODY> 
  84. </HTML> 
  85. <? 
  86.   exit; 
  87.  } 
  88. if(!isset($PHP_AUTH_USER)) bad_auth(); 
  89. $username = $PHP_AUTH_USER; 
  90. $password = $PHP_AUTH_PW; 
  91. $dblink = @mysql_pconnect($hostname,$username,$password); 
  92. if(!$dblink) bad_auth(); 
  93. ?> 
  94. <HTML> 
  95.  <HEAD> 
  96.   <TITLE> <?echo  "$database@$hostname"?></TITLE> 
  97.  </HEAD> 
  98.  <BODY BGCOLOR=#FFFFFF TEXT=#000000> 
  99.   <CENTER> 
  100.    <H1> <? echo  "$database@$hostname" ?></H1> 
  101. <? 
  102. $tableh = mysql_list_tables($database); 
  103. if(!$tableh) 
  104.  { 
  105.  
  106. ?>   
  107.     Could not read list of tables 
  108.   </CENTER> 
  109.  </BODY> 
  110. </HTML> 
  111. <? 
  112.   exit; 
  113.  } 
  114. $tableno = mysql_num_rows($tableh); 
  115. if(!$tableno) 
  116.  { 
  117. ?>   
  118.     MySQL claims this database is empty! 
  119.   </CENTER> 
  120.  </BODY> 
  121. </HTML> 
  122. <? 
  123.   exit; 
  124.  } 
  125. for($i=0;$i<$tableno;$i++) 
  126.  { 
  127.   $table = mysql_tablename($tableh,$i); 
  128.   $fieldh = mysql_list_fields($database,$table); 
  129.   $fieldno = mysql_num_fields($fieldh); 
  130.   for($j=0;$j<$fieldno;$j++) 
  131.    { 
  132.     $name = mysql_field_name($fieldh,$j); 
  133.     $tables[$table][$name][ "type"] = mysql_field_type($fieldh,$j); 
  134.     $tables[$table][$name][ "len"]  = mysql_field_len($fieldh,$j); 
  135.    } 
  136.   mysql_free_result($fieldh); 
  137.  } 
  138. mysql_free_result($tableh); 
  139. if($HTTP_POST_VARS[ "SELECT"]) $command =  "SELECT"; 
  140. if($HTTP_POST_VARS[ "INSERT"]) $command =  "INSERT"; 
  141. if($HTTP_POST_VARS[ "DELETE"]) $command =  "DELETE"; 
  142. if($command) 
  143.  { 
  144.   if(!mysql_select_db($database,$dblink)) 
  145.    { 
  146.     $error = mysql_error($dblink); 
  147. ?> 
  148.    <H1><FONT COLOR=#0000AA>MySQL at  <? echo $hostname ?> returned an error:</FONT></H1> 
  149.   </CENTER> 
  150.   <FONT COLOR=#DD0000> 
  151.   <PRE> 
  152.    <? echo $error ?> 
  153.   </PRE> 
  154.  </BODY> 
  155. </HTML> 
  156. <?   
  157.     exit; 
  158.    } 
  159.   $parts = $HTTP_POST_VARS[ "PARTS"]; 
  160.   for($part=1;$part <= $parts;$part++) 
  161.    { 
  162.     $ftable  = $HTTP_POST_VARS[ "TABLE".$part]; 
  163.     $ffield  = $HTTP_POST_VARS[ "FIELD".$part]; 
  164.     $fdatum  = $HTTP_POST_VARS[ "DATUM".$part]; 
  165.     $faction = $HTTP_POST_VARS[ "ACTION".$part]; 
  166.     if(strlen($fdatum)) 
  167.      { 
  168.       $qdata[$ftable][$ffield] = $fdatum; 
  169.       $kludge[$ftable] = $ftable; 
  170.       if(ereg( "^[$]([^$][^.]*).",$fdatum,$re) || ereg( "^[<>=~] *[$]([^.]+).",$fdatum,$re)) 
  171.         $kludge[$re[1]] = $re[1]; 
  172.      } 
  173.     $qaction[$ftable][$ffield] = $faction; 
  174.    } 
  175.  
  176.   if($qdata) 
  177.    { 
  178.     $tablecount = count($kludge); 
  179.     if($command ==  "SELECT") 
  180.      { 
  181.       for(reset($kludge);$stable = key($kludge);next($kludge)) 
  182.        { 
  183.         $sfields = $qaction[$stable]; 
  184.         for(reset($sfields);$sfield = key($sfields);next($sfields)) 
  185.          { 
  186.           $action = $sfields[$sfield]; 
  187.           if($tablecount > 1) $sfield =  "$stable.$sfield"; 
  188.           if($action !=  "IGNORE" && $select) $select .=  ","; 
  189.           if($action ==  "SELECT") $select .= $sfield; 
  190.           if($action ==  "DISTINCT") $select .=  "DISTINCT $sfield"; 
  191.           if($action ==  "ORDERBY") 
  192.            { 
  193.             $select .= $sfield; 
  194.             if($orderby) $orderby .=  ","; 
  195.             $orderby .= $sfield; 
  196.            } 
  197.           if($action ==  "SUM") $select .=  "sum($sfield)"; 
  198.           if($action ==  "COUNT") $select .=  "count($sfield)"; 
  199.           if($action ==  "AVG") $select .=  "avg($sfield)"; 
  200.           if($action ==  "MIN") $select .=  "min($sfield)"; 
  201.           if($action ==  "MAX") $select .=  "max($sfield)"; 
  202.          } 
  203.        } 
  204.      } 
  205.     if($command ==  "SELECT" || $command ==  "DELETE") 
  206.      { 
  207.       for(reset($qdata);$qtable = key($qdata);next($qdata)) 
  208.        { 
  209.         if($command ==  "DELETE") 
  210.          { 
  211.           $from = $qtable; 
  212.           $where =  ""; 
  213.          } 
  214.         $qfields = $qdata[$qtable]; 
  215.         for(reset($qfields);$qfield = key($qfields);next($qfields)) 
  216.          { 
  217.           $cmp =  "="; 
  218.           $qdatum = $qfields[$qfield]; 
  219. #         ereg_replace("''","''''",$qdatum); 
  220.           if(ereg( "^([<>=~]) +(.*)",$qdatum,$re)) 
  221.            { 
  222.             $cmp = $re[1]; 
  223.             if($cmp ==  "~") $cmp =  "LIKE"; 
  224.             $qdatum = $re[2]; 
  225.            } 
  226.           if($command ==  "SELECT" && ereg( "^[$]([^$].*)",$qdatum,$re)) 
  227.            { 
  228.             $qdatum = $re[1]; 
  229.             if($tablecount > 1 && !ereg( "\.",$qdatum)) 
  230.               $qdatum =  "$qtable.$qdatum"; 
  231.            } 
  232.           else 
  233.             if($tables[$qtable][$qfield][ "type"] !=  "int") 
  234.              { 
  235.               $qdatum =  "'$qdatum'"; 
  236.              } 
  237.           if($tablecount > 1) $qfield =  "$qtable.$qfield"; 
  238.           if($where) $where .=  "\n  AND "; 
  239.           $where .=  "$qfield $cmp $qdatum"; 
  240.          } 
  241.         if($command ==  "DELETE") 
  242.           $query .=  "DELETE FROM $qtable WHERE $where\n\n"; 
  243.        } 
  244.       if($command ==  "SELECT") 
  245.        { 
  246.         $from = join($kludge, ","); 
  247.         $query =  "SELECT $select\nFROM $from\nWHERE $where\n"; 
  248.         if($orderby) $query .=  "ORDER BY $orderby\n"; 
  249.        } 
  250.      } 
  251.     else if($command ==  "INSERT") 
  252.      { 
  253.       for(reset($qdata);$qtable = key($qdata);next($qdata)) 
  254.        { 
  255.         $qfields = $qdata[$qtable]; 
  256.         for(reset($qfields);$qfield = key($qfields);next($qfields)) 
  257.          { 
  258.           $qdatum = $qfields[$qfield]; 
  259.           if($tables[$qtable][$qfield][ "type"] !=  "int") 
  260.               $qdatum =  "'$qdatum'"; 
  261.           if($columns) $columns .=  ","; 
  262.           $columns .= $qfield; 
  263.           if($values) $values .=  ","; 
  264.           $values .= $qdatum; 
  265.          } 
  266.         $query .=  "INSERT INTO $qtable ($columns)\nVALUES      ($values)\n\n"; 
  267.        } 
  268.      } 
  269.     echo  "<TABLE><TR><TD><PRE>$query</PRE></TD></TR></TABLE>\n"; 
  270.     $start = microtime(); 
  271.     $result = mysql_query($query,$dblink); 
  272.     $end = microtime(); 
  273.     $start = explode( " ",$start); 
  274.     $end = explode( " ",$end); 
  275.     $interval = round(0.5 + 1000*($end[1]-$start[1] + $end[0]-$start[0])); 
  276.     if(!$result) 
  277.      { 
  278.       $error = mysql_error($dblink); 
  279. ?>  
  280.    <H1><FONT COLOR=#0000AA>MySQL at  <? echo $hostname ?> returned an error:</FONT></H1> 
  281.   </CENTER> 
  282.   <FONT COLOR=#DD0000> 
  283.   <PRE> 
  284.    <? echo $error ?> 
  285.   </PRE> 
  286.  </BODY> 
  287. </HTML> 
  288. <? 
  289.       exit; 
  290.      } 
  291.     if($command ==  "SELECT") 
  292.      { 
  293.       $colno = mysql_num_fields($result); 
  294.       $rowno = mysql_num_rows($result); 
  295.       if($rowno != 1) $s =  "s"; 
  296.       echo  "<TABLE BORDER>\n <TR>\n"; 
  297.       echo  " <TR><TD COLSPAN=$colno ALIGN=CENTER>$rowno result$s, $interval msec</TD></TR>\n"; 
  298.       for($i=0;$i<$colno;$i++) 
  299.        { 
  300.         $name = mysql_field_name($result,$i); 
  301.         echo  "  <TD><B>$name</B></TD>\n"; 
  302.        } 
  303.       echo  " </TR>\n"; 
  304.       while($rowno--) 
  305.        { 
  306.         echo  " <TR>\n"; 
  307.         $row = mysql_fetch_row($result); 
  308.         for($i=0;$i<$colno;$i++) 
  309.          { 
  310.           $value = $row[$i]; 
  311.           if(!$value) $value =  " "; 
  312.           echo  "  <TD>$value</TD>\n"; 
  313.          } 
  314.         echo  " </TR>\n"; 
  315.        } 
  316.       echo  "</TABLE>\n"; 
  317.      } 
  318.     else 
  319.      { 
  320.       if($command ==  "INSERT") $action =  "added"; 
  321.       if($command ==  "DELETE") $action =  "deleted"; 
  322.       $rows = mysql_affected_rows($dblink); 
  323.       $s =  "s"; 
  324.       if($rows == 1) $s =  ""; 
  325.       echo  "$rows row$s $action, $interval msec"; 
  326.      } 
  327.    } 
  328. ?> 
  329.   </CENTER> 
  330.  </BODY> 
  331. </HTML> 
  332. <? 
  333.   exit; 
  334.  } 
  335. ?>  
  336.    <FORM ACTION= <? echo $SCRIPT_NAME ?> METHOD=POST> 
  337.     <INPUT TYPE=HIDDEN NAME=DATABASE VALUE=" <? echo $database ?>"> 
  338.     <INPUT TYPE=HIDDEN NAME=HOSTNAME VALUE=" <? echo $hostname ?>"> 
  339. <? 
  340. $parts = 0; 
  341. for(reset($tables);$table = key($tables);next($tables)) 
  342.  { 
  343.   echo  "<HR>\n"; 
  344.   echo  "<TABLE>\n"; 
  345.   echo  " <TR>\n"; 
  346.   echo  "  <TD COLSPAN=3 ALIGN=CENTER><B>$table</TD>\n"; 
  347.   echo  " </TR>\n"; 
  348.   $fields = $tables[$table]; 
  349.   for(reset($fields); $field = key($fields); next($fields)) 
  350.    { 
  351.     $type = $fields[$field][ "type"]; 
  352.     $len = $fields[$field][ "len"]; 
  353.     $parts++; 
  354.     echo  " <TR>\n"; 
  355.     echo  "  <TD>$field</TD>\n"; 
  356. ?> 
  357.       <TD> 
  358.        <SELECT NAME=ACTION <? echo $parts ?>> 
  359.         <OPTION VALUE=SELECT SELECTED>Select 
  360.         <OPTION VALUE=DISTINCT>Select Distinct 
  361.         <OPTION VALUE=ORDERBY>Order By 
  362.         <OPTION VALUE=SUM>sum() 
  363.         <OPTION VALUE=COUNT>count() 
  364.         <OPTION VALUE=AVG>avg() 
  365.         <OPTION VALUE=MIN>min() 
  366.         <OPTION VALUE=MAX>max() 
  367.         <OPTION VALUE=IGNORE>Don't Select 
  368.        </SELECT> 
  369.       </TD> 
  370. <?   
  371.     if($type ==  "int" || $type ==  "real") 
  372.      { 
  373.       $size=10; 
  374.       $maxlength=40; 
  375.      } 
  376.     else if($type ==  "string") 
  377.      { 
  378.       $size = $len; 
  379.       if($size > 40) $size = 40; 
  380.       $maxlength = $len; 
  381.       $type .=  "[".$len. "]"; 
  382.      } 
  383.     echo  "  <TD>\n"; 
  384.     echo  "   <INPUT TYPE=HIDDEN NAME=FIELD$parts VALUE='$field'>\n"; 
  385.     echo  "   <INPUT TYPE=HIDDEN NAME=TABLE$parts VALUE='$table'>\n"; 
  386.     echo  "   <INPUT TYPE=TEXT NAME=DATUM$parts SIZE=$size MAXLENGTH=$maxlength>\n"; 
  387.     echo  "  </TD>\n"; 
  388.     echo  "  <TD><I>(".$type. ")</I></TD>\n"; 
  389.     echo  " </TR>\n"; 
  390.    } 
  391.   echo  " </TABLE>\n"; 
  392.  } 
  393. ?>   
  394.     <HR> 
  395.     <TABLE> 
  396.      <TR> 
  397.       <TD><INPUT TYPE=SUBMIT NAME=SELECT VALUE="Select"></TD> 
  398.       <TD><INPUT TYPE=SUBMIT NAME=INSERT VALUE="Insert"></TD> 
  399.       <TD><INPUT TYPE=SUBMIT NAME=DELETE VALUE="Delete"></TD> 
  400.      </TR> 
  401.     </TABLE> 
  402.    </CENTER> 
  403.    <INPUT TYPE=HIDDEN NAME=PARTS VALUE= <? echo $parts ?>> 
  404.   </FORM> 
  405.  </BODY> 
  406. </HTML>
  407.