2007-07-02 05:51:26 +00:00
< ? php
2009-08-29 13:57:50 +00:00
$TABLE = $_GET [ " select " ];
2013-06-24 12:53:23 +00:00
$table_status = table_status1 ( $TABLE );
2009-08-29 13:57:50 +00:00
$indexes = indexes ( $TABLE );
2010-11-11 09:47:32 +00:00
$fields = fields ( $TABLE );
2009-09-09 20:19:27 +00:00
$foreign_keys = column_foreign_keys ( $TABLE );
2012-07-15 21:55:46 +00:00
$oid = " " ;
2013-05-24 04:05:45 +00:00
if ( $table_status [ " Oid " ]) {
2012-07-15 21:55:46 +00:00
$oid = ( $jush == " sqlite " ? " rowid " : " oid " );
$indexes [] = array ( " type " => " PRIMARY " , " columns " => array ( $oid ));
2011-02-01 15:19:39 +00:00
}
2011-07-13 11:08:20 +00:00
parse_str ( $_COOKIE [ " adminer_import " ], $adminer_import );
2009-09-09 20:19:27 +00:00
2009-06-21 23:20:32 +00:00
$rights = array (); // privilege => 0
$columns = array (); // selectable columns
2010-04-22 12:19:22 +00:00
$text_length = null ;
2007-07-06 13:03:13 +00:00
foreach ( $fields as $key => $field ) {
2009-07-27 11:25:37 +00:00
$name = $adminer -> fieldName ( $field );
2010-01-09 23:33:41 +00:00
if ( isset ( $field [ " privileges " ][ " select " ]) && $name != " " ) {
2013-04-27 06:25:35 +00:00
$columns [ $key ] = html_entity_decode ( strip_tags ( $name ), ENT_QUOTES );
2012-09-22 14:34:51 +00:00
if ( is_shortable ( $field )) {
2009-07-27 14:40:55 +00:00
$text_length = $adminer -> selectLengthProcess ();
2009-07-13 23:28:26 +00:00
}
2007-07-06 13:03:13 +00:00
}
2007-07-09 06:12:22 +00:00
$rights += $field [ " privileges " ];
}
2009-07-27 14:40:55 +00:00
list ( $select , $group ) = $adminer -> selectColumnsProcess ( $columns , $indexes );
2012-09-09 04:54:35 +00:00
$is_group = count ( $group ) < count ( $select );
2009-07-28 14:21:05 +00:00
$where = $adminer -> selectSearchProcess ( $fields , $indexes );
$order = $adminer -> selectOrderProcess ( $fields , $indexes );
2009-07-27 14:40:55 +00:00
$limit = $adminer -> selectLimitProcess ();
2013-04-27 05:57:44 +00:00
$from = ( $select ? implode ( " , " , $select ) : " * " . ( $oid ? " , $oid " : " " ))
. convert_fields ( $columns , $fields , $select )
. " \n FROM " . table ( $TABLE );
2012-09-09 04:54:35 +00:00
$group_by = ( $group && $is_group ? " \n GROUP BY " . implode ( " , " , $group ) : " " ) . ( $order ? " \n ORDER BY " . implode ( " , " , $order ) : " " );
2008-01-08 14:02:55 +00:00
2010-10-18 11:57:22 +00:00
if ( $_GET [ " val " ] && is_ajax ()) {
header ( " Content-Type: text/plain; charset=utf-8 " );
foreach ( $_GET [ " val " ] as $unique_idf => $row ) {
2012-09-09 23:25:25 +00:00
$as = convert_field ( $fields [ key ( $row )]);
2014-01-09 07:14:53 +00:00
$select = array ( $as ? $as : idf_escape ( key ( $row )));
$where [] = where_check ( $unique_idf , $fields );
2014-01-15 16:23:26 +00:00
$return = $driver -> select ( $TABLE , $select , $where , $select );
2014-01-09 07:14:53 +00:00
if ( $return ) {
echo reset ( $return -> fetch_row ());
}
2010-10-18 11:57:22 +00:00
}
exit ;
}
2008-01-08 14:02:55 +00:00
if ( $_POST && ! $error ) {
2013-05-11 19:47:04 +00:00
$where_check = $where ;
2013-12-21 01:07:46 +00:00
if ( ! $_POST [ " all " ] && is_array ( $_POST [ " check " ])) {
2014-02-25 08:10:34 +00:00
$checks = array ();
foreach ( $_POST [ " check " ] as $check ) {
$checks [] = where_check ( $check , $fields );
}
$where_check [] = " (( " . implode ( " ) OR ( " , $checks ) . " )) " ;
2013-05-11 19:47:04 +00:00
}
$where_check = ( $where_check ? " \n WHERE " . implode ( " AND " , $where_check ) : " " );
2010-07-22 15:57:26 +00:00
$primary = $unselected = null ;
2010-07-22 15:43:43 +00:00
foreach ( $indexes as $index ) {
if ( $index [ " type " ] == " PRIMARY " ) {
2010-07-22 15:57:26 +00:00
$primary = array_flip ( $index [ " columns " ]);
$unselected = ( $select ? $primary : array ());
2010-07-22 15:43:43 +00:00
break ;
}
}
2011-05-24 15:03:48 +00:00
foreach (( array ) $unselected as $key => $val ) {
if ( in_array ( idf_escape ( $key ), $select )) {
unset ( $unselected [ $key ]);
2009-07-27 14:40:55 +00:00
}
}
2013-07-24 23:26:41 +00:00
2008-10-01 11:39:13 +00:00
if ( $_POST [ " export " ]) {
2011-07-13 11:08:20 +00:00
cookie ( " adminer_import " , " output= " . urlencode ( $_POST [ " output " ]) . " &format= " . urlencode ( $_POST [ " format " ]));
2011-02-17 10:43:21 +00:00
dump_headers ( $TABLE );
2010-10-29 15:03:02 +00:00
$adminer -> dumpTable ( $TABLE , " " );
2010-07-22 15:57:26 +00:00
if ( ! is_array ( $_POST [ " check " ]) || $unselected === array ()) {
2013-05-11 19:47:04 +00:00
$query = " SELECT $from $where_check $group_by " ;
2009-07-13 23:28:26 +00:00
} else {
2009-06-15 10:01:55 +00:00
$union = array ();
2009-04-01 10:57:34 +00:00
foreach ( $_POST [ " check " ] as $val ) {
2009-07-13 23:28:26 +00:00
// where is not unique so OR can't be used
2012-12-12 05:25:56 +00:00
$union [] = " (SELECT " . limit ( $from , " \n WHERE " . ( $where ? implode ( " AND " , $where ) . " AND " : " " ) . where_check ( $val , $fields ) . $group_by , 1 ) . " ) " ;
2008-01-08 14:02:55 +00:00
}
2011-02-15 16:22:50 +00:00
$query = implode ( " UNION ALL " , $union );
2008-01-08 14:02:55 +00:00
}
2011-02-15 16:22:50 +00:00
$adminer -> dumpData ( $TABLE , " table " , $query );
2008-10-01 11:39:13 +00:00
exit ;
}
2013-07-24 23:26:41 +00:00
2009-09-09 20:19:27 +00:00
if ( ! $adminer -> selectEmailProcess ( $where , $foreign_keys )) {
2010-04-27 14:20:27 +00:00
if ( $_POST [ " save " ] || $_POST [ " delete " ]) { // edit
2009-07-24 10:52:24 +00:00
$result = true ;
$affected = 0 ;
2009-07-30 15:53:10 +00:00
$set = array ();
2009-07-24 10:52:24 +00:00
if ( ! $_POST [ " delete " ]) {
foreach ( $columns as $name => $val ) { //! should check also for edit or insert privileges
2009-07-27 16:32:56 +00:00
$val = process_input ( $fields [ $name ]);
2013-07-06 17:31:21 +00:00
if ( $val !== null && ( $_POST [ " clone " ] || $val !== false )) {
$set [ idf_escape ( $name )] = ( $val !== false ? $val : idf_escape ( $name ));
2009-07-24 10:52:24 +00:00
}
2008-12-30 15:19:35 +00:00
}
}
2009-07-24 10:52:24 +00:00
if ( $_POST [ " delete " ] || $set ) {
2010-04-21 12:01:32 +00:00
if ( $_POST [ " clone " ]) {
2013-07-05 22:32:15 +00:00
$query = " INTO " . table ( $TABLE ) . " ( " . implode ( " , " , array_keys ( $set )) . " ) \n SELECT " . implode ( " , " , $set ) . " \n FROM " . table ( $TABLE );
2010-04-21 12:01:32 +00:00
}
2013-05-28 18:23:48 +00:00
if ( $_POST [ " all " ] || ( $unselected === array () && is_array ( $_POST [ " check " ])) || $is_group ) {
2013-07-05 16:04:06 +00:00
$result = ( $_POST [ " delete " ]
? $driver -> delete ( $TABLE , $where_check )
2013-07-05 22:32:15 +00:00
: ( $_POST [ " clone " ]
? queries ( " INSERT $query $where_check " )
: $driver -> update ( $TABLE , $set , $where_check )
)
2013-07-05 16:04:06 +00:00
);
2009-09-22 10:51:40 +00:00
$affected = $connection -> affected_rows ;
2009-07-24 10:52:24 +00:00
} else {
foreach (( array ) $_POST [ " check " ] as $val ) {
// where is not unique so OR can't be used
2013-07-05 16:04:06 +00:00
$where2 = " \n WHERE " . ( $where ? implode ( " AND " , $where ) . " AND " : " " ) . where_check ( $val , $fields );
$result = ( $_POST [ " delete " ]
? $driver -> delete ( $TABLE , $where2 , 1 )
2013-07-05 22:32:15 +00:00
: ( $_POST [ " clone " ]
? queries ( " INSERT " . limit1 ( $query , $where2 ))
: $driver -> update ( $TABLE , $set , $where2 )
)
2013-07-05 16:04:06 +00:00
);
2009-07-24 10:52:24 +00:00
if ( ! $result ) {
break ;
}
2009-09-22 10:51:40 +00:00
$affected += $connection -> affected_rows ;
2009-06-30 16:30:28 +00:00
}
2008-12-30 15:19:35 +00:00
}
2008-10-01 11:39:13 +00:00
}
2012-07-28 00:37:04 +00:00
$message = lang ( '%d item(s) have been affected.' , $affected );
if ( $_POST [ " clone " ] && $result && $affected == 1 ) {
$last_id = last_id ();
if ( $last_id ) {
$message = lang ( 'Item%s has been inserted.' , " $last_id " );
}
}
2013-03-27 02:08:58 +00:00
queries_redirect ( remove_from_uri ( $_POST [ " all " ] && $_POST [ " delete " ] ? " page " : " " ), $message , $result );
2014-02-25 07:59:12 +00:00
if ( ! $_POST [ " delete " ]) {
edit_form ( $TABLE , $fields , ( array ) $_POST [ " fields " ], ! $_POST [ " clone " ]);
page_footer ();
exit ;
}
2013-07-24 23:26:41 +00:00
2010-04-23 15:26:59 +00:00
} elseif ( ! $_POST [ " import " ]) { // modify
2010-05-07 15:20:06 +00:00
if ( ! $_POST [ " val " ]) {
2012-10-04 07:17:17 +00:00
$error = lang ( 'Ctrl+click on a value to modify it.' );
2010-05-07 15:20:06 +00:00
} else {
$result = true ;
$affected = 0 ;
foreach ( $_POST [ " val " ] as $unique_idf => $row ) {
$set = array ();
foreach ( $row as $key => $val ) {
$key = bracket_escape ( $key , 1 ); // 1 - back
2013-07-24 23:26:41 +00:00
$set [ idf_escape ( $key )] = ( preg_match ( '~char|text~' , $fields [ $key ][ " type " ]) || $val != " " ? $adminer -> processInput ( $fields [ $key ], $val ) : " NULL " );
2010-05-07 15:20:06 +00:00
}
2013-07-05 22:32:15 +00:00
$result = $driver -> update (
$TABLE ,
$set ,
" WHERE " . ( $where ? implode ( " AND " , $where ) . " AND " : " " ) . where_check ( $unique_idf , $fields ),
2013-07-06 17:31:21 +00:00
! ( $is_group || $unselected === array ()),
" "
2013-07-05 22:32:15 +00:00
);
2010-05-07 15:20:06 +00:00
if ( ! $result ) {
break ;
}
$affected += $connection -> affected_rows ;
2010-04-23 15:26:59 +00:00
}
2010-05-07 15:20:06 +00:00
queries_redirect ( remove_from_uri (), lang ( '%d item(s) have been affected.' , $affected ), $result );
2010-04-23 15:26:59 +00:00
}
2013-07-24 23:26:41 +00:00
2013-06-03 21:57:26 +00:00
} elseif ( ! is_string ( $file = get_file ( " csv_file " , true ))) {
$error = upload_error ( $file );
} elseif ( ! preg_match ( '~~u' , $file )) {
$error = lang ( 'File must be in UTF-8 encoding.' );
} else {
2011-07-13 11:08:20 +00:00
cookie ( " adminer_import " , " output= " . urlencode ( $adminer_import [ " output " ]) . " &format= " . urlencode ( $_POST [ " separator " ]));
2009-08-20 15:05:35 +00:00
$result = true ;
2009-08-30 21:22:05 +00:00
$cols = array_keys ( $fields );
2010-02-24 13:12:58 +00:00
preg_match_all ( '~(?>"[^"]*"|[^"\\r\\n]+)+~' , $file , $matches );
2009-08-30 21:22:05 +00:00
$affected = count ( $matches [ 0 ]);
2013-07-09 18:43:01 +00:00
$driver -> begin ();
2010-10-29 16:02:20 +00:00
$separator = ( $_POST [ " separator " ] == " csv " ? " , " : ( $_POST [ " separator " ] == " tsv " ? " \t " : " ; " ));
2013-07-09 18:34:12 +00:00
$rows = array ();
2009-07-24 10:52:24 +00:00
foreach ( $matches [ 0 ] as $key => $val ) {
2012-12-16 06:07:42 +00:00
preg_match_all ( " ~((?> \" [^ \" ]* \" )+|[^ $separator ]*) $separator ~ " , $val . $separator , $matches2 );
2009-08-30 21:22:05 +00:00
if ( ! $key && ! array_diff ( $matches2 [ 1 ], $cols )) { //! doesn't work with column names containing ",\n
2009-07-24 10:52:24 +00:00
// first row corresponds to column names - use it for table structure
2009-08-30 21:22:05 +00:00
$cols = $matches2 [ 1 ];
$affected -- ;
2009-07-24 10:52:24 +00:00
} else {
2010-05-27 14:10:17 +00:00
$set = array ();
2009-08-30 21:22:05 +00:00
foreach ( $matches2 [ 1 ] as $i => $col ) {
2010-10-13 16:04:40 +00:00
$set [ idf_escape ( $cols [ $i ])] = ( $col == " " && $fields [ $cols [ $i ]][ " null " ] ? " NULL " : q ( str_replace ( '""' , '"' , preg_replace ( '~^"|"$~' , '' , $col ))));
2009-07-24 10:52:24 +00:00
}
2013-07-09 18:34:12 +00:00
$rows [] = $set ;
2009-08-20 15:05:35 +00:00
}
}
2013-07-09 18:34:12 +00:00
$result = ( ! $rows || $driver -> insertUpdate ( $TABLE , $rows , $primary ));
2010-02-24 13:12:21 +00:00
if ( $result ) {
2013-07-09 18:43:01 +00:00
$driver -> commit ();
2010-02-24 13:12:21 +00:00
}
2009-10-13 20:01:52 +00:00
queries_redirect ( remove_from_uri ( " page " ), lang ( '%d row(s) have been imported.' , $affected ), $result );
2013-07-09 18:43:01 +00:00
$driver -> rollback (); // after queries_redirect() to not overwrite error
2013-07-24 23:26:41 +00:00
2009-04-16 13:18:22 +00:00
}
2008-08-16 21:15:46 +00:00
}
2008-01-08 14:02:55 +00:00
}
2009-07-11 19:45:57 +00:00
2009-09-08 20:55:17 +00:00
$table_name = $adminer -> tableName ( $table_status );
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
2013-06-29 19:41:35 +00:00
page_headers ();
2012-09-07 07:51:43 +00:00
ob_start ();
2013-06-29 19:41:35 +00:00
} else {
page_header ( lang ( 'Select' ) . " : $table_name " , $error );
2012-08-20 03:32:53 +00:00
}
2008-01-08 14:02:55 +00:00
2009-09-20 07:31:46 +00:00
$set = null ;
2013-07-06 17:31:21 +00:00
if ( isset ( $rights [ " insert " ]) || ! support ( " table " )) {
2009-07-30 08:12:54 +00:00
$set = " " ;
foreach (( array ) $_GET [ " where " ] as $val ) {
if ( count ( $foreign_keys [ $val [ " col " ]]) == 1 && ( $val [ " op " ] == " = "
2013-07-24 23:26:41 +00:00
|| ( ! $val [ " op " ] && ! preg_match ( '~[_%]~' , $val [ " val " ])) // LIKE in Editor
2009-07-30 08:12:54 +00:00
)) {
$set .= " &set " . urlencode ( " [ " . bracket_escape ( $val [ " col " ]) . " ] " ) . " = " . urlencode ( $val [ " val " ]);
}
}
2007-07-02 05:51:26 +00:00
}
2009-09-20 07:31:46 +00:00
$adminer -> selectLinks ( $table_status , $set );
2007-07-02 05:51:26 +00:00
2013-07-06 17:31:21 +00:00
if ( ! $columns && support ( " table " )) {
2010-04-21 12:01:32 +00:00
echo " <p class='error'> " . lang ( 'Unable to select the table' ) . ( $fields ? " . " : " : " . error ()) . " \n " ;
2007-07-06 13:03:13 +00:00
} else {
2011-03-21 11:15:38 +00:00
echo " <form action='' id='form'> \n " ;
2009-07-27 14:40:55 +00:00
echo " <div style='display: none;'> " ;
2010-04-21 12:01:32 +00:00
hidden_fields_get ();
2010-05-06 09:24:47 +00:00
echo ( DB != " " ? '<input type="hidden" name="db" value="' . h ( DB ) . '">' . ( isset ( $_GET [ " ns " ]) ? '<input type="hidden" name="ns" value="' . h ( $_GET [ " ns " ]) . '">' : " " ) : " " ); // not used in Editor
2009-08-29 13:57:50 +00:00
echo '<input type="hidden" name="select" value="' . h ( $TABLE ) . '">' ;
2009-07-27 14:40:55 +00:00
echo " </div> \n " ;
$adminer -> selectColumnsPrint ( $select , $columns );
$adminer -> selectSearchPrint ( $where , $columns , $indexes );
$adminer -> selectOrderPrint ( $order , $columns , $indexes );
$adminer -> selectLimitPrint ( $limit );
$adminer -> selectLengthPrint ( $text_length );
2012-05-17 06:54:56 +00:00
$adminer -> selectActionPrint ( $indexes );
2007-07-06 13:03:13 +00:00
echo " </form> \n " ;
2013-07-24 23:26:41 +00:00
2010-04-22 12:37:56 +00:00
$page = $_GET [ " page " ];
if ( $page == " last " ) {
2013-07-04 01:40:55 +00:00
$found_rows = $connection -> result ( count_rows ( $TABLE , $where , $is_group , $group ));
2010-10-18 20:17:43 +00:00
$page = floor ( max ( 0 , $found_rows - 1 ) / $limit );
2010-04-22 12:37:56 +00:00
}
2013-07-10 00:38:13 +00:00
$select2 = $select ;
if ( ! $select2 ) {
$select2 [] = " * " ;
if ( $oid ) {
$select2 [] = $oid ;
}
}
$convert_fields = convert_fields ( $columns , $fields , $select );
if ( $convert_fields ) {
$select2 [] = substr ( $convert_fields , 2 );
2012-08-24 05:17:44 +00:00
}
2014-01-09 07:14:37 +00:00
$result = $driver -> select ( $TABLE , $select2 , $where , $group , $order , $limit , $page , true );
2013-07-24 23:26:41 +00:00
2007-09-03 11:12:38 +00:00
if ( ! $result ) {
2009-12-17 15:31:24 +00:00
echo " <p class='error'> " . error () . " \n " ;
2007-07-06 13:03:13 +00:00
} else {
2013-04-11 15:46:37 +00:00
if ( $jush == " mssql " && $page ) {
2010-04-23 09:04:05 +00:00
$result -> seek ( $limit * $page );
}
2009-07-11 22:44:22 +00:00
$email_fields = array ();
2010-11-12 16:09:30 +00:00
echo " <form action='' method='post' enctype='multipart/form-data'> \n " ;
2010-04-21 12:01:32 +00:00
$rows = array ();
while ( $row = $result -> fetch_assoc ()) {
2011-05-24 13:20:13 +00:00
if ( $page && $jush == " oracle " ) {
unset ( $row [ " RNUM " ]);
}
2010-04-21 12:01:32 +00:00
$rows [] = $row ;
}
2013-07-24 23:26:41 +00:00
2010-04-21 12:01:32 +00:00
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
2013-07-04 01:40:55 +00:00
if ( $_GET [ " page " ] != " last " && + $limit && $group && $is_group && $jush == " sql " ) {
$found_rows = $connection -> result ( " SELECT FOUND_ROWS() " ); // space to allow mysql.trace_mode
2010-04-23 09:04:05 +00:00
}
2013-07-24 23:26:41 +00:00
2010-04-21 12:01:32 +00:00
if ( ! $rows ) {
2009-07-11 20:30:40 +00:00
echo " <p class='message'> " . lang ( 'No rows.' ) . " \n " ;
2007-09-03 11:12:38 +00:00
} else {
2009-09-23 14:28:06 +00:00
$backward_keys = $adminer -> backwardKeys ( $TABLE , $table_name );
2013-07-24 23:26:41 +00:00
2012-10-04 07:42:56 +00:00
echo " <table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);' onkeydown='return editingKeydown(event);'> \n " ;
2013-07-08 22:12:17 +00:00
echo " <thead><tr> " . ( ! $group && $select ? " " : " <td><input type='checkbox' id='all-page' onclick='formCheck(this, /check/);'> <a href=' " . h ( $_GET [ " modify " ] ? remove_from_uri ( " modify " ) : $_SERVER [ " REQUEST_URI " ] . " &modify=1 " ) . " '> " . lang ( 'Modify' ) . " </a> " );
2009-07-23 15:49:59 +00:00
$names = array ();
2010-04-26 16:20:39 +00:00
$functions = array ();
2009-07-23 15:49:59 +00:00
reset ( $select );
2010-10-24 09:36:20 +00:00
$rank = 1 ;
2009-07-14 10:06:35 +00:00
foreach ( $rows [ 0 ] as $key => $val ) {
2012-07-15 21:55:46 +00:00
if ( $key != $oid ) {
2011-02-01 15:19:39 +00:00
$val = $_GET [ " columns " ][ key ( $select )];
2011-05-24 15:03:48 +00:00
$field = $fields [ $select ? ( $val ? $val [ " col " ] : current ( $select )) : $key ];
2013-07-06 17:31:21 +00:00
$name = ( $field ? $adminer -> fieldName ( $field , $rank ) : ( $val [ " fun " ] ? " * " : $key ));
2011-02-01 15:19:39 +00:00
if ( $name != " " ) {
$rank ++ ;
$names [ $key ] = $name ;
2012-08-09 05:40:38 +00:00
$column = idf_escape ( $key );
2012-05-01 01:08:42 +00:00
$href = remove_from_uri ( '(order|desc)[^=]*|page' ) . '&order%5B0%5D=' . urlencode ( $key );
2012-08-09 05:40:38 +00:00
$desc = " &desc%5B0%5D=1 " ;
2012-07-29 20:55:39 +00:00
echo '<th onmouseover="columnMouse(this);" onmouseout="columnMouse(this, \' hidden\');">' ;
2012-09-09 04:54:35 +00:00
echo '<a href="' . h ( $href . ( $order [ 0 ] == $column || $order [ 0 ] == $key || ( ! $order && $is_group && $group [ 0 ] == $column ) ? $desc : '' )) . '">' ; // $order[0] == $key - COUNT(*)
2013-07-06 17:31:21 +00:00
echo apply_sql_function ( $val [ " fun " ], $name ) . " </a> " ; //! columns looking like functions
2012-07-29 20:55:39 +00:00
echo " <span class='column hidden'> " ;
2012-08-09 05:40:38 +00:00
echo " <a href=' " . h ( $href . $desc ) . " ' title=' " . lang ( 'descending' ) . " ' class='text'> ↓</a> " ;
2012-07-29 18:16:41 +00:00
if ( ! $val [ " fun " ]) {
echo '<a href="#fieldset-search" onclick="selectSearch(\'' . h ( js_escape ( $key )) . '\'); return false;" title="' . lang ( 'Search' ) . '" class="text jsonly"> =</a>' ;
}
2012-07-29 20:55:39 +00:00
echo " </span> " ;
2011-02-01 15:19:39 +00:00
}
$functions [ $key ] = $val [ " fun " ];
next ( $select );
2009-07-21 13:59:02 +00:00
}
2009-07-14 10:06:35 +00:00
}
2013-07-24 23:26:41 +00:00
2010-04-23 15:26:59 +00:00
$lengths = array ();
if ( $_GET [ " modify " ]) {
foreach ( $rows as $row ) {
foreach ( $row as $key => $val ) {
$lengths [ $key ] = max ( $lengths [ $key ], min ( 40 , strlen ( utf8_decode ( $val ))));
}
}
}
2013-07-24 23:26:41 +00:00
2009-09-23 14:28:06 +00:00
echo ( $backward_keys ? " <th> " . lang ( 'Relations' ) : " " ) . " </thead> \n " ;
2013-07-24 23:26:41 +00:00
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
if ( $limit % 2 == 1 && $page % 2 == 1 ) {
odd ();
}
ob_end_clean ();
}
2013-07-24 23:26:41 +00:00
2009-09-09 20:19:27 +00:00
foreach ( $adminer -> rowDescriptions ( $rows , $foreign_keys ) as $n => $row ) {
2010-04-21 12:01:32 +00:00
$unique_array = unique_array ( $rows [ $n ], $indexes );
2013-05-11 20:03:39 +00:00
if ( ! $unique_array ) {
$unique_array = array ();
foreach ( $rows [ $n ] as $key => $val ) {
if ( ! preg_match ( '~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~' , $key )) { //! columns looking like functions
$unique_array [ $key ] = $val ;
}
}
}
2010-04-15 12:42:31 +00:00
$unique_idf = " " ;
foreach ( $unique_array as $key => $val ) {
2014-01-09 07:14:37 +00:00
if (( $jush == " sql " || $jush == " pgsql " ) && strlen ( $val ) > 64 ) {
2013-01-23 11:55:47 +00:00
$key = " MD5( " . ( strpos ( $key , '(' ) ? $key : idf_escape ( $key )) . " ) " ; //! columns looking like functions
$val = md5 ( $val );
}
2012-05-14 06:54:07 +00:00
$unique_idf .= " & " . ( $val !== null ? urlencode ( " where[ " . bracket_escape ( $key ) . " ] " ) . " = " . urlencode ( $val ) : " null%5B%5D= " . urlencode ( $key ));
2010-04-15 12:42:31 +00:00
}
2012-09-09 04:54:35 +00:00
echo " <tr " . odd () . " > " . ( ! $group && $select ? " " : " <td> " . checkbox ( " check[] " , substr ( $unique_idf , 1 ), in_array ( substr ( $unique_idf , 1 ), ( array ) $_POST [ " check " ]), " " , " this.form['all'].checked = false; formUncheck('all-page'); " ) . ( $is_group || information_schema ( DB ) ? " " : " <a href=' " . h ( ME . " edit= " . urlencode ( $TABLE ) . $unique_idf ) . " '> " . lang ( 'edit' ) . " </a> " ));
2013-07-24 23:26:41 +00:00
2007-09-03 11:12:38 +00:00
foreach ( $row as $key => $val ) {
2009-07-24 09:52:18 +00:00
if ( isset ( $names [ $key ])) {
2009-09-25 14:52:30 +00:00
$field = $fields [ $key ];
2010-01-09 23:33:41 +00:00
if ( $val != " " && ( ! isset ( $email_fields [ $key ]) || $email_fields [ $key ] != " " )) {
2010-10-16 13:47:51 +00:00
$email_fields [ $key ] = ( is_mail ( $val ) ? $names [ $key ] : " " ); //! filled e-mails can be contained on other pages
2009-07-21 13:59:02 +00:00
}
2013-07-24 23:26:41 +00:00
2009-07-21 16:22:42 +00:00
$link = " " ;
2013-08-06 21:55:56 +00:00
if ( preg_match ( '~blob|bytea|raw|file~' , $field [ " type " ]) && $val != " " ) {
$link = ME . 'download=' . urlencode ( $TABLE ) . '&field=' . urlencode ( $key ) . $unique_idf ;
}
2014-01-11 04:42:01 +00:00
if ( ! $link && $val !== null ) { // link related items
2013-08-06 21:55:56 +00:00
foreach (( array ) $foreign_keys [ $key ] as $foreign_key ) {
if ( count ( $foreign_keys [ $key ]) == 1 || end ( $foreign_key [ " source " ]) == $key ) {
$link = " " ;
foreach ( $foreign_key [ " source " ] as $i => $source ) {
$link .= where_link ( $i , $foreign_key [ " target " ][ $i ], $rows [ $n ][ $source ]);
2009-07-21 13:59:02 +00:00
}
2013-08-06 21:55:56 +00:00
$link = ( $foreign_key [ " db " ] != " " ? preg_replace ( '~([?&]db=)[^&]+~' , '\\1' . urlencode ( $foreign_key [ " db " ]), ME ) : ME ) . 'select=' . urlencode ( $foreign_key [ " table " ]) . $link ; // InnoDB supports non-UNIQUE keys
if ( count ( $foreign_key [ " source " ]) == 1 ) {
break ;
2010-04-15 12:42:31 +00:00
}
}
2010-04-02 12:13:56 +00:00
}
2007-07-02 15:52:15 +00:00
}
2013-08-06 21:55:56 +00:00
if ( $key == " COUNT(*) " ) { //! columns looking like functions
$link = ME . " select= " . urlencode ( $TABLE );
$i = 0 ;
foreach (( array ) $_GET [ " where " ] as $v ) {
if ( ! array_key_exists ( $v [ " col " ], $unique_array )) {
$link .= where_link ( $i ++ , $v [ " col " ], $v [ " val " ], $v [ " op " ]);
}
2010-05-25 09:39:13 +00:00
}
2013-08-06 21:55:56 +00:00
foreach ( $unique_array as $k => $v ) {
$link .= where_link ( $i ++ , $k , $v );
2010-05-25 09:39:13 +00:00
}
2009-10-02 14:25:18 +00:00
}
2013-08-06 21:55:56 +00:00
$val = select_value ( $val , $link , $field , $text_length );
2010-04-23 15:26:59 +00:00
$id = h ( " val[ $unique_idf ][ " . bracket_escape ( $key ) . " ] " );
2010-10-17 22:05:39 +00:00
$value = $_POST [ " val " ][ $unique_idf ][ bracket_escape ( $key )];
2013-08-06 21:55:56 +00:00
$editable = ! is_array ( $row [ $key ]) && is_utf8 ( $val ) && $rows [ $n ][ $key ] == $row [ $key ] && ! $functions [ $key ];
2013-07-24 23:26:41 +00:00
$text = preg_match ( '~text|lob~' , $field [ " type " ]);
2013-08-06 21:55:56 +00:00
if (( $_GET [ " modify " ] && $editable ) || $value !== null ) {
$h_value = h ( $value !== null ? $value : $row [ $key ]);
echo " <td> " . ( $text ? " <textarea name=' $id ' cols='30' rows=' " . ( substr_count ( $row [ $key ], " \n " ) + 1 ) . " '> $h_value </textarea> " : " <input name=' $id ' value=' $h_value ' size=' $lengths[$key] '> " );
} else {
$long = strpos ( $val , " <i>...</i> " );
echo " <td id=' $id ' onclick= \" selectClick(this, event, " . ( $long ? 2 : ( $text ? 1 : 0 )) . ( $editable ? " " : " , ' " . h ( lang ( 'Use edit link to modify this value.' )) . " ' " ) . " ); \" > $val " ;
}
2007-07-02 05:51:26 +00:00
}
}
2013-07-24 23:26:41 +00:00
2011-01-18 16:29:40 +00:00
if ( $backward_keys ) {
echo " <td> " ;
}
2009-09-23 14:28:06 +00:00
$adminer -> backwardKeysPrint ( $backward_keys , $rows [ $n ]);
2009-10-30 16:25:36 +00:00
echo " </tr> \n " ; // close to allow white-space: pre
2007-07-25 16:31:47 +00:00
}
2013-07-24 23:26:41 +00:00
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
exit ;
}
2007-09-03 11:12:38 +00:00
echo " </table> \n " ;
2010-04-21 12:01:32 +00:00
}
2013-07-24 23:26:41 +00:00
2012-09-07 07:51:43 +00:00
if (( $rows || $page ) && ! is_ajax ()) {
2010-04-21 12:01:32 +00:00
$exact_count = true ;
2013-07-04 01:40:55 +00:00
if ( $_GET [ " page " ] != " last " ) {
if ( !+ $limit ) {
$found_rows = count ( $rows );
} elseif ( $jush != " sql " || ! $is_group ) {
$found_rows = ( $is_group ? false : found_rows ( $table_status , $where ));
if ( $found_rows < max ( 1e4 , 2 * ( $page + 1 ) * $limit )) {
// slow with big tables
$found_rows = reset ( slow_query ( count_rows ( $TABLE , $where , $is_group , $group )));
} else {
$exact_count = false ;
}
2010-04-21 12:01:32 +00:00
}
2009-07-16 14:20:05 +00:00
}
2013-07-24 23:26:41 +00:00
2013-03-27 01:46:56 +00:00
if ( + $limit && ( $found_rows === false || $found_rows > $limit || $page )) {
2013-04-03 01:31:36 +00:00
echo " <p class='pages'> " ;
2010-04-22 12:37:56 +00:00
// display first, previous 4, next 4 and last page
2012-08-20 02:38:53 +00:00
$max_page = ( $found_rows === false
? $page + ( count ( $rows ) >= $limit ? 2 : 1 )
: floor (( $found_rows - 1 ) / $limit )
);
2014-01-09 08:06:59 +00:00
if ( $jush != " simpledb " ) {
2013-07-06 17:31:21 +00:00
echo '<a href="' . h ( remove_from_uri ( " page " )) . " \" onclick= \" pageClick(this.href, +prompt(' " . lang ( 'Page' ) . " ', ' " . ( $page + 1 ) . " '), event); return false; \" > " . lang ( 'Page' ) . " </a>: " ;
echo pagination ( 0 , $page ) . ( $page > 5 ? " ... " : " " );
for ( $i = max ( 1 , $page - 4 ); $i < min ( $max_page , $page + 5 ); $i ++ ) {
echo pagination ( $i , $page );
}
if ( $max_page > 0 ) {
echo ( $page + 5 < $max_page ? " ... " : " " );
echo ( $exact_count && $found_rows !== false
? pagination ( $max_page , $page )
: " <a href=' " . h ( remove_from_uri ( " page " ) . " &page=last " ) . " ' title='~ $max_page '> " . lang ( 'last' ) . " </a> "
);
}
echo (( $found_rows === false ? count ( $rows ) + 1 : $found_rows - $page * $limit ) > $limit
2013-12-19 20:44:15 +00:00
? ' <a href="' . h ( remove_from_uri ( " page " ) . " &page= " . ( $page + 1 )) . '" onclick="return !selectLoadMore(this, ' . ( + $limit ) . ', \'' . lang ( 'Loading' ) . '...\');">' . lang ( 'Load more data' ) . '</a>'
2013-07-06 17:31:21 +00:00
: ''
2013-04-25 04:22:30 +00:00
);
2013-07-06 17:31:21 +00:00
} else {
echo lang ( 'Page' ) . " : " ;
echo pagination ( 0 , $page ) . ( $page > 1 ? " ... " : " " );
echo ( $page ? pagination ( $page , $page ) : " " );
echo ( $max_page > $page ? pagination ( $page + 1 , $page ) . ( $max_page > $page + 1 ? " ... " : " " ) : " " );
2013-03-27 01:46:56 +00:00
}
2007-07-25 16:31:47 +00:00
}
2013-07-24 23:26:41 +00:00
2013-10-25 05:26:25 +00:00
echo " <p class='count'> \n " ;
2013-04-03 01:31:36 +00:00
echo ( $found_rows !== false ? " ( " . ( $exact_count ? " " : " ~ " ) . lang ( '%d row(s)' , $found_rows ) . " ) " : " " );
2013-07-11 23:34:14 +00:00
$display_rows = ( $exact_count ? " " : " ~ " ) . $found_rows ;
echo checkbox ( " all " , 1 , 0 , lang ( 'whole result' ), " var checked = formChecked(this, /check/); selectCount('selected', this.checked ? ' $display_rows ' : checked); selectCount('selected2', this.checked || !checked ? ' $display_rows ' : checked); " ) . " \n " ;
2013-07-24 23:26:41 +00:00
2011-05-24 15:16:13 +00:00
if ( $adminer -> selectCommandPrint ()) {
2010-04-23 15:26:59 +00:00
?>
2013-07-08 22:12:17 +00:00
< fieldset < ? php echo ( $_GET [ " modify " ] ? '' : ' class="jsonly"' ); ?> ><legend><?php echo lang('Modify'); ?></legend><div>
< input type = " submit " value = " <?php echo lang('Save'); ?> " < ? php echo ( $_GET [ " modify " ] ? '' : ' title="' . lang ( 'Ctrl+click on a value to modify it.' ) . '"' ); ?> >
</ div ></ fieldset >
2013-07-08 22:27:53 +00:00
< fieldset >< legend >< ? php echo lang ( 'Selected' ); ?> <span id="selected"></span></legend><div>
2010-11-23 10:50:53 +00:00
< input type = " submit " name = " edit " value = " <?php echo lang('Edit'); ?> " >
< input type = " submit " name = " clone " value = " <?php echo lang('Clone'); ?> " >
2013-07-12 00:02:14 +00:00
< input type = " submit " name = " delete " value = " <?php echo lang('Delete'); ?> " < ? php echo confirm (); ?> >
2010-04-23 15:26:59 +00:00
</ div ></ fieldset >
< ? php
}
2013-07-24 23:26:41 +00:00
2011-12-22 06:08:18 +00:00
$format = $adminer -> dumpFormat ();
2013-04-26 18:57:21 +00:00
foreach (( array ) $_GET [ " columns " ] as $column ) {
if ( $column [ " fun " ]) {
unset ( $format [ 'sql' ]);
break ;
}
}
2011-12-22 06:08:18 +00:00
if ( $format ) {
2013-07-10 17:12:58 +00:00
print_fieldset ( " export " , lang ( 'Export' ) . " <span id='selected2'></span> " );
2011-12-22 06:08:18 +00:00
$output = $adminer -> dumpOutput ();
echo ( $output ? html_select ( " output " , $output , $adminer_import [ " output " ]) . " " : " " );
echo html_select ( " format " , $format , $adminer_import [ " format " ]);
2012-05-14 09:16:10 +00:00
echo " <input type='submit' name='export' value=' " . lang ( 'Export' ) . " '> \n " ;
2011-12-22 06:08:18 +00:00
echo " </div></fieldset> \n " ;
}
2013-07-24 23:26:41 +00:00
2013-07-10 17:12:58 +00:00
echo ( ! $group && $select ? " " : " <script type='text/javascript'>tableCheck();</script> \n " );
2007-07-02 05:51:26 +00:00
}
2013-07-24 23:26:41 +00:00
2011-05-24 15:16:13 +00:00
if ( $adminer -> selectImportPrint ()) {
print_fieldset ( " import " , lang ( 'Import' ), ! $rows );
echo " <input type='file' name='csv_file'> " ;
2011-07-13 11:08:20 +00:00
echo html_select ( " separator " , array ( " csv " => " CSV, " , " csv; " => " CSV; " , " tsv " => " TSV " ), $adminer_import [ " format " ], 1 ); // 1 - select
2011-05-24 15:16:13 +00:00
echo " <input type='submit' name='import' value=' " . lang ( 'Import' ) . " '> " ;
echo " </div></fieldset> \n " ;
}
2013-07-24 23:26:41 +00:00
2009-09-09 20:47:42 +00:00
$adminer -> selectEmailPrint ( array_filter ( $email_fields , 'strlen' ), $columns );
2013-07-24 23:26:41 +00:00
2012-12-01 20:13:55 +00:00
echo " <p><input type='hidden' name='token' value=' $token '></p> \n " ;
2008-12-30 15:19:35 +00:00
echo " </form> \n " ;
2007-07-02 05:51:26 +00:00
}
}
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
2012-09-07 07:51:43 +00:00
ob_end_clean ();
2012-08-20 03:32:53 +00:00
exit ;
}