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-05-21 14:23:44 +00:00
$fields = fields ( $TABLE , 1 ); // 1 - hidden
2009-09-09 20:19:27 +00:00
$foreign_keys = column_foreign_keys ( $TABLE );
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 ));
2010-05-26 16:07:02 +00:00
if ( ereg ( 'text|lob' , $field [ " type " ])) {
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 );
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 ();
2010-05-14 13:51:54 +00:00
$from = ( $select ? implode ( " , " , $select ) : " * " ) . " \n FROM " . table ( $TABLE );
2010-03-11 20:11:31 +00:00
$group_by = ( $group && count ( $group ) < count ( $select ) ? " \n GROUP BY " . implode ( " , " , $group ) : " " ) . ( $order ? " \n ORDER BY " . implode ( " , " , $order ) : " " );
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 ;
}
}
2009-07-27 14:40:55 +00:00
foreach ( $select as $key => $val ) {
$val = $_GET [ " columns " ][ $key ];
if ( ! $val [ " fun " ]) {
2010-07-22 15:57:26 +00:00
unset ( $unselected [ $val [ " col " ]]);
2009-07-27 14:40:55 +00:00
}
}
2008-10-01 11:39:13 +00:00
if ( $_POST [ " export " ]) {
2009-08-29 13:57:50 +00:00
dump_headers ( $TABLE );
dump_table ( $TABLE , " " );
2009-08-25 14:11:15 +00:00
if ( $_POST [ " format " ] != " sql " ) { // Editor doesn't send format
2009-11-30 15:09:51 +00:00
$row = array_keys ( $fields );
if ( $select ) {
$row = array ();
foreach ( $select as $val ) {
2010-04-21 12:01:32 +00:00
$row [] = ( ereg ( '^`.*`$' , $val ) ? idf_unescape ( $val ) : $val ); //! columns looking like functions
2009-11-30 15:09:51 +00:00
}
}
dump_csv ( $row );
2009-08-25 14:11:15 +00:00
}
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 ) " ;
}
dump_data ( $TABLE , " INSERT " , " 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
}
2009-08-29 13:57:50 +00:00
dump_data ( $TABLE , " INSERT " , implode ( " UNION ALL " , $union ));
2008-01-08 14:02:55 +00:00
}
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 " ;
}
2010-07-22 15:57:26 +00:00
if ( $_POST [ " all " ] || ( $unselected === array () && $_POST [ " check " ]) || count ( $group ) < count ( $select )) {
2010-04-21 12:01:32 +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
}
2009-10-13 20:01:52 +00:00
queries_redirect ( remove_from_uri ( " page " ), lang ( '%d item(s) have been affected.' , $affected ), $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 " ]) {
$error = lang ( 'Double click on a value to modify it.' );
} 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
$set [] = idf_escape ( $key ) . " = " . $adminer -> processInput ( $fields [ $key ], $val );
}
2010-05-14 13:51:54 +00:00
$result = queries ( " UPDATE " . limit1 ( table ( $TABLE ) . " SET " . implode ( " , " , $set ), " WHERE " . where_check ( $unique_idf ) . ( $where ? " AND " . implode ( " AND " , $where ) : " " ))); // 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 ))) {
2009-07-24 10:52:24 +00:00
$file = preg_replace ( " ~^ \xEF \xBB \xBF ~ " , '' , $file ); //! character set
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-04-22 23:03:54 +00:00
$separator = ( $_POST [ " separator " ] == " csv " ? " , " : " ; " );
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 );
page_header ( lang ( 'Select' ) . " : $table_name " , $error );
2010-04-23 15:26:59 +00:00
session_write_close ();
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 {
2010-10-16 23:51:56 +00:00
echo " <form action='' id='form' onsubmit='return !ajaxForm(this);'> \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 );
$adminer -> selectActionPrint ( $text_length );
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-04-22 12:37:56 +00:00
$page = floor (( $found_rows - 1 ) / $limit );
}
2010-05-14 13:51:54 +00:00
$query = " SELECT " . limit (( intval ( $limit ) && $group && count ( $group ) < count ( $select ) && $jush == " sql " ? " SQL_CALC_FOUND_ROWS " : " " ) . $from , ( $where ? " \n WHERE " . implode ( " AND " , $where ) : " " ) . $group_by , ( $limit != " " ? intval ( $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 ();
2008-12-30 15:19:35 +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 ()) {
$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 " ) {
$found_rows = ( intval ( $limit ) && $group && count ( $group ) < count ( $select )
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
2009-12-17 13:22:28 +00:00
echo " <table cellspacing='0' class='nowrap' onclick='tableClick(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 );
2009-07-31 09:43:53 +00:00
$order = 1 ;
2009-07-14 10:06:35 +00:00
foreach ( $rows [ 0 ] as $key => $val ) {
2009-07-23 15:49:59 +00:00
$val = $_GET [ " columns " ][ key ( $select )];
2009-07-24 06:33:30 +00:00
$field = $fields [ $select ? $val [ " col " ] : $key ];
2009-07-27 16:51:40 +00:00
$name = ( $field ? $adminer -> fieldName ( $field , $order ) : " * " );
2010-01-09 23:33:41 +00:00
if ( $name != " " ) {
2009-07-27 16:51:40 +00:00
$order ++ ;
2009-07-23 15:49:59 +00:00
$names [ $key ] = $name ;
2010-10-16 23:51:56 +00:00
echo '<th><a href="' . h ( remove_from_uri ( '(order|desc)[^=]*|page' ) . '&order%5B0%5D=' . urlencode ( $key ) . ( $_GET [ " order " ][ 0 ] == $key && ! $_GET [ " desc " ][ 0 ] ? '&desc%5B0%5D=1' : '' )) . '" onclick="return !ajax(this.href);">' . apply_sql_function ( $val [ " fun " ], $name ) . " </a> " ; //! columns looking like functions
2009-07-21 13:59:02 +00:00
}
2010-04-26 16:20:39 +00:00
$functions [ $key ] = $val [ " fun " ];
2009-07-23 15:49:59 +00:00
next ( $select );
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 " ;
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 ) {
$unique_idf .= " & " . ( isset ( $val ) ? urlencode ( " where[ " . bracket_escape ( $key ) . " ] " ) . " = " . urlencode ( $val ) : " null%5B%5D= " . urlencode ( $key ));
}
2010-07-01 07:58:20 +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'); " ) . ( count ( $group ) < count ( $select ) || 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 );
2009-07-21 13:59:02 +00:00
if ( ! isset ( $val )) {
$val = " <i>NULL</i> " ;
2007-09-03 11:12:38 +00:00
} else {
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-01-09 23:33:41 +00:00
if ( $val == " " ) {
2009-07-21 13:59:02 +00:00
$val = " " ;
2010-01-09 23:33:41 +00:00
} elseif ( $text_length != " " && ereg ( 'text|blob' , $field [ " type " ]) && is_utf8 ( $val )) {
2010-02-15 14:30:54 +00:00
$val = shorten_utf8 ( $val , max ( 0 , intval ( $text_length ))); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
2009-07-21 13:59:02 +00:00
} else {
2009-10-13 19:43:33 +00:00
$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 ) {
if ( count ( $foreign_keys [ $key ]) == 1 || count ( $foreign_key [ " source " ]) == 1 ) {
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
2009-08-03 13:37:29 +00:00
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 ) {
2010-04-15 14:43:44 +00:00
$link .= h ( where_link ( $i ++ , $k , $v , ( isset ( $v ) ? " = " : " IS NULL " )));
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 ) . " ] " );
$value = $_POST [ " val " ][ $unique_idf ][ bracket_escape ( $key )];
$h_value = h ( isset ( $value ) ? $value : $row [ $key ]);
2010-05-20 21:05:25 +00:00
$long = strpos ( $val , " <i>...</i> " );
2010-04-26 16:20:39 +00:00
$editable = is_utf8 ( $val ) && ! $long && $rows [ $n ][ $key ] == $row [ $key ] && ! $functions [ $key ];
2010-05-26 16:07:02 +00:00
$text = ereg ( 'text|lob' , $field [ " type " ]);
2010-04-23 15:26:59 +00:00
echo (( $_GET [ " modify " ] && $editable ) || isset ( $value )
? " <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] '> " )
2010-05-28 16:59:57 +00:00
: " <td id=' $id ' ondblclick= \" " . ( $editable ? " selectDblClick(this, event " . ( $text ? " , 1 " : " " ) . " ) " : " alert(' " . h ( $long ? lang ( 'Increase text length to modify this value.' ) : 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
}
}
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
}
2007-09-03 11:12:38 +00:00
echo " </table> \n " ;
2010-04-21 12:01:32 +00:00
}
parse_str ( $_COOKIE [ " adminer_export " ], $adminer_export );
2010-04-22 12:37:56 +00:00
if ( $rows || $page ) {
2010-04-21 12:01:32 +00:00
$exact_count = true ;
2010-04-23 09:04:05 +00:00
if ( $_GET [ " page " ] != " last " && intval ( $limit ) && count ( $group ) >= count ( $select ) && ( $found_rows >= $limit || $page )) {
2010-04-21 12:01:32 +00:00
$found_rows = $table_status [ " Rows " ];
2010-04-22 12:37:56 +00:00
if ( ! isset ( $found_rows ) || $where || 2 * $page * $limit > $found_rows || ( $table_status [ " Engine " ] == " InnoDB " && $found_rows < 1e4 )) {
2010-04-21 12:01:32 +00:00
// slow with big tables
ob_flush ();
flush ();
2010-05-11 14:45:04 +00:00
$found_rows = $connection -> result ( " 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'> " ;
2008-09-01 10:25:29 +00:00
if ( intval ( $limit ) && $found_rows > $limit ) {
2010-04-22 12:37:56 +00:00
// display first, previous 4, next 4 and last page
2007-09-03 11:12:38 +00:00
$max_page = floor (( $found_rows - 1 ) / $limit );
2010-06-29 13:17:27 +00:00
echo '<a href="' . h ( remove_from_uri ( " page " )) . " \" onclick= \" var page = +prompt(' " . lang ( 'Page' ) . " ', ' " . ( $page + 1 ) . " '); if (!isNaN(page) && page) location.href = this.href + (page != 1 ? '&page=' + (page - 1) : ''); return false; \" > " . lang ( 'Page' ) . " </a>: " . 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
}
2010-04-22 12:37:56 +00:00
echo ( $page + 5 < $max_page ? " ... " : " " ) . ( $exact_count ? pagination ( $max_page , $page ) : ' <a href="' . h ( remove_from_uri () . " &page=last " ) . '">' . lang ( 'last' ) . " </a> " );
2007-07-25 16:31:47 +00:00
}
2010-04-21 12:01:32 +00:00
echo " ( " . ( $exact_count ? " " : " ~ " ) . lang ( '%d row(s)' , $found_rows ) . " ) " . checkbox ( " all " , 1 , 0 , lang ( 'whole result' )) . " \n " ;
2008-09-01 12:22:26 +00:00
2010-04-23 15:26:59 +00:00
if ( ! information_schema ( DB )) {
?>
< fieldset >< legend >< ? php echo lang ( 'Edit' ); ?> </legend><div>
2010-05-07 15:20:06 +00:00
< input type = " submit " value = " <?php echo lang('Save'); ?> " title = " <?php echo lang('Double click on a value to modify it.'); ?> " >
2010-04-23 15:26:59 +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/)) + ')'); " >
</ div ></ fieldset >
< ? php
}
2009-09-11 19:26:27 +00:00
print_fieldset ( " export " , lang ( 'Export' ));
2010-04-21 12:01:32 +00:00
echo $adminer -> dumpOutput ( 1 , $adminer_export [ " output " ]) . " " . $adminer -> dumpFormat ( 1 , $adminer_export [ " format " ]); // 1 - select
2009-10-02 12:21:55 +00:00
echo " <input type='submit' name='export' value=' " . lang ( 'Export' ) . " '> \n " ;
2009-09-11 19:26:27 +00:00
echo " </div></fieldset> \n " ;
2007-07-02 05:51:26 +00:00
}
2010-08-03 15:25:51 +00:00
print_fieldset ( " import " , lang ( 'CSV Import' ), ! $rows );
2010-04-21 12:01:32 +00:00
echo " <input type='hidden' name='token' value=' $token '><input type='file' name='csv_file'> " ;
2010-04-22 23:03:54 +00:00
echo html_select ( " separator " , array ( " csv " => " CSV, " , " csv; " => " CSV; " ), $adminer_export [ " format " ], 1 ); // 1 - select
2010-04-21 12:01:32 +00:00
echo " <input type='submit' name='import' value=' " . lang ( 'Import' ) . " '> \n " ;
2009-09-11 19:26:27 +00:00
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
}
}