2009-07-03 06:26:01 +00:00
< ? php
2009-07-27 11:25:37 +00:00
class Adminer {
2009-09-25 13:48:00 +00:00
var $operators = array ( " <= " , " >= " );
2010-04-21 12:01:32 +00:00
var $_values = array ();
2009-07-27 11:25:37 +00:00
function name () {
return lang ( 'Editor' );
}
2010-05-06 13:45:34 +00:00
//! driver, ns
2010-04-21 12:01:32 +00:00
2009-07-27 11:25:37 +00:00
function credentials () {
2010-10-15 08:58:08 +00:00
return array ( SERVER , $_GET [ " username " ], get_session ( " pwds " ));
2009-07-27 11:25:37 +00:00
}
2009-12-18 17:39:48 +00:00
function permanentLogin () {
2010-05-06 13:45:34 +00:00
return password_file ();
2009-12-18 17:39:48 +00:00
}
2009-07-27 11:25:37 +00:00
function database () {
2009-09-22 10:51:40 +00:00
global $connection ;
2010-10-15 08:58:08 +00:00
$databases = get_databases ( false );
return ( ! $databases
2010-04-21 12:01:32 +00:00
? $connection -> result ( " SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) " ) // username without the database list
2010-10-15 08:58:08 +00:00
: $databases [( information_schema ( $databases [ 0 ]) ? 1 : 0 )] // first available database
2009-07-30 14:12:18 +00:00
);
2009-07-27 11:25:37 +00:00
}
2010-10-17 20:13:32 +00:00
function headers () {
header ( " X-Frame-Options: deny " );
2010-10-20 20:27:51 +00:00
header ( " X-XSS-Protection: 0 " );
2010-10-17 20:13:32 +00:00
}
2010-04-21 12:01:32 +00:00
function loginForm () {
2009-07-21 12:19:25 +00:00
?>
2009-07-21 15:25:05 +00:00
< table cellspacing = " 0 " >
2010-04-26 16:21:28 +00:00
< tr >< th >< ? php echo lang ( 'Username' ); ?> <td><input type="hidden" name="driver" value="server"><input type="hidden" name="server" value=""><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>">
2009-07-21 15:25:05 +00:00
< tr >< th >< ? php echo lang ( 'Password' ); ?> <td><input type="password" name="password">
</ table >
2010-04-26 16:21:28 +00:00
< script type = " text/javascript " >
document . getElementById ( 'username' ) . focus ();
</ script >
2009-07-21 12:19:25 +00:00
< ? php
2009-12-18 17:49:21 +00:00
echo " <p><input type='submit' value=' " . lang ( 'Login' ) . " '> \n " ;
2010-05-06 13:45:34 +00:00
echo checkbox ( " permanent " , 1 , $_COOKIE [ " adminer_permanent " ], lang ( 'Permanent login' )) . " \n " ;
2009-07-21 12:19:25 +00:00
}
2009-07-27 11:25:37 +00:00
function login ( $login , $password ) {
return true ;
}
function tableName ( $tableStatus ) {
2010-01-09 23:33:41 +00:00
return h ( $tableStatus [ " Comment " ] != " " ? $tableStatus [ " Comment " ] : $tableStatus [ " Name " ]);
2009-07-27 11:25:37 +00:00
}
2009-07-27 16:51:40 +00:00
function fieldName ( $field , $order = 0 ) {
2010-01-09 23:33:41 +00:00
return h ( $field [ " comment " ] != " " ? $field [ " comment " ] : $field [ " field " ]);
2009-07-27 11:25:37 +00:00
}
2009-09-20 07:31:46 +00:00
function selectLinks ( $tableStatus , $set = " " ) {
$TABLE = $tableStatus [ " Name " ];
if ( isset ( $set )) {
2009-10-28 12:21:21 +00:00
echo '<p class="tabs"><a href="' . h ( ME . 'edit=' . urlencode ( $TABLE ) . $set ) . '">' . lang ( 'New item' ) . " </a> \n " ;
2009-09-20 07:31:46 +00:00
}
2010-11-12 16:31:18 +00:00
echo " <a href=' " . h ( remove_from_uri ( " page " )) . " &page=last' title=' " . lang ( 'Last page' ) . " ' onclick='return !ajaxMain(this.href, undefined, event);'>>></a> \n " ;
2009-07-27 11:25:37 +00:00
}
2010-10-29 11:58:08 +00:00
function foreignKeys ( $table ) {
return foreign_keys ( $table );
2009-07-27 11:25:37 +00:00
}
2009-09-23 14:28:06 +00:00
function backwardKeys ( $table , $tableName ) {
2009-07-27 11:25:37 +00:00
$return = array ();
2010-10-13 15:53:59 +00:00
foreach ( get_rows ( " SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME
2009-07-22 11:36:27 +00:00
FROM information_schema . KEY_COLUMN_USAGE
2010-10-13 16:04:40 +00:00
WHERE TABLE_SCHEMA = " . q( $this->database ()) . "
AND REFERENCED_TABLE_SCHEMA = " . q( $this->database ()) . "
AND REFERENCED_TABLE_NAME = " . q( $table ) . "
2010-10-13 16:59:15 +00:00
ORDER BY ORDINAL_POSITION " , null, " " ) as $row ) { //! requires MySQL 5
2010-10-13 15:53:59 +00:00
$return [ $row [ " TABLE_NAME " ]][ " keys " ][ $row [ " CONSTRAINT_NAME " ]][ $row [ " COLUMN_NAME " ]] = $row [ " REFERENCED_COLUMN_NAME " ];
}
foreach ( $return as $key => $val ) {
$name = $this -> tableName ( table_status ( $key ));
if ( $name != " " ) {
$search = preg_quote ( $tableName );
$separator = " (:| \\ s*-)? \\ s+ " ;
$return [ $key ][ " name " ] = ( preg_match ( " (^ $search $separator (.+)|^(.+?) $separator $search\ $ ) " , $name , $match ) ? $match [ 2 ] . $match [ 3 ] : $name );
} else {
unset ( $return [ $key ]);
2009-07-27 11:25:37 +00:00
}
2009-07-22 11:04:03 +00:00
}
2009-07-27 11:25:37 +00:00
return $return ;
2009-07-22 11:04:03 +00:00
}
2009-07-27 11:25:37 +00:00
2009-09-23 14:28:06 +00:00
function backwardKeysPrint ( $backwardKeys , $row ) {
if ( $backwardKeys ) {
echo " <td> " ;
foreach ( $backwardKeys as $table => $backwardKey ) {
foreach ( $backwardKey [ " keys " ] as $cols ) {
$link = ME . 'select=' . urlencode ( $table );
$i = 0 ;
foreach ( $cols as $column => $val ) {
$link .= where_link ( $i ++ , $column , $row [ $val ]);
}
2010-04-21 12:01:32 +00:00
echo " <a href=' " . h ( $link ) . " '> " . h ( $backwardKey [ " name " ]) . " </a> " ;
2009-10-23 14:38:44 +00:00
$link = ME . 'edit=' . urlencode ( $table );
foreach ( $cols as $column => $val ) {
$link .= " &set " . urlencode ( " [ " . bracket_escape ( $column ) . " ] " ) . " = " . urlencode ( $row [ $val ]);
}
2009-10-23 15:19:13 +00:00
echo " <a href=' " . h ( $link ) . " ' title=' " . lang ( 'New item' ) . " '>+</a> " ;
2009-09-23 14:28:06 +00:00
}
}
}
}
2009-07-27 11:25:37 +00:00
function selectQuery ( $query ) {
2010-09-27 09:09:07 +00:00
return " <!-- \n " . str_replace ( " -- " , " --><!-- " , $query ) . " \n --> \n " ;
2009-07-27 11:25:37 +00:00
}
function rowDescription ( $table ) {
// first varchar column
foreach ( fields ( $table ) as $field ) {
if ( $field [ " type " ] == " varchar " ) {
2009-07-30 15:37:20 +00:00
return idf_escape ( $field [ " field " ]);
2009-07-27 11:25:37 +00:00
}
2009-07-23 14:42:38 +00:00
}
2009-07-30 15:37:20 +00:00
return " " ;
2009-07-23 14:42:38 +00:00
}
2009-07-27 11:25:37 +00:00
function rowDescriptions ( $rows , $foreignKeys ) {
$return = $rows ;
foreach ( $rows [ 0 ] as $key => $val ) {
foreach (( array ) $foreignKeys [ $key ] as $foreignKey ) {
if ( count ( $foreignKey [ " source " ]) == 1 ) {
$id = idf_escape ( $foreignKey [ " target " ][ 0 ]);
$name = $this -> rowDescription ( $foreignKey [ " table " ]);
2010-01-09 23:33:41 +00:00
if ( $name != " " ) {
2009-07-27 11:25:37 +00:00
// find all used ids
$ids = array ();
foreach ( $rows as $row ) {
2009-10-16 12:26:16 +00:00
$ids [ $row [ $key ]] = exact_value ( $row [ $key ]);
2009-07-27 11:25:37 +00:00
}
// uses constant number of queries to get the descriptions, join would be complex, multiple queries would be slow
2010-04-21 12:01:32 +00:00
$descriptions = $this -> _values [ $foreignKey [ " table " ]];
2009-11-12 15:02:34 +00:00
if ( ! $descriptions ) {
2009-11-18 12:32:39 +00:00
$descriptions = get_key_vals ( " SELECT $id , $name FROM " . idf_escape ( $foreignKey [ " table " ]) . " WHERE $id IN ( " . implode ( " , " , $ids ) . " ) " );
2009-07-27 11:25:37 +00:00
}
// use the descriptions
foreach ( $rows as $n => $row ) {
2009-10-03 20:48:44 +00:00
if ( isset ( $row [ $key ])) {
$return [ $n ][ $key ] = ( string ) $descriptions [ $row [ $key ]];
}
2009-07-27 11:25:37 +00:00
}
break ;
2009-07-23 14:42:38 +00:00
}
2009-07-20 15:34:05 +00:00
}
}
}
2009-07-27 11:25:37 +00:00
return $return ;
2009-07-20 15:34:05 +00:00
}
2009-07-27 11:25:37 +00:00
function selectVal ( $val , $link , $field ) {
$return = ( $val == " <i>NULL</i> " ? " " : $val );
2010-10-02 22:17:13 +00:00
if ( ereg ( 'blob|bytea' , $field [ " type " ]) && ! is_utf8 ( $val )) {
2009-07-27 11:25:37 +00:00
$return = lang ( '%d byte(s)' , strlen ( $val ));
if ( ereg ( " ^(GIF| \xFF \xD8 \xFF | \x89 \x50 \x4E \x47 \x0D \x0A \x1A \x0A ) " , $val )) { // GIF|JPG|PNG, getimagetype() works with filename
2009-07-30 14:55:09 +00:00
$return = " <img src=' $link ' alt=' $return '> " ;
2009-07-27 11:25:37 +00:00
}
2009-07-24 10:14:36 +00:00
}
2009-07-28 10:09:05 +00:00
if ( $field [ " full_type " ] == " tinyint(1) " && $return != " " ) { // bool
2009-09-23 09:56:07 +00:00
$return = '<img src="' . ( $val ? " ../adminer/static/plus.gif " : " ../adminer/static/cross.gif " ) . '" alt="' . h ( $val ) . '">' ;
2009-07-28 10:09:05 +00:00
}
2009-09-25 14:52:30 +00:00
if ( $link ) {
$return = " <a href=' $link '> $return </a> " ;
}
if ( ! $link && $field [ " full_type " ] != " tinyint(1) " && ereg ( 'int|float|double|decimal' , $field [ " type " ])) {
$return = " <div class='number'> $return </div> " ; // Firefox doesn't support <colgroup>
2009-11-19 09:29:06 +00:00
} elseif ( ereg ( 'date' , $field [ " type " ])) {
$return = " <div class='datetime'> $return </div> " ;
2009-09-25 14:52:30 +00:00
}
return $return ;
2009-07-24 10:14:36 +00:00
}
2009-07-27 11:25:37 +00:00
2009-07-27 16:32:56 +00:00
function editVal ( $val , $field ) {
2009-09-22 11:34:30 +00:00
if ( ereg ( 'date|timestamp' , $field [ " type " ]) && isset ( $val )) {
2010-10-22 22:02:24 +00:00
return preg_replace ( '~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~' , lang ( '$1-$3-$5' ), $val );
2009-07-27 16:32:56 +00:00
}
2010-10-02 22:17:13 +00:00
return ( ereg ( " binary " , $field [ " type " ]) ? reset ( unpack ( " H* " , $val )) : $val );
2009-07-27 16:32:56 +00:00
}
2009-07-27 14:40:55 +00:00
function selectColumnsPrint ( $select , $columns ) {
2010-04-21 12:01:32 +00:00
// can allow grouping functions by indexes
2009-07-27 14:40:55 +00:00
}
function selectSearchPrint ( $where , $columns , $indexes ) {
2010-04-21 12:01:32 +00:00
$where = ( array ) $_GET [ " where " ];
2009-07-27 14:40:55 +00:00
echo '<fieldset><legend>' . lang ( 'Search' ) . " </legend><div> \n " ;
2009-11-12 15:02:34 +00:00
$keys = array ();
2010-04-21 12:01:32 +00:00
foreach ( $where as $key => $val ) {
2009-11-12 15:02:34 +00:00
$keys [ $val [ " col " ]] = $key ;
}
2010-04-21 12:01:32 +00:00
$i = 0 ;
foreach ( fields ( $_GET [ " select " ]) as $name => $field ) {
if ( ereg ( " enum " , $field [ " type " ])) { //! set - uses 1 << $i and FIND_IN_SET()
$desc = $columns [ $name ];
$key = $keys [ $name ];
$i -- ;
echo " <div> " . h ( $desc ) . " <input type='hidden' name='where[ $i ][col]' value=' " . h ( $name ) . " '>: " ;
2010-10-22 22:28:48 +00:00
echo enum_input ( " checkbox " , " name='where[ $i ][val][]' " , $field , ( array ) $where [ $key ][ " val " ]); //! impossible to search for NULL
2010-04-21 12:01:32 +00:00
echo " </div> \n " ;
unset ( $columns [ $name ]);
}
}
2009-11-12 15:02:34 +00:00
foreach ( $columns as $name => $desc ) {
2010-04-21 12:01:32 +00:00
$options = $this -> _foreignKeyOptions ( $_GET [ " select " ], $name );
2009-11-12 15:02:34 +00:00
if ( $options ) {
2010-04-21 12:01:32 +00:00
$key = $keys [ $name ];
2009-11-16 11:06:07 +00:00
$i -- ;
2010-04-21 12:01:32 +00:00
echo " <div> " . h ( $desc ) . " <input type='hidden' name='where[ $i ][col]' value=' " . h ( $name ) . " '><input type='hidden' name='where[ $i ][op]' value='='>: <select name='where[ $i ][val]'> " . optionlist ( $options , $where [ $key ][ " val " ], true ) . " </select></div> \n " ;
2009-11-12 15:02:34 +00:00
unset ( $columns [ $name ]);
}
}
2009-07-27 14:40:55 +00:00
$i = 0 ;
2010-04-21 12:01:32 +00:00
foreach ( $where as $val ) {
2010-06-01 23:44:06 +00:00
if (( $val [ " col " ] == " " || $columns [ $val [ " col " ]]) && " $val[col] $val[val] " != " " ) {
2010-04-21 12:01:32 +00:00
echo " <div><select name='where[ $i ][col]'><option value=''>( " . lang ( 'anywhere' ) . " ) " . optionlist ( $columns , $val [ " col " ], true ) . " </select> " ;
2009-10-02 13:21:34 +00:00
echo html_select ( " where[ $i ][op] " , array ( - 1 => " " ) + $this -> operators , $val [ " op " ]);
2009-07-28 16:20:50 +00:00
echo " <input name='where[ $i ][val]' value=' " . h ( $val [ " val " ]) . " '></div> \n " ;
2009-07-27 14:40:55 +00:00
$i ++ ;
}
}
2010-04-21 12:01:32 +00:00
echo " <div><select name='where[ $i ][col]' onchange='selectAddRow(this);'><option value=''>( " . lang ( 'anywhere' ) . " ) " . optionlist ( $columns , null , true ) . " </select> " ;
2009-10-02 13:21:34 +00:00
echo html_select ( " where[ $i ][op] " , array ( - 1 => " " ) + $this -> operators );
2009-07-27 14:40:55 +00:00
echo " <input name='where[ $i ][val]'></div> \n " ;
echo " </div></fieldset> \n " ;
}
function selectOrderPrint ( $order , $columns , $indexes ) {
//! desc
$orders = array ();
2009-07-28 14:21:05 +00:00
foreach ( $indexes as $key => $index ) {
2009-07-27 14:40:55 +00:00
$order = array ();
foreach ( $index [ " columns " ] as $val ) {
$order [] = $this -> fieldName ( array ( " field " => $val , " comment " => $columns [ $val ]));
}
2009-07-28 14:21:05 +00:00
if ( count ( array_filter ( $order , 'strlen' )) > 1 && $key != " PRIMARY " ) {
$orders [ $key ] = implode ( " , " , $order );
2009-07-27 14:40:55 +00:00
}
}
if ( $orders ) {
echo '<fieldset><legend>' . lang ( 'Sort' ) . " </legend><div> " ;
2009-07-28 14:23:46 +00:00
echo " <select name='index_order'> " . optionlist ( array ( " " => " " ) + $orders , $_GET [ " index_order " ], true ) . " </select> " ;
2009-07-27 14:40:55 +00:00
echo " </div></fieldset> \n " ;
}
}
function selectLimitPrint ( $limit ) {
echo " <fieldset><legend> " . lang ( 'Limit' ) . " </legend><div> " ; // <div> for easy styling
2009-10-02 13:21:34 +00:00
echo html_select ( " limit " , array ( " " , " 30 " , " 100 " ), $limit );
2009-07-27 14:40:55 +00:00
echo " </div></fieldset> \n " ;
}
function selectLengthPrint ( $text_length ) {
}
function selectActionPrint () {
echo " <fieldset><legend> " . lang ( 'Action' ) . " </legend><div> " ;
echo " <input type='submit' value=' " . lang ( 'Select' ) . " '> " ;
echo " </div></fieldset> \n " ;
}
2009-09-09 20:47:42 +00:00
function selectEmailPrint ( $emailFields , $columns ) {
2009-07-28 11:18:08 +00:00
if ( $emailFields ) {
2009-09-09 20:47:42 +00:00
echo '<fieldset><legend><a href="#fieldset-email" onclick="return !toggle(\'fieldset-email\');">' . lang ( 'E-mail' ) . " </a></legend><div id='fieldset-email' " . ( $_POST [ " email_append " ] ? " " : " class='hidden' " ) . " > \n " ;
2009-09-09 20:49:30 +00:00
echo " <p> " . lang ( 'From' ) . " : <input name='email_from' value=' " . h ( $_POST ? $_POST [ " email_from " ] : $_COOKIE [ " adminer_email " ]) . " '> \n " ;
2009-09-09 20:47:42 +00:00
echo lang ( 'Subject' ) . " : <input name='email_subject' value=' " . h ( $_POST [ " email_subject " ]) . " '> \n " ;
2010-11-19 14:07:06 +00:00
echo " <p><textarea name='email_message' rows='15' cols='75' onkeypress='return textareaKeypress(this, event, false, this.form.email);'> " . h ( $_POST [ " email_message " ] . ( $_POST [ " email_append " ] ? '{$' . " $_POST[email_addition] } " : " " )) . " </textarea><br> \n " ;
2009-10-02 13:21:34 +00:00
echo html_select ( " email_addition " , $columns , $_POST [ " email_addition " ]) . " <input type='submit' name='email_append' value=' " . lang ( 'Insert' ) . " '> \n " ; //! JavaScript
2010-10-18 23:06:30 +00:00
echo " <p> " . lang ( 'Attachments' ) . " : <input type='file' name='email_files[]' onchange= \" this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el); \" > " ;
2009-10-02 13:21:34 +00:00
echo " <p> " . ( count ( $emailFields ) == 1 ? '<input type="hidden" name="email_field" value="' . h ( key ( $emailFields )) . '">' : html_select ( " email_field " , $emailFields ));
2009-09-23 12:21:14 +00:00
echo " <input type='submit' name='email' value=' " . lang ( 'Send' ) . " ' onclick= \" return this.form['delete'].onclick(); \" > \n " ;
2009-07-28 11:18:08 +00:00
echo " </div></fieldset> \n " ;
}
}
2009-07-27 14:40:55 +00:00
function selectColumnsProcess ( $columns , $indexes ) {
return array ( array (), array ());
}
2009-07-28 14:21:05 +00:00
function selectSearchProcess ( $fields , $indexes ) {
2009-07-27 14:40:55 +00:00
$return = array ();
2010-04-21 12:01:32 +00:00
foreach (( array ) $_GET [ " where " ] as $key => $where ) {
$col = $where [ " col " ];
$op = $where [ " op " ];
$val = $where [ " val " ];
if (( $key < 0 ? " " : $col ) . $val != " " ) {
2009-09-01 14:24:08 +00:00
$conds = array ();
2010-01-09 23:33:41 +00:00
foreach (( $col != " " ? array ( $col => $fields [ $col ]) : $fields ) as $name => $field ) {
2010-04-21 12:01:32 +00:00
if ( $col != " " || is_numeric ( $val ) || ! ereg ( 'int|float|double|decimal' , $field [ " type " ])) {
if ( $col != " " && $field [ " type " ] == " enum " ) {
$conds [] = idf_escape ( $name ) . " IN ( " . implode ( " , " , array_map ( 'intval' , $val )) . " ) " ;
} else {
$text_type = ereg ( 'char|text|enum|set' , $field [ " type " ]);
$value = $this -> processInput ( $field , ( $text_type && ereg ( '^[^%]+$' , $val ) ? " % $val % " : $val ));
$conds [] = idf_escape ( $name ) . ( $value == " NULL " ? " IS " . ( $op == " >= " ? " NOT " : " " ) : ( in_array ( $op , $this -> operators ) ? " $op " : ( $op != " = " && $text_type ? " LIKE " : " = " ))) . " $value " ; //! can issue "Illegal mix of collations" for columns in other character sets - solve by CONVERT($name using utf8)
}
2009-07-27 14:40:55 +00:00
}
}
2009-09-01 14:24:08 +00:00
$return [] = ( $conds ? " ( " . implode ( " OR " , $conds ) . " ) " : " 0 " );
2009-07-27 14:40:55 +00:00
}
}
return $return ;
}
2009-07-28 14:21:05 +00:00
function selectOrderProcess ( $fields , $indexes ) {
2009-07-28 11:04:49 +00:00
if ( $_GET [ " order " ]) {
return array ( idf_escape ( $_GET [ " order " ][ 0 ]) . ( isset ( $_GET [ " desc " ][ 0 ]) ? " DESC " : " " ));
}
2009-07-28 14:31:03 +00:00
$index_order = $_GET [ " index_order " ];
2010-01-09 23:33:41 +00:00
foreach (( $index_order != " " ? array ( $indexes [ $index_order ]) : $indexes ) as $index ) {
if ( $index_order != " " || $index [ " type " ] == " INDEX " ) {
2009-07-28 14:31:03 +00:00
$desc = false ;
foreach ( $index [ " columns " ] as $val ) {
if ( ereg ( 'date|timestamp' , $fields [ $val ][ " type " ])) {
$desc = true ;
break ;
}
2009-07-28 14:21:05 +00:00
}
2009-07-28 14:31:03 +00:00
$return = array ();
foreach ( $index [ " columns " ] as $val ) {
$return [] = idf_escape ( $val ) . ( $desc ? " DESC " : " " );
}
return $return ;
2009-07-28 14:21:05 +00:00
}
}
2009-07-28 14:31:03 +00:00
return array ();
2009-07-27 14:40:55 +00:00
}
function selectLimitProcess () {
return ( isset ( $_GET [ " limit " ]) ? $_GET [ " limit " ] : " 30 " );
}
function selectLengthProcess () {
return " 100 " ;
}
2009-09-09 20:19:27 +00:00
function selectEmailProcess ( $where , $foreignKeys ) {
2009-09-09 20:47:42 +00:00
if ( $_POST [ " email_append " ]) {
return true ;
}
2009-07-27 11:25:37 +00:00
if ( $_POST [ " email " ]) {
$sent = 0 ;
if ( $_POST [ " all " ] || $_POST [ " check " ]) {
$field = idf_escape ( $_POST [ " email_field " ]);
2009-09-09 15:54:02 +00:00
$subject = $_POST [ " email_subject " ];
2010-04-21 12:01:32 +00:00
$message = $_POST [ " email_message " ];
2009-09-09 15:54:02 +00:00
preg_match_all ( '~\\{\\$([a-z0-9_]+)\\}~i' , " $subject . $message " , $matches ); // allows {$name} in subject or message
2010-10-13 15:53:59 +00:00
$rows = get_rows ( " SELECT DISTINCT $field " . ( $matches [ 1 ] ? " , " . implode ( " , " , array_map ( 'idf_escape' , array_unique ( $matches [ 1 ]))) : " " ) . " FROM " . idf_escape ( $_GET [ " select " ])
2009-07-27 11:25:37 +00:00
. " WHERE $field IS NOT NULL AND $field != '' "
. ( $where ? " AND " . implode ( " AND " , $where ) : " " )
. ( $_POST [ " all " ] ? " " : " AND (( " . implode ( " ) OR ( " , array_map ( 'where_check' , ( array ) $_POST [ " check " ])) . " )) " )
);
2009-11-26 14:19:09 +00:00
$fields = fields ( $_GET [ " select " ]);
2009-09-09 20:19:27 +00:00
foreach ( $this -> rowDescriptions ( $rows , $foreignKeys ) as $row ) {
2010-04-21 12:01:32 +00:00
$replace = array ( '{\\' => '{' ); // allow literal {$name}
2009-09-09 15:54:02 +00:00
foreach ( $matches [ 1 ] as $val ) {
2010-04-21 12:01:32 +00:00
$replace [ '{$' . " $val } " ] = $this -> editVal ( $row [ $val ], $fields [ $val ]);
2009-09-09 15:54:02 +00:00
}
$email = $row [ $_POST [ " email_field " ]];
2010-10-16 13:47:51 +00:00
if ( is_mail ( $email ) && send_mail ( $email , strtr ( $subject , $replace ), strtr ( $message , $replace ), $_POST [ " email_from " ], $_FILES [ " email_files " ])) {
2009-07-27 11:25:37 +00:00
$sent ++ ;
}
2009-07-24 10:55:01 +00:00
}
2009-07-24 10:52:24 +00:00
}
2009-09-09 20:49:30 +00:00
cookie ( " adminer_email " , $_POST [ " email_from " ]);
2009-07-27 11:25:37 +00:00
redirect ( remove_from_uri (), lang ( '%d e-mail(s) have been sent.' , $sent ));
2009-07-24 10:52:24 +00:00
}
2009-07-27 11:25:37 +00:00
return false ;
2009-07-24 10:52:24 +00:00
}
2009-07-27 11:25:37 +00:00
function messageQuery ( $query ) {
2010-09-07 20:17:09 +00:00
return " <!-- \n " . str_replace ( " -- " , " --><!-- " , $query ) . " \n --> " ;
2009-07-27 11:25:37 +00:00
}
function editFunctions ( $field ) {
2009-11-11 22:56:20 +00:00
$return = array ( " " => ( $field [ " null " ] || $field [ " auto_increment " ] || $field [ " full_type " ] == " tinyint(1) " ? " " : " * " ));
2010-04-21 12:01:32 +00:00
//! respect driver
2009-08-04 13:55:29 +00:00
if ( ereg ( 'date|time' , $field [ " type " ])) {
2010-06-18 14:38:55 +00:00
$return [ " now " ] = lang ( 'now' );
2009-08-04 13:55:29 +00:00
}
2009-09-22 09:59:53 +00:00
if ( eregi ( '_(md5|sha1)$' , $field [ " field " ], $match )) {
$return [] = strtolower ( $match [ 1 ]);
2009-09-19 19:58:12 +00:00
}
2009-08-04 13:55:29 +00:00
return $return ;
2009-07-27 11:25:37 +00:00
}
2009-07-28 10:09:05 +00:00
function editInput ( $table , $field , $attrs , $value ) {
2009-11-12 15:25:21 +00:00
if ( $field [ " type " ] == " enum " ) {
2010-10-22 22:28:48 +00:00
return ( isset ( $_GET [ " select " ]) ? " <label><input type='radio' $attrs value='-1' checked><i> " . lang ( 'original' ) . " </i></label> " : " " )
. ( $field [ " null " ] ? " <label><input type='radio' $attrs value='' " . ( $value || isset ( $_GET [ " select " ]) ? " " : " checked " ) . " ><i> " . lang ( 'empty' ) . " </i></label> " : " " )
. enum_input ( " radio " , $attrs , $field , $value )
;
2009-11-12 15:25:21 +00:00
}
2010-04-21 12:01:32 +00:00
$options = $this -> _foreignKeyOptions ( $table , $field [ " field " ]);
2009-11-16 11:06:07 +00:00
if ( $options ) {
return " <select $attrs > " . optionlist ( $options , $value , true ) . " </select> " ;
2009-07-23 14:42:38 +00:00
}
2009-07-28 10:09:05 +00:00
if ( $field [ " full_type " ] == " tinyint(1) " ) { // bool
2009-07-28 16:28:47 +00:00
return '<input type="checkbox" value="' . h ( $value ? $value : 1 ) . '"' . ( $value ? ' checked' : '' ) . " $attrs > " ;
2009-07-28 10:09:05 +00:00
}
2009-08-18 09:36:32 +00:00
if ( ereg ( 'date|timestamp' , $field [ " type " ])) {
2009-09-24 08:58:39 +00:00
return " <input value=' " . h ( $value ) . " ' $attrs > ( " . lang ( '[yyyy]-mm-dd' ) . " ) " ; //! maxlength
2009-08-18 09:36:32 +00:00
}
2009-07-28 10:09:05 +00:00
return '' ;
2009-07-23 14:42:38 +00:00
}
2009-07-27 11:25:37 +00:00
2009-07-27 16:32:56 +00:00
function processInput ( $field , $value , $function = " " ) {
2009-08-04 13:55:29 +00:00
if ( $function == " now " ) {
return " $function () " ;
}
2009-11-12 13:40:46 +00:00
$return = $value ;
2010-10-22 22:02:24 +00:00
if ( ereg ( 'date|timestamp' , $field [ " type " ]) && preg_match ( '(^' . str_replace ( '\\$1' , '(?P<p1>\\d*)' , preg_replace ( '~(\\\\\\$([2-6]))~' , '(?P<p\\2>\\d{1,2})' , preg_quote ( lang ( '$1-$3-$5' )))) . '(.*))' , $value , $match )) {
2010-01-09 23:33:41 +00:00
$return = ( $match [ " p1 " ] != " " ? $match [ " p1 " ] : ( $match [ " p2 " ] != " " ? ( $match [ " p2 " ] < 70 ? 20 : 19 ) . $match [ " p2 " ] : gmdate ( " Y " ))) . " - $match[p3] $match[p4] - $match[p5] $match[p6] " . end ( $match );
2009-11-12 13:40:46 +00:00
}
2010-10-13 16:04:40 +00:00
$return = q ( $return );
2010-10-17 20:37:06 +00:00
if ( ! ereg ( 'char|text' , $field [ " type " ]) && $field [ " full_type " ] != " tinyint(1) " && $value == " " ) {
2009-07-27 11:25:37 +00:00
$return = " NULL " ;
2010-04-21 12:01:32 +00:00
} elseif ( ereg ( '^(md5|sha1)$' , $function )) {
$return = " $function ( $return ) " ;
2009-07-27 11:25:37 +00:00
}
2010-10-02 22:17:13 +00:00
if ( ereg ( " binary " , $field [ " type " ])) {
$return = " unhex( $return ) " ;
}
2009-07-27 11:25:37 +00:00
return $return ;
}
2010-10-29 15:11:00 +00:00
function dumpOutput () {
return array ();
2009-10-02 12:21:55 +00:00
}
2010-10-29 15:11:00 +00:00
function dumpFormat () {
2010-10-29 16:02:20 +00:00
return array ( 'csv' => 'CSV,' , 'csv;' => 'CSV;' , 'tsv' => 'TSV' );
2009-10-02 12:21:55 +00:00
}
2010-10-29 15:03:02 +00:00
function dumpTable () {
echo " \xef \xbb \xbf " ; // UTF-8 byte order mark
}
2010-10-29 15:11:00 +00:00
function dumpData ( $table , $style , $query ) {
2010-10-29 15:03:02 +00:00
global $connection ;
2010-10-29 15:11:00 +00:00
$result = $connection -> query ( $query , 1 ); // 1 - MYSQLI_USE_RESULT
2010-10-29 15:03:02 +00:00
if ( $result ) {
while ( $row = $result -> fetch_assoc ()) {
dump_csv ( $row );
}
}
2009-10-02 12:21:55 +00:00
}
2010-10-29 15:03:02 +00:00
function dumpHeaders ( $identifier ) {
$filename = ( $identifier != " " ? friendly_url ( $identifier ) : " dump " );
$ext = " csv " ;
header ( " Content-Type: text/csv; charset=utf-8 " );
header ( " Content-Disposition: attachment; filename= $filename . $ext " );
session_write_close ();
return $ext ;
2009-10-02 12:21:55 +00:00
}
2009-07-27 11:25:37 +00:00
function navigation ( $missing ) {
2010-04-21 12:01:32 +00:00
global $VERSION , $token ;
2009-09-19 20:16:15 +00:00
?>
< h1 >
< a href = " http://www.adminer.org/ " id = " h1 " >< ? php echo $this -> name (); ?> </a>
< span class = " version " >< ? php echo $VERSION ; ?> </span>
< a href = " http://www.adminer.org/editor/#download " id = " version " >< ? php echo ( version_compare ( $VERSION , $_COOKIE [ " adminer_version " ]) < 0 ? h ( $_COOKIE [ " adminer_version " ]) : " " ); ?> </a>
</ h1 >
< ? php
2010-05-06 12:21:22 +00:00
if ( $missing == " auth " ) {
$first = true ;
2010-10-15 08:58:08 +00:00
foreach (( array ) $_SESSION [ " pwds " ][ " server " ][ " " ] as $username => $password ) {
2010-05-06 12:21:22 +00:00
if ( isset ( $password )) {
if ( $first ) {
2010-12-01 17:44:17 +00:00
echo " <p onclick='eventStop(event);'> \n " ;
2010-05-06 12:21:22 +00:00
$first = false ;
}
2010-10-07 14:17:51 +00:00
echo " <a href=' " . h ( auth_url ( " server " , " " , $username )) . " '> " . ( $username != " " ? h ( $username ) : " <i> " . lang ( 'empty' ) . " </i> " ) . " </a><br> \n " ;
2010-05-06 12:21:22 +00:00
}
}
} else {
2009-07-27 11:25:37 +00:00
?>
2009-07-03 06:26:01 +00:00
< form action = " " method = " post " >
2009-10-28 12:21:21 +00:00
< p class = " logout " >
2010-04-21 12:01:32 +00:00
< input type = " hidden " name = " token " value = " <?php echo $token ; ?> " >
2009-07-11 20:30:40 +00:00
< input type = " submit " name = " logout " value = " <?php echo lang('Logout'); ?> " >
2009-07-14 11:09:39 +00:00
</ p >
2009-07-03 06:26:01 +00:00
</ form >
< ? php
2010-10-18 00:15:58 +00:00
if ( $missing != " db " && $missing != " ns " ) {
2009-09-23 15:01:17 +00:00
$table_status = table_status ();
if ( ! $table_status ) {
echo " <p class='message'> " . lang ( 'No tables.' ) . " \n " ;
} else {
$this -> tablesPrint ( $table_status );
}
}
2009-09-19 20:16:15 +00:00
}
}
2009-09-23 15:01:17 +00:00
function tablesPrint ( $tables ) {
echo " <p id='tables'> \n " ;
foreach ( $tables as $row ) {
$name = $this -> tableName ( $row );
2010-01-09 23:33:41 +00:00
if ( isset ( $row [ " Engine " ]) && $name != " " ) { // ignore views and tables without name
2010-11-22 15:08:36 +00:00
echo " <a href=' " . h ( ME ) . 'select=' . urlencode ( $row [ " Name " ]) . " ' " . bold ( $_GET [ " select " ] == $row [ " Name " ]) . " > $name </a><br> \n " ;
2009-07-03 06:26:01 +00:00
}
}
}
2009-07-27 11:25:37 +00:00
2010-04-21 12:01:32 +00:00
function _foreignKeyOptions ( $table , $column ) {
2009-11-16 11:06:07 +00:00
$foreignKeys = column_foreign_keys ( $table );
foreach (( array ) $foreignKeys [ $column ] as $foreignKey ) {
if ( count ( $foreignKey [ " source " ]) == 1 ) {
$id = idf_escape ( $foreignKey [ " target " ][ 0 ]);
$name = $this -> rowDescription ( $foreignKey [ " table " ]);
2010-01-09 23:33:41 +00:00
if ( $name != " " ) {
2010-04-21 12:01:32 +00:00
$return = & $this -> _values [ $foreignKey [ " table " ]];
2009-11-16 11:06:07 +00:00
if ( ! isset ( $return )) {
2010-05-03 16:08:46 +00:00
$table_status = table_status ( $foreignKey [ " table " ]);
2010-04-21 12:01:32 +00:00
$return = ( $table_status [ " Rows " ] > 1000 ? array () : array ( " " => " " ) + get_key_vals ( " SELECT $id , $name FROM " . idf_escape ( $foreignKey [ " table " ]) . " ORDER BY 2 " ));
2009-11-16 11:06:07 +00:00
}
return $return ;
}
}
}
}
2010-04-21 12:01:32 +00:00
2009-07-03 06:26:01 +00:00
}
2009-09-09 11:03:03 +00:00
$adminer = ( function_exists ( 'adminer_object' ) ? adminer_object () : new Adminer );