2007-07-02 05:51:26 +00:00
< ? php
2009-04-07 15:22:58 +00:00
$functions = array ( " char_length " , " from_unixtime " , " hex " , " lower " , " round " , " sec_to_time " , " time_to_sec " , " unix_timestamp " , " upper " );
2009-06-21 23:20:32 +00:00
$grouping = array ( " avg " , " count " , " distinct " , " group_concat " , " max " , " min " , " sum " ); // distinct is short for COUNT(DISTINCT)
2008-01-08 14:02:55 +00:00
$table_status = table_status ( $_GET [ " select " ]);
$indexes = indexes ( $_GET [ " select " ]);
2009-07-13 23:28:26 +00:00
$primary = null ; // empty array means that all primary fields are selected
foreach ( $indexes as $index ) {
if ( $index [ " type " ] == " PRIMARY " ) {
$primary = array_flip ( $index [ " columns " ]);
}
}
2008-09-23 09:57:01 +00:00
$operators = array ( " = " , " < " , " > " , " <= " , " >= " , " != " , " LIKE " , " REGEXP " , " IN " , " IS NULL " , " NOT LIKE " , " NOT REGEXP " , " NOT IN " , " IS NOT NULL " );
2008-10-15 10:39:20 +00:00
if ( eregi ( '^(MyISAM|Maria)$' , $table_status [ " Engine " ])) {
2008-01-08 14:02:55 +00:00
$operators [] = " AGAINST " ;
}
2007-07-06 13:03:13 +00:00
$fields = fields ( $_GET [ " select " ]);
2009-06-21 23:20:32 +00:00
$rights = array (); // privilege => 0
$columns = array (); // selectable columns
2007-08-24 16:00:10 +00:00
unset ( $text_length );
2007-07-06 13:03:13 +00:00
foreach ( $fields as $key => $field ) {
2007-07-09 06:12:22 +00:00
if ( isset ( $field [ " privileges " ][ " select " ])) {
2009-07-13 16:08:00 +00:00
$columns [ $key ] = html_entity_decode ( strip_tags ( adminer_field_name ( $fields , $key ))); //! numeric $key is problematic in optionlist()
2009-07-13 16:03:51 +00:00
if ( ereg ( 'text|blob' , $field [ " type " ])) {
2007-08-24 16:00:10 +00:00
$text_length = ( isset ( $_GET [ " text_length " ]) ? $_GET [ " text_length " ] : " 100 " );
}
2009-07-13 23:28:26 +00:00
if ( ! $_GET [ " columns " ]) {
unset ( $primary [ $key ]);
}
2007-07-06 13:03:13 +00:00
}
2007-07-09 06:12:22 +00:00
$rights += $field [ " privileges " ];
}
2009-06-21 23:20:32 +00:00
$select = array (); // select expressions, empty for *
$group = array (); // expressions without aggregation - will be used for GROUP BY if an aggregation function is used
2008-08-07 10:57:28 +00:00
foreach (( array ) $_GET [ " columns " ] as $key => $val ) {
2009-07-11 19:45:57 +00:00
if ( $val [ " fun " ] == " count " || ( isset ( $columns [ $val [ " col " ]]) && ( ! $val [ " fun " ] || in_array ( $val [ " fun " ], $functions ) || in_array ( $val [ " fun " ], $grouping )))) {
$select [ $key ] = ( isset ( $columns [ $val [ " col " ]]) ? ( $val [ " fun " ] ? ( $val [ " fun " ] == " distinct " ? " COUNT(DISTINCT " : strtoupper ( " $val[fun] ( " )) . idf_escape ( $val [ " col " ]) . " ) " : idf_escape ( $val [ " col " ])) : " COUNT(*) " );
2008-08-07 10:57:28 +00:00
if ( ! in_array ( $val [ " fun " ], $grouping )) {
$group [] = $select [ $key ];
}
2009-07-13 23:28:26 +00:00
if ( ! $val [ " fun " ]) {
unset ( $primary [ $val [ " col " ]]);
}
2008-08-07 10:57:28 +00:00
}
}
2009-07-13 23:28:26 +00:00
2009-06-21 23:20:32 +00:00
$where = array (); // where expressions - will be joined by AND
2008-01-08 14:02:55 +00:00
foreach ( $indexes as $i => $index ) {
if ( $index [ " type " ] == " FULLTEXT " && strlen ( $_GET [ " fulltext " ][ $i ])) {
2009-06-22 00:53:51 +00:00
$where [] = " MATCH ( " . implode ( " , " , array_map ( 'idf_escape' , $index [ " columns " ])) . " ) AGAINST ( " . $dbh -> quote ( $_GET [ " fulltext " ][ $i ]) . ( isset ( $_GET [ " boolean " ][ $i ]) ? " IN BOOLEAN MODE " : " " ) . " ) " ;
2008-01-08 14:02:55 +00:00
}
}
foreach (( array ) $_GET [ " where " ] as $val ) {
2008-10-09 12:10:28 +00:00
if ( strlen ( " $val[col] $val[val] " ) && in_array ( $val [ " op " ], $operators )) {
if ( $val [ " op " ] == " AGAINST " ) {
2009-06-22 00:53:51 +00:00
$where [] = " MATCH ( " . idf_escape ( $val [ " col " ]) . " ) AGAINST ( " . $dbh -> quote ( $val [ " val " ]) . " IN BOOLEAN MODE) " ;
2008-01-08 14:02:55 +00:00
} else {
2009-06-22 00:15:00 +00:00
$in = process_length ( $val [ " val " ]);
2009-07-02 21:30:25 +00:00
$cond = " $val[op] " . ( ereg ( 'NULL$' , $val [ " op " ]) ? " " : ( ereg ( 'IN$' , $val [ " op " ]) ? " ( " . ( strlen ( $in ) ? $in : " NULL " ) . " ) " : " " . $dbh -> quote ( $val [ " val " ])));
2008-10-09 12:10:28 +00:00
if ( strlen ( $val [ " col " ])) {
$where [] = idf_escape ( $val [ " col " ]) . $cond ;
} else {
2009-06-21 23:20:32 +00:00
// find anywhere
2008-10-09 12:10:28 +00:00
$cols = array ();
foreach ( $fields as $name => $field ) {
if ( is_numeric ( $val [ " val " ]) || ! ereg ( 'int|float|double|decimal' , $field [ " type " ])) {
$cols [] = $name ;
}
}
$where [] = ( $cols ? " ( " . implode ( " $cond OR " , array_map ( 'idf_escape' , $cols )) . " $cond ) " : " 0 " );
}
2008-01-08 14:02:55 +00:00
}
}
}
2009-07-13 23:28:26 +00:00
2009-06-21 23:20:32 +00:00
$order = array (); // order expressions - will be joined by comma
2008-01-08 14:02:55 +00:00
foreach (( array ) $_GET [ " order " ] as $key => $val ) {
2009-07-11 19:45:57 +00:00
if ( isset ( $columns [ $val ]) || in_array ( $val , $select , true )) {
2008-01-08 14:02:55 +00:00
$order [] = idf_escape ( $val ) . ( isset ( $_GET [ " desc " ][ $key ]) ? " DESC " : " " );
}
}
2009-07-13 23:28:26 +00:00
2008-01-08 14:02:55 +00:00
$limit = ( isset ( $_GET [ " limit " ]) ? $_GET [ " limit " ] : " 30 " );
2009-06-22 00:13:11 +00:00
$from = ( $select ? implode ( " , " , $select ) : " * " ) . " FROM " . idf_escape ( $_GET [ " select " ]) . ( $where ? " WHERE " . implode ( " AND " , $where ) : " " );
$group_by = ( $group && count ( $group ) < count ( $select ) ? " GROUP BY " . implode ( " , " , $group ) : " " ) . ( $order ? " ORDER BY " . implode ( " , " , $order ) : " " );
2008-01-08 14:02:55 +00:00
if ( $_POST && ! $error ) {
2009-07-13 23:28:26 +00:00
$where_check = " ( " . implode ( " ) OR ( " , array_map ( 'where_check' , $_POST [ " check " ])) . " ) " ;
2008-10-01 11:39:13 +00:00
if ( $_POST [ " export " ]) {
2008-08-18 15:18:16 +00:00
dump_headers ( $_GET [ " select " ]);
2008-08-18 22:40:45 +00:00
dump_table ( $_GET [ " select " ], " " );
2009-07-13 23:28:26 +00:00
if ( ! is_array ( $_POST [ " check " ]) || $primary === array ()) {
dump_data ( $_GET [ " select " ], " INSERT " , " SELECT $from " . ( is_array ( $_POST [ " check " ]) ? ( $where ? " AND " : " WHERE " ) . " ( $where_check ) " : " " ) . $group_by );
} 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
2009-07-11 19:45:57 +00:00
$union [] = " (SELECT $from " . ( $where ? " AND " : " WHERE " ) . where_check ( $val ) . $group_by . " LIMIT 1) " ;
2008-01-08 14:02:55 +00:00
}
2009-06-15 10:01:55 +00:00
dump_data ( $_GET [ " select " ], " INSERT " , implode ( " UNION ALL " , $union ));
2008-01-08 14:02:55 +00:00
}
2008-10-01 11:39:13 +00:00
exit ;
}
2009-07-11 19:45:57 +00:00
if ( $_POST [ " email " ]) {
$sent = 0 ;
if ( $_POST [ " all " ] || $_POST [ " check " ]) {
$field = idf_escape ( $_POST [ " email_field " ]);
2009-07-13 23:28:26 +00:00
$result = $dbh -> query ( " SELECT DISTINCT $field FROM " . idf_escape ( $_GET [ " select " ]) . " WHERE $field IS NOT NULL AND $field != '' " . ( $where ? " AND " . implode ( " AND " , $where ) : " " ) . ( $_POST [ " all " ] ? " " : " AND ( $where_check ) " ));
2009-07-11 19:45:57 +00:00
while ( $row = $result -> fetch_row ()) {
$sent += mail ( $row [ 0 ], email_header ( $_POST [ " email_subject " ]), $_POST [ " email_message " ], " MIME-Version: 1.0 \n Content-Type: text/plain; charset=utf-8 \n Content-Transfer-Encoding: 8bit " . ( $_POST [ " email_from " ] ? " \n From: " . email_header ( $_POST [ " email_from " ]) : " " ));
}
$result -> free ();
}
redirect ( remove_from_uri (), lang ( '%d e-mail(s) have been sent.' , $sent ));
} elseif ( ! $_POST [ " import " ]) { // edit
2008-12-30 15:19:35 +00:00
$result = true ;
$affected = 0 ;
$command = ( $_POST [ " delete " ] ? ( $_POST [ " all " ] && ! $where ? " TRUNCATE " : " DELETE FROM " ) : ( $_POST [ " clone " ] ? " INSERT INTO " : " UPDATE " )) . idf_escape ( $_GET [ " select " ]);
if ( ! $_POST [ " delete " ]) {
$set = array ();
foreach ( $fields as $name => $field ) {
$val = process_input ( $name , $field );
if ( $_POST [ " clone " ]) {
$set [] = ( $val !== false ? $val : idf_escape ( $name ));
} elseif ( $val !== false ) {
2009-07-13 22:20:46 +00:00
$set [] = idf_escape ( $name ) . " = $val " ;
2008-12-30 15:19:35 +00:00
}
}
2009-07-13 22:20:46 +00:00
$command .= ( $_POST [ " clone " ] ? " \n SELECT " . implode ( " , " , $set ) . " \n FROM " . idf_escape ( $_GET [ " select " ]) : " SET \n " . implode ( " , \n " , $set ));
2008-12-30 15:19:35 +00:00
}
2009-06-30 16:30:28 +00:00
if ( $_POST [ " delete " ] || $set ) {
2009-07-13 23:28:26 +00:00
if ( $_POST [ " all " ] || ( $primary === array () && $_POST [ " check " ])) {
$result = queries ( $command . ( $_POST [ " all " ] ? ( $where ? " \n WHERE " . implode ( " AND " , $where ) : " " ) : " \n WHERE $where_check " ));
2009-06-30 16:30:28 +00:00
$affected = $dbh -> affected_rows ;
} else {
foreach (( array ) $_POST [ " check " ] as $val ) {
2009-07-13 23:28:26 +00:00
// where is not unique so OR can't be used
2009-07-13 22:20:46 +00:00
$result = queries ( $command . " \n WHERE " . where_check ( $val ) . " \n LIMIT 1 " );
2009-06-30 16:30:28 +00:00
if ( ! $result ) {
break ;
}
$affected += $dbh -> affected_rows ;
2008-12-30 15:19:35 +00:00
}
2008-10-01 11:39:13 +00:00
}
}
2008-12-30 15:19:35 +00:00
query_redirect ( queries (), remove_from_uri ( " page " ), lang ( '%d item(s) have been affected.' , $affected ), $result , false , ! $result );
//! display edit page in case of an error
2009-04-16 13:18:22 +00:00
} elseif ( is_string ( $file = get_file ( " csv_file " ))) {
$file = preg_replace ( " ~^ \xEF \xBB \xBF ~ " , '' , $file ); //! character set
$cols = " " ;
$rows = array (); //! packet size
preg_match_all ( '~("[^"]*"|[^"\\n]+)+~' , $file , $matches );
foreach ( $matches [ 0 ] as $key => $val ) {
$row = array ();
preg_match_all ( '~(("[^"]*")+|[^,]*),~' , " $val , " , $matches2 );
if ( ! $key && ! array_diff ( $matches2 [ 1 ], array_keys ( $fields ))) { //! doesn't work with column names containing ",\n
2009-06-21 23:20:32 +00:00
// first row corresponds to column names - use it for table structure
2009-04-16 13:18:22 +00:00
$cols = " ( " . implode ( " , " , array_map ( 'idf_escape' , $matches2 [ 1 ])) . " ) " ;
} else {
foreach ( $matches2 [ 1 ] as $col ) {
2009-07-13 22:33:06 +00:00
$row [] = ( ! strlen ( $col ) ? " NULL " : $dbh -> quote ( str_replace ( '""' , '"' , preg_replace ( '~^"|"$~' , '' , $col ))));
2009-04-16 13:18:22 +00:00
}
2009-06-21 23:20:32 +00:00
$rows [] = " \n ( " . implode ( " , " , $row ) . " ) " ;
2009-04-16 13:18:22 +00:00
}
}
2009-06-21 23:20:32 +00:00
$result = queries ( " INSERT INTO " . idf_escape ( $_GET [ " select " ]) . " $cols VALUES " . implode ( " , " , $rows ));
2009-05-08 05:23:03 +00:00
query_redirect ( queries (), remove_from_uri ( " page " ), lang ( '%d row(s) has been imported.' , $dbh -> affected_rows ), $result , false , ! $result );
2009-04-16 13:18:22 +00:00
} else {
$error = lang ( 'Unable to upload a file.' );
2008-08-16 21:15:46 +00:00
}
2008-01-08 14:02:55 +00:00
}
2009-07-11 19:45:57 +00:00
page_header ( lang ( 'Select' ) . " : " . adminer_table_name ( $table_status ), $error );
2008-01-08 14:02:55 +00:00
2009-01-23 15:50:42 +00:00
echo " <p> " ;
2007-07-09 06:12:22 +00:00
if ( isset ( $rights [ " insert " ])) {
2007-07-15 10:56:40 +00:00
//! pass search values forth and back
2009-01-23 15:50:42 +00:00
echo '<a href="' . htmlspecialchars ( $SELF ) . 'edit=' . urlencode ( $_GET [ 'select' ]) . '">' . lang ( 'New item' ) . '</a> ' ;
2007-07-02 05:51:26 +00:00
}
2009-07-11 19:45:57 +00:00
echo adminer_select_links ( $table_status );
2007-07-02 05:51:26 +00:00
2007-07-06 13:03:13 +00:00
if ( ! $columns ) {
2009-07-11 20:30:40 +00:00
echo " <p class='error'> " . lang ( 'Unable to select the table' ) . ( $fields ? " " : " : " . htmlspecialchars ( $dbh -> error )) . " . \n " ;
2007-07-06 13:03:13 +00:00
} else {
2008-08-07 10:57:28 +00:00
echo " <form action='' id='form'> \n " ;
2009-06-15 09:35:21 +00:00
echo '<fieldset><legend><a href="#fieldset-select" onclick="return !toggle(\'fieldset-select\');">' . lang ( 'Select' ) . " </a></legend><div id='fieldset-select' " . ( $select ? " " : " class='hidden' " ) . " > \n " ;
2007-07-06 13:03:13 +00:00
if ( strlen ( $_GET [ " server " ])) {
2009-07-11 20:30:40 +00:00
echo '<input type="hidden" name="server" value="' . htmlspecialchars ( $_GET [ " server " ]) . '">' ;
2007-07-02 05:51:26 +00:00
}
2009-07-11 20:30:40 +00:00
echo '<input type="hidden" name="db" value="' . htmlspecialchars ( $_GET [ " db " ]) . '">' ;
echo '<input type="hidden" name="select" value="' . htmlspecialchars ( $_GET [ " select " ]) . '">' ;
2007-07-06 13:03:13 +00:00
echo " \n " ;
2008-08-07 10:57:28 +00:00
$i = 0 ;
$fun_group = array ( lang ( 'Functions' ) => $functions , lang ( 'Aggregation' ) => $grouping );
foreach ( $select as $key => $val ) {
$val = $_GET [ " columns " ][ $key ];
2009-07-11 20:30:40 +00:00
echo " <div><select name='columns[ $i ][fun]'><option> " . optionlist ( $fun_group , $val [ " fun " ]) . " </select> " ;
echo " <select name='columns[ $i ][col]'><option> " . optionlist ( $columns , $val [ " col " ]) . " </select></div> \n " ;
2008-08-07 10:57:28 +00:00
$i ++ ;
}
2009-07-11 20:30:40 +00:00
echo " <div><select name='columns[ $i ][fun]' onchange='this.nextSibling.onchange();'><option> " . optionlist ( $fun_group ) . " </select> " ;
echo " <select name='columns[ $i ][col]' onchange='select_add_row(this);'><option> " . optionlist ( $columns ) . " </select></div> \n " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
2007-07-06 13:03:13 +00:00
2009-06-15 09:35:21 +00:00
echo '<fieldset><legend><a href="#fieldset-search" onclick="return !toggle(\'fieldset-search\');">' . lang ( 'Search' ) . " </a></legend><div id='fieldset-search' " . ( $where ? " " : " class='hidden' " ) . " > \n " ;
2007-07-09 06:12:22 +00:00
foreach ( $indexes as $i => $index ) {
if ( $index [ " type " ] == " FULLTEXT " ) {
2007-07-14 07:15:05 +00:00
echo " (<i> " . implode ( " </i>, <i> " , array_map ( 'htmlspecialchars' , $index [ " columns " ])) . " </i>) AGAINST " ;
2009-07-11 20:30:40 +00:00
echo ' <input name="fulltext[' . $i . ']" value="' . htmlspecialchars ( $_GET [ " fulltext " ][ $i ]) . '">' ;
echo " <label><input type='checkbox' name='boolean[ $i ]' value='1' " . ( isset ( $_GET [ " boolean " ][ $i ]) ? " checked='checked' " : " " ) . " > " . lang ( 'BOOL' ) . " </label> " ;
echo " <br> \n " ;
2007-07-09 06:12:22 +00:00
}
}
2007-07-06 13:03:13 +00:00
$i = 0 ;
foreach (( array ) $_GET [ " where " ] as $val ) {
2008-10-09 12:10:28 +00:00
if ( strlen ( " $val[col] $val[val] " ) && in_array ( $val [ " op " ], $operators )) {
2009-07-11 20:30:40 +00:00
echo " <div><select name='where[ $i ][col]'><option value=''> " . lang ( '(anywhere)' ) . optionlist ( $columns , $val [ " col " ]) . " </select> " ;
2009-07-02 21:30:25 +00:00
echo " <select name='where[ $i ][op]'> " . optionlist ( $operators , $val [ " op " ]) . " </select> " ;
2009-07-11 20:30:40 +00:00
echo " <input name='where[ $i ][val]' value= \" " . htmlspecialchars ( $val [ " val " ]) . " \" ></div> \n " ;
2007-07-06 13:03:13 +00:00
$i ++ ;
}
}
2009-07-11 20:30:40 +00:00
echo " <div><select name='where[ $i ][col]' onchange='select_add_row(this);'><option value=''> " . lang ( '(anywhere)' ) . optionlist ( $columns ) . " </select> " ;
2009-07-02 21:30:25 +00:00
echo " <select name='where[ $i ][op]'> " . optionlist ( $operators ) . " </select> " ;
2009-07-11 20:30:40 +00:00
echo " <input name='where[ $i ][val]'></div> \n " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
echo '<fieldset><legend><a href="#fieldset-sort" onclick="return !toggle(\'fieldset-sort\');">' . lang ( 'Sort' ) . " </a></legend><div id='fieldset-sort' " . ( count ( $order ) > 1 ? " " : " class='hidden' " ) . " > \n " ;
$i = 0 ;
foreach (( array ) $_GET [ " order " ] as $key => $val ) {
2009-07-11 19:45:57 +00:00
if ( isset ( $columns [ $val ])) {
2009-07-11 20:30:40 +00:00
echo " <div><select name='order[ $i ]'><option> " . optionlist ( $columns , $val ) . " </select> " ;
echo " <label><input type='checkbox' name='desc[ $i ]' value='1' " . ( isset ( $_GET [ " desc " ][ $key ]) ? " checked='checked' " : " " ) . " > " . lang ( 'descending' ) . " </label></div> \n " ;
2009-06-15 09:35:21 +00:00
$i ++ ;
}
}
2009-07-11 20:30:40 +00:00
echo " <div><select name='order[ $i ]' onchange='select_add_row(this);'><option> " . optionlist ( $columns ) . " </select> " ;
echo " <label><input type='checkbox' name='desc[ $i ]' value='1'> " . lang ( 'descending' ) . " </label></div> \n " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
2007-07-06 13:03:13 +00:00
2009-06-21 23:20:32 +00:00
echo " <fieldset><legend> " . lang ( 'Limit' ) . " </legend><div> " ; // <div> for easy styling
2009-07-11 20:30:40 +00:00
echo " <input name='limit' size='3' value= \" " . htmlspecialchars ( $limit ) . " \" > " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
2007-07-06 13:03:13 +00:00
2007-07-11 10:22:59 +00:00
if ( isset ( $text_length )) {
2009-06-15 09:35:21 +00:00
echo " <fieldset><legend> " . lang ( 'Text length' ) . " </legend><div> " ;
2009-07-11 20:30:40 +00:00
echo " <input name='text_length' size='3' value= \" " . htmlspecialchars ( $text_length ) . " \" > " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
2007-07-11 10:22:59 +00:00
}
2009-06-15 09:35:21 +00:00
echo " <fieldset><legend> " . lang ( 'Action' ) . " </legend><div> " ;
2009-07-11 20:30:40 +00:00
echo " <input type='submit' value=' " . lang ( 'Select' ) . " '> " ;
2009-06-15 09:35:21 +00:00
echo " </div></fieldset> \n " ;
2007-07-06 13:03:13 +00:00
echo " </form> \n " ;
2009-06-22 00:13:11 +00:00
$query = " SELECT " . ( count ( $group ) < count ( $select ) ? " SQL_CALC_FOUND_ROWS " : " " ) . $from . $group_by . ( strlen ( $limit ) ? " LIMIT " . intval ( $limit ) . ( intval ( $_GET [ " page " ]) ? " OFFSET " . ( $limit * $_GET [ " page " ]) : " " ) : " " );
2009-07-11 19:52:48 +00:00
echo adminer_select_query ( $query );
2008-09-01 12:22:26 +00:00
2009-05-08 05:23:03 +00:00
$result = $dbh -> query ( $query );
2007-09-03 11:12:38 +00:00
if ( ! $result ) {
2009-07-11 20:30:40 +00:00
echo " <p class='error'> " . htmlspecialchars ( $dbh -> error ) . " \n " ;
2007-07-06 13:03:13 +00:00
} else {
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 " ;
2007-09-03 11:12:38 +00:00
if ( ! $result -> num_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 {
$foreign_keys = array ();
foreach ( foreign_keys ( $_GET [ " select " ]) as $foreign_key ) {
foreach ( $foreign_key [ " source " ] as $val ) {
$foreign_keys [ $val ][] = $foreign_key ;
}
2007-07-06 13:03:13 +00:00
}
2007-09-03 11:12:38 +00:00
2009-05-01 10:41:33 +00:00
echo " <table cellspacing='0' class='nowrap'> \n " ;
2007-09-03 11:12:38 +00:00
for ( $j = 0 ; $row = $result -> fetch_assoc (); $j ++ ) {
if ( ! $j ) {
2009-07-11 20:30:40 +00:00
echo '<thead><tr><td><input type="checkbox" id="all-page" onclick="form_check(this, /check/);">' ;
2008-05-27 14:31:39 +00:00
foreach ( $row as $key => $val ) {
2009-07-11 20:30:40 +00:00
echo '<th><a href="' . htmlspecialchars ( remove_from_uri ( '(order|desc)[^=]*' ) . '&order%5B0%5D=' . urlencode ( $key ) . ( $_GET [ " order " ] == array ( $key ) && ! $_GET [ " desc " ][ 0 ] ? '&desc%5B0%5D=1' : '' )) . '">' . adminer_field_name ( $fields , $key ) . '</a>' ;
2008-05-27 14:31:39 +00:00
}
2009-07-11 20:30:40 +00:00
echo " </thead> \n " ;
2007-09-03 11:12:38 +00:00
}
2009-06-22 00:13:11 +00:00
$unique_idf = implode ( '&' , unique_idf ( $row , $indexes )); //! don't use aggregation functions
2009-07-11 20:30:40 +00:00
echo '<tr' . odd () . '><td><input type="checkbox" name="check[]" value="' . $unique_idf . '" onclick="this.form[\'all\'].checked = false; form_uncheck(\'all-page\');">' . ( count ( $select ) != count ( $group ) || information_schema ( $_GET [ " db " ]) ? '' : ' <a href="' . htmlspecialchars ( $SELF ) . 'edit=' . urlencode ( $_GET [ 'select' ]) . '&' . $unique_idf . '">' . lang ( 'edit' ) . '</a>' );
2007-09-03 11:12:38 +00:00
foreach ( $row as $key => $val ) {
2009-07-11 19:45:57 +00:00
if ( strlen ( $val ) && ( ! isset ( $email_fields [ $key ]) || $email_fields [ $key ])) {
$email_fields [ $key ] = is_email ( $val ); //! filled e-mails may be contained on other pages
}
2007-09-03 11:12:38 +00:00
if ( ! isset ( $val )) {
$val = " <i>NULL</i> " ;
2009-07-13 16:03:51 +00:00
} elseif ( ereg ( 'blob|binary' , $fields [ $key ][ " type " ]) && ! is_utf8 ( $val )) { //! download link may be printed even with is_utf8
2008-01-08 14:02:55 +00:00
$val = '<a href="' . htmlspecialchars ( $SELF ) . 'download=' . urlencode ( $_GET [ " select " ]) . '&field=' . urlencode ( $key ) . '&' . $unique_idf . '">' . lang ( '%d byte(s)' , strlen ( $val )) . '</a>' ;
2007-08-24 16:00:10 +00:00
} else {
2009-06-21 23:41:28 +00:00
if ( ! strlen ( trim ( $val , " \t " ))) {
2009-06-11 11:17:53 +00:00
$val = " " ;
2009-07-13 16:03:51 +00:00
} elseif ( intval ( $text_length ) > 0 && ereg ( 'blob|text' , $fields [ $key ][ " type " ])) {
2009-07-12 18:47:57 +00:00
$val = nl2br ( shorten_utf8 ( $val , intval ( $text_length ))); // usage of LEFT() would reduce traffic but complicates query
2007-09-03 11:12:38 +00:00
} else {
$val = nl2br ( htmlspecialchars ( $val ));
if ( $fields [ $key ][ " type " ] == " char " ) {
$val = " <code> $val </code> " ;
}
2007-08-24 16:00:10 +00:00
}
2007-09-03 11:12:38 +00:00
foreach (( array ) $foreign_keys [ $key ] as $foreign_key ) {
if ( count ( $foreign_keys [ $key ]) == 1 || count ( $foreign_key [ " source " ]) == 1 ) {
2009-06-21 23:20:32 +00:00
// link related items
2007-09-03 11:12:38 +00:00
$val = " \" > $val </a> " ;
foreach ( $foreign_key [ " source " ] as $i => $source ) {
$val = " &where%5B $i %5D%5Bcol%5D= " . urlencode ( $foreign_key [ " target " ][ $i ]) . " &where%5B $i %5D%5Bop%5D=%3D&where%5B $i %5D%5Bval%5D= " . urlencode ( $row [ $source ]) . $val ;
}
$val = '<a href="' . htmlspecialchars ( strlen ( $foreign_key [ " db " ]) ? preg_replace ( '~([?&]db=)[^&]+~' , '\\1' . urlencode ( $foreign_key [ " db " ]), $SELF ) : $SELF ) . 'select=' . htmlspecialchars ( $foreign_key [ " table " ]) . $val ; // InnoDB supports non-UNIQUE keys
break ;
2007-07-06 13:03:13 +00:00
}
2007-07-02 15:52:15 +00:00
}
2007-07-02 05:51:26 +00:00
}
2009-07-11 20:30:40 +00:00
echo " <td> $val " ;
2007-07-02 05:51:26 +00:00
}
2007-07-25 16:31:47 +00:00
}
2007-09-03 11:12:38 +00:00
echo " </table> \n " ;
2008-09-01 10:25:29 +00:00
echo " <p> " ;
2009-06-21 23:20:32 +00:00
// use num_rows without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
2009-06-19 19:17:38 +00:00
$found_rows = ( intval ( $limit ) ? $dbh -> result ( $dbh -> query ( count ( $group ) < count ( $select )
? " SELECT FOUND_ROWS() " // space to allow mysql.trace_mode
: " SELECT COUNT(*) FROM " . idf_escape ( $_GET [ " select " ]) . ( $where ? " WHERE " . implode ( " AND " , $where ) : " " )
)) : $result -> num_rows );
2008-09-01 10:25:29 +00:00
if ( intval ( $limit ) && $found_rows > $limit ) {
2009-06-21 23:20:32 +00:00
// display first, previous 3, next 3 and last page
2007-09-03 11:12:38 +00:00
$max_page = floor (( $found_rows - 1 ) / $limit );
2008-09-01 10:25:29 +00:00
echo lang ( 'Page' ) . " : " ;
2009-06-21 23:32:25 +00:00
print_pagination ( 0 );
2007-09-03 11:12:38 +00:00
if ( $_GET [ " page " ] > 3 ) {
echo " ... " ;
}
for ( $i = max ( 1 , $_GET [ " page " ] - 2 ); $i < min ( $max_page , $_GET [ " page " ] + 3 ); $i ++ ) {
2009-06-21 23:32:25 +00:00
print_pagination ( $i );
2007-09-03 11:12:38 +00:00
}
if ( $_GET [ " page " ] + 3 < $max_page ) {
echo " ... " ;
}
2009-06-21 23:32:25 +00:00
print_pagination ( $max_page );
2007-07-25 16:31:47 +00:00
}
2009-07-11 20:30:40 +00:00
echo " ( " . lang ( '%d row(s)' , $found_rows ) . ') <label><input type="checkbox" name="all" value="1">' . lang ( 'whole result' ) . " </label> \n " ;
2008-09-01 12:22:26 +00:00
2009-07-13 22:18:53 +00:00
echo ( information_schema ( $_GET [ " db " ]) ? " " : " <fieldset><legend> " . lang ( 'Edit' ) . " </legend><div><input type='submit' name='edit' value=' " . lang ( 'Edit' ) . " '> <input type='submit' name='clone' value=' " . lang ( 'Clone' ) . " '> <input type='submit' name='delete' value=' " . lang ( 'Delete' ) . " ' $confirm ></div></fieldset> \n " );
2009-07-11 20:30:40 +00:00
echo " <fieldset><legend> " . lang ( 'Export' ) . " </legend><div> $dump_output $dump_format <input type='submit' name='export' value=' " . lang ( 'Export' ) . " '></div></fieldset> \n " ;
2007-07-02 05:51:26 +00:00
}
2007-09-03 11:12:38 +00:00
$result -> free ();
2009-07-11 20:30:40 +00:00
echo " <fieldset><legend> " . lang ( 'CSV Import' ) . " </legend><div><input type='hidden' name='token' value=' $token '><input type='file' name='csv_file'> <input type='submit' name='import' value=' " . lang ( 'Import' ) . " '></div></fieldset> \n " ;
2009-07-11 19:45:57 +00:00
//! Editor only
$email_fields = array_filter ( $email_fields );
if ( $email_fields ) {
echo '<fieldset><legend><a href="#fieldset-email" onclick="return !toggle(\'fieldset-email\');">' . lang ( 'E-mail' ) . " </a></legend><div id='fieldset-email' class='hidden'> \n " ;
2009-07-11 20:30:40 +00:00
echo " <p> " . lang ( 'From' ) . " : <input name='email_from'> \n " ;
echo lang ( 'Subject' ) . " : <input name='email_subject'> \n " ;
echo " <p><textarea name='email_message' rows='15' cols='60'></textarea> \n " ;
echo ( count ( $email_fields ) == 1 ? '<input type="hidden" name="email_field" value="' . htmlspecialchars ( key ( $email_fields )) . '">' : '<select name="email_field">' . optionlist ( array_keys ( $email_fields )) . '</select>' );
echo " <input type='submit' name='email' value=' " . lang ( 'Send' ) . " ' $confirm > \n " ;
2009-07-11 19:45:57 +00:00
echo " </div></fieldset> \n " ;
}
2008-12-30 15:19:35 +00:00
echo " </form> \n " ;
2007-07-02 05:51:26 +00:00
}
}