2007-07-02 05:51:26 +00:00
< ? php
2009-08-29 13:57:50 +00:00
$TABLE = $_GET [ " select " ];
$table_status = table_status ( $TABLE );
$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 = " " ;
2011-02-01 15:19:39 +00:00
if ( $table_status [ " Oid " ] == " t " ) {
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 != " " ) {
2009-07-23 14:42:38 +00:00
$columns [ $key ] = html_entity_decode ( strip_tags ( $name ));
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 ();
2012-09-09 05:56:34 +00:00
$from = ( $select ? implode ( " , " , $select ) : " * " . ( $oid ? " , $oid " : " " ));
if ( $jush == " sql " ) {
foreach ( $columns as $key => $val ) {
$as = convert_field ( $fields [ $key ]);
if ( $as ) {
$from .= " , $as AS " . idf_escape ( $key );
}
}
}
$from .= " \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 )]);
echo $connection -> result ( " SELECT " . limit (( $as ? $as : idf_escape ( key ( $row ))) . " FROM " . table ( $TABLE ), " WHERE " . where_check ( $unique_idf ) . ( $where ? " AND " . implode ( " AND " , $where ) : " " ) . ( $order ? " ORDER BY " . implode ( " , " , $order ) : " " ), 1 ));
2010-10-18 11:57:22 +00:00
}
exit ;
}
2008-01-08 14:02:55 +00:00
if ( $_POST && ! $error ) {
2009-07-16 14:07:14 +00:00
$where_check = " ( " . implode ( " ) OR ( " , array_map ( 'where_check' , ( array ) $_POST [ " 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
}
}
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 ()) {
2010-05-14 13:51:54 +00:00
$where2 = $where ;
if ( is_array ( $_POST [ " check " ])) {
$where2 [] = " ( $where_check ) " ;
}
2011-02-15 16:22:50 +00:00
$query = " SELECT $from " . ( $where2 ? " \n WHERE " . implode ( " AND " , $where2 ) : " " ) . $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
2010-05-14 13:51:54 +00:00
$union [] = " (SELECT " . limit ( $from , " \n WHERE " . ( $where ? implode ( " AND " , $where ) . " AND " : " " ) . where_check ( $val ) . $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 ;
}
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 ;
2010-05-11 14:45:04 +00:00
$query = table ( $TABLE );
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 ]);
2010-04-21 12:01:32 +00:00
if ( $val !== null ) {
if ( $_POST [ " clone " ]) {
$set [ idf_escape ( $name )] = ( $val !== false ? $val : idf_escape ( $name ));
} elseif ( $val !== false ) {
$set [] = idf_escape ( $name ) . " = $val " ;
}
2009-07-24 10:52:24 +00:00
}
2008-12-30 15:19:35 +00:00
}
2010-05-11 14:45:04 +00:00
$query .= ( $_POST [ " clone " ] ? " ( " . implode ( " , " , array_keys ( $set )) . " ) \n SELECT " . implode ( " , " , $set ) . " \n FROM " . table ( $TABLE ) : " SET \n " . implode ( " , \n " , $set ));
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
$command = " UPDATE " ;
if ( $_POST [ " delete " ]) {
$command = " DELETE " ;
$query = " FROM $query " ;
}
if ( $_POST [ " clone " ]) {
$command = " INSERT " ;
$query = " INTO $query " ;
}
2012-09-09 04:54:35 +00:00
if ( $_POST [ " all " ] || ( $unselected === array () && $_POST [ " check " ]) || $is_group ) {
2012-07-28 00:37:04 +00:00
$result = queries ( " $command $query " . ( $_POST [ " all " ] ? ( $where ? " \n WHERE " . implode ( " AND " , $where ) : " " ) : " \n WHERE $where_check " ));
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
2010-05-14 13:51:54 +00:00
$result = queries ( $command . limit1 ( $query , " \n WHERE " . where_check ( $val )));
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 " );
}
}
queries_redirect ( remove_from_uri ( " page " ), $message , $result );
2009-07-24 10:52:24 +00:00
//! display edit page in case of an error
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
2010-10-17 20:37:06 +00:00
$set [] = idf_escape ( $key ) . " = " . ( ereg ( 'char|text' , $fields [ $key ][ " type " ]) || $val != " " ? $adminer -> processInput ( $fields [ $key ], $val ) : " NULL " );
2010-05-07 15:20:06 +00:00
}
2010-11-29 10:12:06 +00:00
$query = table ( $TABLE ) . " SET " . implode ( " , " , $set );
$where2 = " WHERE " . where_check ( $unique_idf ) . ( $where ? " AND " . implode ( " AND " , $where ) : " " );
2012-09-09 04:54:35 +00:00
$result = queries ( " UPDATE " . ( $is_group ? " $query $where2 " : limit1 ( $query , $where2 ))); // can change row on a different page without unique key
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
}
2009-08-28 11:49:57 +00:00
} elseif ( is_string ( $file = get_file ( " csv_file " , true ))) {
2011-03-07 13:27:03 +00:00
//! character set
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 ]);
2010-04-23 23:49:21 +00:00
begin ();
2010-10-29 16:02:20 +00:00
$separator = ( $_POST [ " separator " ] == " csv " ? " , " : ( $_POST [ " separator " ] == " tsv " ? " \t " : " ; " ));
2009-07-24 10:52:24 +00:00
foreach ( $matches [ 0 ] as $key => $val ) {
2010-04-21 12:01:32 +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
}
2010-07-22 15:57:26 +00:00
$result = insert_update ( $TABLE , $set , $primary );
2009-08-30 21:22:05 +00:00
if ( ! $result ) {
break ;
2009-08-20 15:05:35 +00:00
}
}
}
2010-02-24 13:12:21 +00:00
if ( $result ) {
2010-04-22 23:03:54 +00:00
queries ( " 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 );
2010-05-27 14:10:17 +00:00
queries ( " ROLLBACK " ); // after queries_redirect() to not overwrite error
2009-07-24 10:52:24 +00:00
} else {
$error = upload_error ( $file );
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 ()) {
2012-08-21 03:53:19 +00:00
// needs to send headers
2012-09-07 07:51:43 +00:00
ob_start ();
2012-08-20 03:32:53 +00:00
}
2009-09-08 20:55:17 +00:00
page_header ( lang ( 'Select' ) . " : $table_name " , $error );
2008-01-08 14:02:55 +00:00
2009-09-20 07:31:46 +00:00
$set = null ;
2007-07-09 06:12:22 +00:00
if ( isset ( $rights [ " insert " ])) {
2009-07-30 08:12:54 +00:00
$set = " " ;
foreach (( array ) $_GET [ " where " ] as $val ) {
if ( count ( $foreign_keys [ $val [ " col " ]]) == 1 && ( $val [ " op " ] == " = "
2009-09-25 14:52:30 +00:00
|| ( ! $val [ " op " ] && ! ereg ( '[_%]' , $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
2007-07-06 13:03:13 +00:00
if ( ! $columns ) {
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 " ;
2010-04-22 12:37:56 +00:00
$page = $_GET [ " page " ];
if ( $page == " last " ) {
2010-05-11 14:45:04 +00:00
$found_rows = $connection -> result ( " SELECT COUNT(*) FROM " . table ( $TABLE ) . ( $where ? " WHERE " . implode ( " AND " , $where ) : " " ));
2010-10-18 20:17:43 +00:00
$page = floor ( max ( 0 , $found_rows - 1 ) / $limit );
2010-04-22 12:37:56 +00:00
}
2012-08-24 05:17:44 +00:00
$query = $adminer -> selectQueryBuild ( $select , $where , $group , $order , $limit , $page );
if ( ! $query ) {
$query = " SELECT " . limit (
2012-09-09 04:54:35 +00:00
( + $limit && $group && $is_group && $jush == " sql " ? " SQL_CALC_FOUND_ROWS " : " " ) . $from ,
2012-08-24 05:17:44 +00:00
( $where ? " \n WHERE " . implode ( " AND " , $where ) : " " ) . $group_by ,
( $limit != " " ? + $limit : null ),
( $page ? $limit * $page : 0 ),
" \n "
);
}
2009-07-27 11:25:37 +00:00
echo $adminer -> selectQuery ( $query );
2008-09-01 12:22:26 +00:00
2009-09-22 10:51:40 +00:00
$result = $connection -> query ( $query );
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 {
2010-05-07 13:44:22 +00:00
if ( $jush == " mssql " ) {
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 ;
}
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
2010-04-23 09:04:05 +00:00
if ( $_GET [ " page " ] != " last " ) {
2012-09-09 04:54:35 +00:00
$found_rows = ( + $limit && $group && $is_group
2010-05-07 13:44:22 +00:00
? ( $jush == " sql " ? $connection -> result ( " SELECT FOUND_ROWS() " ) : $connection -> result ( " SELECT COUNT(*) FROM ( $query ) x " )) // space to allow mysql.trace_mode
2010-04-23 09:04:05 +00:00
: count ( $rows )
);
}
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 );
2009-07-15 14:56:27 +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 " ;
2010-07-01 07:58:20 +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 ( 'edit' ) . " </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 ];
2011-02-01 15:19:39 +00:00
$name = ( $field ? $adminer -> fieldName ( $field , $rank ) : " * " );
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(*)
2012-08-09 05:40:38 +00:00
echo ( ! $select || $val ? apply_sql_function ( $val [ " fun " ], $name ) : h ( current ( $select ))) . " </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
}
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 ))));
}
}
}
2009-09-23 14:28:06 +00:00
echo ( $backward_keys ? " <th> " . lang ( 'Relations' ) : " " ) . " </thead> \n " ;
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
if ( $limit % 2 == 1 && $page % 2 == 1 ) {
odd ();
}
ob_end_clean ();
}
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 );
2010-04-15 12:42:31 +00:00
$unique_idf = " " ;
foreach ( $unique_array as $key => $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> " ));
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
}
2009-07-21 16:22:42 +00:00
$link = " " ;
2009-09-25 14:52:30 +00:00
$val = $adminer -> editVal ( $val , $field );
2012-05-14 06:24:39 +00:00
if ( $val !== null ) {
2010-09-28 08:02:55 +00:00
if ( ereg ( 'blob|bytea|raw|file' , $field [ " type " ]) && $val != " " ) {
2010-04-02 12:13:56 +00:00
$link = h ( ME . 'download=' . urlencode ( $TABLE ) . '&field=' . urlencode ( $key ) . $unique_idf );
2009-07-24 10:14:36 +00:00
}
2010-11-29 10:12:06 +00:00
if ( $val === " " ) { // === - may be int
2009-07-21 13:59:02 +00:00
$val = " " ;
2012-05-14 06:24:39 +00:00
} elseif ( is_utf8 ( $val )) {
2012-09-22 14:34:51 +00:00
if ( $text_length != " " && is_shortable ( $field )) {
2012-05-14 06:24:39 +00:00
$val = shorten_utf8 ( $val , max ( 0 , + $text_length )); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
} else {
$val = h ( $val );
}
2007-09-03 11:12:38 +00:00
}
2009-07-21 13:59:02 +00:00
2009-08-03 13:37:29 +00:00
if ( ! $link ) { // link related items
foreach (( array ) $foreign_keys [ $key ] as $foreign_key ) {
2010-11-03 07:40:10 +00:00
if ( count ( $foreign_keys [ $key ]) == 1 || end ( $foreign_key [ " source " ]) == $key ) {
$link = " " ;
2009-08-03 13:37:29 +00:00
foreach ( $foreign_key [ " source " ] as $i => $source ) {
$link .= where_link ( $i , $foreign_key [ " target " ][ $i ], $rows [ $n ][ $source ]);
}
2010-01-09 23:33:41 +00:00
$link = h (( $foreign_key [ " db " ] != " " ? preg_replace ( '~([?&]db=)[^&]+~' , '\\1' . urlencode ( $foreign_key [ " db " ]), ME ) : ME ) . 'select=' . urlencode ( $foreign_key [ " table " ]) . $link ); // InnoDB supports non-UNIQUE keys
2010-11-03 07:40:10 +00:00
if ( count ( $foreign_key [ " source " ]) == 1 ) {
break ;
}
2009-07-21 13:59:02 +00:00
}
2007-09-03 11:12:38 +00:00
}
2007-07-06 13:03:13 +00:00
}
2010-04-02 12:13:56 +00:00
if ( $key == " COUNT(*) " ) { //! columns looking like functions
$link = h ( ME . " select= " . urlencode ( $TABLE ));
$i = 0 ;
2010-04-15 12:42:31 +00:00
foreach (( array ) $_GET [ " where " ] as $v ) {
if ( ! array_key_exists ( $v [ " col " ], $unique_array )) {
2010-05-12 14:17:32 +00:00
$link .= h ( where_link ( $i ++ , $v [ " col " ], $v [ " val " ], $v [ " op " ]));
2010-04-15 12:42:31 +00:00
}
}
foreach ( $unique_array as $k => $v ) {
2011-02-08 18:59:16 +00:00
$link .= h ( where_link ( $i ++ , $k , $v ));
2010-04-02 12:13:56 +00:00
}
}
2007-07-02 15:52:15 +00:00
}
2010-05-25 09:39:13 +00:00
if ( ! $link ) {
2010-10-16 13:47:51 +00:00
if ( is_mail ( $val )) {
2010-05-25 09:39:13 +00:00
$link = " mailto: $val " ;
}
if ( $protocol = is_url ( $row [ $key ])) {
$link = ( $protocol == " http " && $HTTPS
? $row [ $key ] // HTTP links from HTTPS pages don't receive Referer automatically
: " $protocol ://www.adminer.org/redirect/?url= " . urlencode ( $row [ $key ]) // intermediate page to hide Referer, may be changed to rel="noreferrer" in HTML5
);
}
2009-10-02 14:25:18 +00:00
}
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 )];
2012-05-14 06:54:07 +00:00
$h_value = h ( $value !== null ? $value : $row [ $key ]);
2010-05-20 21:05:25 +00:00
$long = strpos ( $val , " <i>...</i> " );
2010-10-18 11:57:22 +00:00
$editable = is_utf8 ( $val ) && $rows [ $n ][ $key ] == $row [ $key ] && ! $functions [ $key ];
2010-05-26 16:07:02 +00:00
$text = ereg ( 'text|lob' , $field [ " type " ]);
2012-05-14 06:54:07 +00:00
echo (( $_GET [ " modify " ] && $editable ) || $value !== null
2011-03-21 12:53:48 +00:00
? " <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] '> " )
2012-10-04 07:17:17 +00:00
: " <td id=' $id ' onclick= \" " . ( $editable ? " selectClick(this, event " . ( $long ? " , 2 " : ( $text ? " , 1 " : " " )) . " ) " : " alert(' " . h ( lang ( 'Use edit link to modify this value.' )) . " ') " ) . " ; \" > " . $adminer -> selectVal ( $val , $link , $field )
2010-04-23 15:26:59 +00:00
);
2007-07-02 05:51:26 +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
}
2012-08-20 03:32:53 +00:00
if ( is_ajax ()) {
exit ;
}
2007-09-03 11:12:38 +00:00
echo " </table> \n " ;
2011-08-11 11:48:27 +00:00
echo ( ! $group && $select ? " " : " <script type='text/javascript'>tableCheck();</script> \n " );
2010-04-21 12:01:32 +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 ;
2012-09-09 04:54:35 +00:00
if ( $_GET [ " page " ] != " last " && + $limit && ! $is_group && ( $found_rows >= $limit || $page )) {
2011-07-29 15:08:06 +00:00
$found_rows = found_rows ( $table_status , $where );
if ( $found_rows < max ( 1e4 , 2 * ( $page + 1 ) * $limit )) {
2010-04-21 12:01:32 +00:00
// slow with big tables
2012-08-20 04:55:00 +00:00
$found_rows = reset ( slow_query ( " SELECT COUNT(*) FROM " . table ( $TABLE ) . ( $where ? " WHERE " . implode ( " AND " , $where ) : " " )));
2010-04-21 12:01:32 +00:00
} else {
$exact_count = false ;
}
2009-07-16 14:20:05 +00:00
}
2009-10-28 12:21:21 +00:00
echo " <p class='pages'> " ;
2012-08-20 02:38:53 +00:00
if ( + $limit && ( $found_rows === false || $found_rows > $limit )) {
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 )
);
2010-11-12 16:31:18 +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>: " ;
2010-10-18 20:39:17 +00:00
echo pagination ( 0 , $page ) . ( $page > 5 ? " ... " : " " );
2010-04-22 12:37:56 +00:00
for ( $i = max ( 1 , $page - 4 ); $i < min ( $max_page , $page + 5 ); $i ++ ) {
echo pagination ( $i , $page );
2007-09-03 11:12:38 +00:00
}
2012-08-20 02:55:57 +00:00
echo ( $page + 5 < $max_page ? " ... " : " " ) . ( $exact_count && $found_rows !== false ? pagination ( $max_page , $page ) : ' <a href="' . h ( remove_from_uri ( " page " ) . " &page=last " ) . '">' . lang ( 'last' ) . " </a> " );
2007-07-25 16:31:47 +00:00
}
2012-08-20 15:25:20 +00:00
echo ( $found_rows !== false ? " ( " . ( $exact_count ? " " : " ~ " ) . lang ( '%d row(s)' , $found_rows ) . " ) " : " " );
echo ( + $limit && ( $found_rows === false ? count ( $rows ) + 1 : $found_rows - $page * $limit ) > $limit ? ' <a href="' . h ( remove_from_uri ( " page " ) . " &page= " . ( $page + 1 )) . '" onclick="return !selectLoadMore(this, ' . ( + $limit ) . ', \'' . lang ( 'Loading' ) . '\');">' . lang ( 'Load more data' ) . '</a>' : '' );
echo " " . checkbox ( " all " , 1 , 0 , lang ( 'whole result' )) . " \n " ;
2008-09-01 12:22:26 +00:00
2011-05-24 15:16:13 +00:00
if ( $adminer -> selectCommandPrint ()) {
2010-04-23 15:26:59 +00:00
?>
< fieldset >< legend >< ? php echo lang ( 'Edit' ); ?> </legend><div>
2012-10-04 07:17:17 +00:00
< input type = " submit " value = " <?php echo lang('Save'); ?> " < ? php echo ( $_GET [ " modify " ] ? '' : ' title="' . lang ( 'Ctrl+click on a value to modify it.' ) . '" class="jsonly"' ); ?> >
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'); ?> " >
< input type = " submit " name = " delete " value = " <?php echo lang('Delete'); ?> " onclick = " return confirm('<?php echo lang('Are you sure?'); ?> (' + (this.form['all'].checked ? <?php echo $found_rows ; ?> : formChecked(this, /check/)) + ')'); " >
2010-04-23 15:26:59 +00:00
</ div ></ fieldset >
< ? php
}
2011-12-22 06:08:18 +00:00
$format = $adminer -> dumpFormat ();
if ( $format ) {
print_fieldset ( " export " , lang ( 'Export' ));
$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 " ;
}
2007-07-02 05:51:26 +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 " <input type='hidden' name='token' value=' $token '> \n " ;
echo " </div></fieldset> \n " ;
}
2009-07-11 19:45:57 +00:00
2009-09-09 20:47:42 +00:00
$adminer -> selectEmailPrint ( array_filter ( $email_fields , 'strlen' ), $columns );
2009-07-11 19:45:57 +00:00
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 ;
}