2007-07-02 05:51:26 +00:00
< ? php
2011-02-15 16:22:50 +00:00
if ( ! $error && $_POST [ " export " ]) {
2011-02-17 10:43:21 +00:00
dump_headers ( " sql " );
2011-02-15 16:22:50 +00:00
$adminer -> dumpTable ( " " , " " );
$adminer -> dumpData ( " " , " table " , $_POST [ " query " ]);
exit ;
}
2009-11-03 10:55:57 +00:00
restart_session ();
2010-10-15 08:58:08 +00:00
$history_all = & get_session ( " queries " );
2010-04-21 12:01:32 +00:00
$history = & $history_all [ DB ];
2009-07-17 13:53:10 +00:00
if ( ! $error && $_POST [ " clear " ]) {
$history = array ();
redirect ( remove_from_uri ( " history " ));
}
page_header ( lang ( 'SQL command' ), $error );
2007-07-02 05:51:26 +00:00
2008-09-30 12:22:24 +00:00
if ( ! $error && $_POST ) {
2009-09-01 13:09:00 +00:00
$fp = false ;
2009-08-26 11:55:45 +00:00
$query = $_POST [ " query " ];
if ( $_POST [ " webfile " ]) {
2009-09-01 13:09:00 +00:00
$fp = @ fopen (( file_exists ( " adminer.sql " ) ? " adminer.sql "
2009-08-29 13:50:28 +00:00
: ( file_exists ( " adminer.sql.gz " ) ? " compress.zlib://adminer.sql.gz "
: " compress.bzip2://adminer.sql.bz2 "
2009-09-01 13:09:00 +00:00
)), " rb " );
$query = ( $fp ? fread ( $fp , 1e6 ) : false );
2010-10-18 22:22:09 +00:00
} elseif ( $_FILES && $_FILES [ " sql_file " ][ " error " ] != 4 ) { // 4 - UPLOAD_ERR_NO_FILE
2009-08-28 11:49:57 +00:00
$query = get_file ( " sql_file " , true );
2009-08-26 11:55:45 +00:00
}
2009-09-01 13:09:00 +00:00
if ( is_string ( $query )) { // get_file() returns error as number, fread() as false
2010-02-24 21:00:36 +00:00
if ( function_exists ( 'memory_get_usage' )) {
2011-04-09 13:49:36 +00:00
@ ini_set ( " memory_limit " , max ( ini_get ( " memory_limit " ), 2 * strlen ( $query ) + memory_get_usage () + 8e6 )); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
2010-02-24 21:00:36 +00:00
}
2011-03-22 14:34:34 +00:00
if ( $query != " " && strlen ( $query ) < 1e6 ) { // don't add big queries
$q = $query . ( ereg ( ';$' , $query ) ? " " : " ; " ); //! doesn't work with DELIMITER |
if ( ! $history || end ( $history ) != $q ) { // no repeated queries
$history [] = $q ;
}
2009-09-09 15:51:26 +00:00
}
2011-03-25 11:50:21 +00:00
$space = " (?: \\ s|/ \\ *.* \\ */|(?:#|-- )[^ \n ]* \n |-- \n ) " ;
2010-04-21 12:01:32 +00:00
if ( ! ini_bool ( " session.use_cookies " )) {
2009-08-26 14:27:12 +00:00
session_write_close ();
}
2008-09-30 12:22:24 +00:00
$delimiter = " ; " ;
$offset = 0 ;
$empty = true ;
2010-04-21 12:01:32 +00:00
$connection2 = connect (); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error
if ( is_object ( $connection2 ) && DB != " " ) {
2009-09-22 10:51:40 +00:00
$connection2 -> select_db ( DB );
2009-06-03 18:34:57 +00:00
}
2010-10-15 08:58:08 +00:00
$commands = 0 ;
2010-10-22 12:31:46 +00:00
$errors = array ();
2010-10-24 06:25:40 +00:00
$parse = '[\'`"]' . ( $jush == " pgsql " ? '|\\$[^$]*\\$' : ( $jush == " mssql " || $jush == " sqlite " ? '|\\[' : '' )) . '|/\\*|-- |#' ; //! ` and # not everywhere
2011-06-22 14:50:38 +00:00
$total_start = microtime ();
2011-02-15 16:22:50 +00:00
parse_str ( $_COOKIE [ " adminer_export " ], $adminer_export );
$dump_format = $adminer -> dumpFormat ();
unset ( $dump_format [ " sql " ]);
2010-01-09 23:33:41 +00:00
while ( $query != " " ) {
2011-03-25 11:50:21 +00:00
if ( ! $offset && $jush == " sql " && preg_match ( " ~^ $space *DELIMITER \\ s+(.+)~i " , $query , $match )) {
2008-10-02 15:23:30 +00:00
$delimiter = $match [ 1 ];
2008-09-30 12:22:24 +00:00
$query = substr ( $query , strlen ( $match [ 0 ]));
2009-08-21 12:43:46 +00:00
} else {
2010-10-23 22:35:27 +00:00
preg_match ( '(' . preg_quote ( $delimiter ) . " | $parse | \$ ) " , $query , $match , PREG_OFFSET_CAPTURE , $offset ); // should always match
2009-08-21 12:43:46 +00:00
$found = $match [ 0 ][ 0 ];
$offset = $match [ 0 ][ 1 ] + strlen ( $found );
2009-09-01 13:09:00 +00:00
if ( ! $found && $fp && ! feof ( $fp )) {
2009-10-02 12:21:55 +00:00
$query .= fread ( $fp , 1e5 );
2009-09-01 13:09:00 +00:00
} else {
2010-01-09 23:33:41 +00:00
if ( ! $found && rtrim ( $query ) == " " ) {
2009-09-01 13:09:00 +00:00
break ;
}
2010-10-22 12:31:46 +00:00
if ( $found && $found != $delimiter ) { // find matching quote or comment end
2010-10-23 22:35:27 +00:00
while ( preg_match ( '(' . ( $found == '/*' ? '\\*/' : ( $found == '[' ? ']' : ( ereg ( '^-- |^#' , $found ) ? " \n " : preg_quote ( $found ) . " | \\ \\ . " ))) . '|$)s' , $query , $match , PREG_OFFSET_CAPTURE , $offset )) { //! respect sql_mode NO_BACKSLASH_ESCAPES
2010-10-22 12:31:46 +00:00
$s = $match [ 0 ][ 0 ];
$offset = $match [ 0 ][ 1 ] + strlen ( $s );
if ( ! $s && $fp && ! feof ( $fp )) {
$query .= fread ( $fp , 1e6 );
} elseif ( $s [ 0 ] != " \\ " ) {
break ;
}
}
} else { // end of a query
2009-09-01 13:09:00 +00:00
$empty = false ;
2009-09-12 04:44:18 +00:00
$q = substr ( $query , 0 , $match [ 0 ][ 1 ]);
2010-10-15 08:58:08 +00:00
$commands ++ ;
2010-11-12 16:31:18 +00:00
$print = " <pre id='sql- $commands '><code class='jush- $jush '> " . shorten_utf8 ( trim ( $q ), 1000 ) . " </code></pre> \n " ;
2010-10-22 12:31:46 +00:00
if ( ! $_POST [ " only_errors " ]) {
echo $print ;
ob_flush ();
flush (); // can take a long time - show the running query
}
2011-06-22 14:50:38 +00:00
$start = microtime (); // microtime(true) is available since PHP 5
2009-09-01 13:09:00 +00:00
//! don't allow changing of character_set_results, convert encoding of displayed query
2011-06-14 08:46:06 +00:00
if ( $connection -> multi_query ( $q ) && is_object ( $connection2 ) && preg_match ( " ~^ $space *USE \\ b~isU " , $q )) {
$connection2 -> query ( $q );
}
do {
$result = $connection -> store_result ();
2011-06-22 14:50:38 +00:00
$end = microtime ();
2011-06-14 08:46:06 +00:00
$time = format_time ( $start , $end ) . ( strlen ( $q ) < 1000 ? " <a href=' " . h ( ME ) . " sql= " . urlencode ( trim ( $q )) . " '> " . lang ( 'Edit' ) . " </a> " : " " ); // 1000 - maximum length of encoded URL in IE is 2083 characters
if ( $connection -> error ) {
echo ( $_POST [ " only_errors " ] ? $print : " " );
echo " <p class='error'> " . lang ( 'Error in query' ) . " : " . error () . " \n " ;
$errors [] = " <a href='#sql- $commands '> $commands </a> " ;
if ( $_POST [ " error_stops " ]) {
break ;
}
} elseif ( is_object ( $result )) {
select ( $result , $connection2 );
if ( ! $_POST [ " only_errors " ]) {
echo " <form action='' method='post'> \n " ;
echo " <p> " . ( $result -> num_rows ? lang ( '%d row(s)' , $result -> num_rows ) : " " ) . $time ;
$id = " export- $commands " ;
$export = " , <a href='# $id ' onclick= \" return !toggle(' $id '); \" > " . lang ( 'Export' ) . " </a><span id=' $id ' class='hidden'>: "
. html_select ( " output " , $adminer -> dumpOutput (), $adminer_export [ " output " ]) . " "
. html_select ( " format " , $dump_format , $adminer_export [ " format " ])
. " <input type='hidden' name='query' value=' " . h ( $q ) . " '> "
. " <input type='submit' name='export' value=' " . lang ( 'Export' ) . " ' onclick='eventStop(event);'><input type='hidden' name='token' value=' $token '></span> "
;
if ( $connection2 && preg_match ( " ~^( $space | \\ ()*SELECT \\ b~isU " , $q ) && ( $explain = explain ( $connection2 , $q ))) {
$id = " explain- $commands " ;
echo " , <a href='# $id ' onclick= \" return !toggle(' $id '); \" >EXPLAIN</a> $export\n " ;
echo " <div id=' $id ' class='hidden'> \n " ;
select ( $explain , $connection2 , ( $jush == " sql " ? " http://dev.mysql.com/doc/refman/ " . substr ( $connection -> server_info , 0 , 3 ) . " /en/explain-output.html# " : " " ));
echo " </div> \n " ;
} else {
echo " $export\n " ;
2009-09-12 04:44:18 +00:00
}
2011-06-14 08:46:06 +00:00
echo " </form> \n " ;
}
} else {
if ( preg_match ( " ~^ $space *(CREATE|DROP|ALTER) $space +(DATABASE|SCHEMA) \\ b~isU " , $q )) {
restart_session ();
set_session ( " dbs " , null ); // clear cache
session_write_close ();
}
if ( ! $_POST [ " only_errors " ]) {
echo " <p class='message' title=' " . h ( $connection -> info ) . " '> " . lang ( 'Query executed OK, %d row(s) affected.' , $connection -> affected_rows ) . " $time\n " ;
2008-09-30 12:22:24 +00:00
}
2010-11-26 13:13:38 +00:00
}
2011-06-14 08:46:06 +00:00
$start = $end ;
} while ( $connection -> next_result ());
2009-09-01 13:09:00 +00:00
$query = substr ( $query , $offset );
$offset = 0 ;
2009-08-26 11:55:45 +00:00
}
2007-07-10 13:30:42 +00:00
}
2007-07-02 05:51:26 +00:00
}
}
2008-09-30 12:22:24 +00:00
if ( $empty ) {
2009-07-11 20:30:40 +00:00
echo " <p class='message'> " . lang ( 'No commands to execute.' ) . " \n " ;
2010-10-22 12:31:46 +00:00
} elseif ( $_POST [ " only_errors " ]) {
2011-06-22 14:50:38 +00:00
echo " <p class='message'> " . lang ( '%d query(s) executed OK.' , $commands - count ( $errors )) . format_time ( $total_start , microtime ()) . " \n " ;
2010-10-22 12:31:46 +00:00
} elseif ( $errors && $commands > 1 ) {
echo " <p class='error'> " . lang ( 'Error in query' ) . " : " . implode ( " " , $errors ) . " \n " ;
2008-09-30 12:22:24 +00:00
}
2010-04-21 12:01:32 +00:00
//! MS SQL - SET SHOWPLAN_ALL OFF
2008-09-30 12:22:24 +00:00
} else {
2009-07-16 13:46:49 +00:00
echo " <p class='error'> " . upload_error ( $query ) . " \n " ;
2007-07-02 05:51:26 +00:00
}
}
?>
2007-07-09 14:45:11 +00:00
2011-06-14 09:37:02 +00:00
< form action = " " method = " post " enctype = " multipart/form-data " id = " form " >
2010-04-26 16:22:24 +00:00
< p >< ? php
2009-09-30 15:05:46 +00:00
$q = $_GET [ " sql " ]; // overwrite $q from if ($_POST) to save memory
2009-09-24 14:17:26 +00:00
if ( $_POST ) {
$q = $_POST [ " query " ];
2010-12-01 08:40:39 +00:00
} elseif ( $_GET [ " history " ] == " all " ) {
2011-01-20 22:12:34 +00:00
$q = $history ;
2010-01-09 23:33:41 +00:00
} elseif ( $_GET [ " history " ] != " " ) {
2009-09-24 14:17:26 +00:00
$q = $history [ $_GET [ " history " ]];
}
2010-04-26 16:22:24 +00:00
textarea ( " query " , $q , 20 );
2010-05-20 20:50:35 +00:00
echo ( $_POST ? " " : " <script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script> \n " );
2011-03-27 22:56:48 +00:00
echo " <p> " . ( ini_bool ( " file_uploads " )
? lang ( 'File upload' ) . ': <input type="file" name="sql_file"' . ( $_FILES && $_FILES [ " sql_file " ][ " error " ] != 4 ? '' : ' onchange="this.form[\'only_errors\'].checked = true;"' ) . '> (< ' . ini_get ( " upload_max_filesize " ) . 'B)' // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
: lang ( 'File uploads are disabled.' )
);
2010-07-13 16:18:47 +00:00
2010-04-26 16:22:24 +00:00
?>
2007-07-11 11:19:16 +00:00
< p >
2010-08-04 08:46:02 +00:00
< input type = " submit " value = " <?php echo lang('Execute'); ?> " title = " Ctrl+Enter " >
2011-03-08 12:43:05 +00:00
< input type = " hidden " name = " token " value = " <?php echo $token ; ?> " >
2007-07-09 06:12:22 +00:00
< ? php
2010-10-22 19:27:38 +00:00
echo checkbox ( " error_stops " , 1 , $_POST [ " error_stops " ], lang ( 'Stop on error' )) . " \n " ;
echo checkbox ( " only_errors " , 1 , $_POST [ " only_errors " ], lang ( 'Show only errors' )) . " \n " ;
2009-06-15 09:07:05 +00:00
2011-06-14 09:37:02 +00:00
print_fieldset ( " webfile " , lang ( 'From server' ), $_POST [ " webfile " ], " document.getElementById('form')['only_errors'].checked = true; " );
2009-09-27 07:27:16 +00:00
$compress = array ();
2010-02-09 09:16:15 +00:00
foreach ( array ( " gz " => " zlib " , " bz2 " => " bz2 " ) as $key => $val ) {
if ( extension_loaded ( $val )) {
2009-09-27 07:27:16 +00:00
$compress [] = " . $key " ;
}
}
echo lang ( 'Webserver file %s' , " <code>adminer.sql " . ( $compress ? " [ " . implode ( " | " , $compress ) . " ] " : " " ) . " </code> " );
2010-10-18 22:22:09 +00:00
echo ' <input type="submit" name="webfile" value="' . lang ( 'Run file' ) . '">' ;
2010-05-20 20:46:46 +00:00
echo " </div></fieldset> \n " ;
2009-08-25 15:58:04 +00:00
2009-06-15 09:07:05 +00:00
if ( $history ) {
2010-02-15 13:42:12 +00:00
print_fieldset ( " history " , lang ( 'History' ), $_GET [ " history " ] != " " );
2009-06-15 09:07:05 +00:00
foreach ( $history as $key => $val ) {
2009-06-21 23:20:32 +00:00
//! save and display timestamp
2010-05-07 13:44:22 +00:00
echo '<a href="' . h ( ME . " sql=&history= $key " ) . '">' . lang ( 'Edit' ) . " </a> <code class='jush- $jush '> " . shorten_utf8 ( ltrim ( str_replace ( " \n " , " " , str_replace ( " \r " , " " , preg_replace ( '~^(#|-- ).*~m' , '' , $val )))), 80 , " </code> " ) . " <br> \n " ;
2009-06-15 09:07:05 +00:00
}
2009-07-17 13:53:10 +00:00
echo " <input type='submit' name='clear' value=' " . lang ( 'Clear' ) . " '> \n " ;
2011-03-22 13:10:25 +00:00
echo " <a href=' " . h ( ME . " sql=&history=all " ) . " '> " . lang ( 'Edit all' ) . " </a> \n " ;
2010-02-15 13:42:12 +00:00
echo " </div></fieldset> \n " ;
2009-06-15 09:07:05 +00:00
}
?>
2007-07-02 05:51:26 +00:00
</ form >