Ich habe, weil ich gerade ein wenig Zeit hatte und die Möglichkeit für eine Finger- und Hirnübung sah, das von mir verstandene kurzerhand und sicher schlampig in ein Skript für die Konsole verpackt ($_GET und $_SESSION werden simuliert).
Je nach Plan ist es womöglich fast perfekt aber wahrscheinlich nicht... Vielleicht liefert Dir das ja Ansätze.
<?php
## Session für CLI simulieren:
#/*
if (is_readable('session.json') ) {
$_SESSION = json_decode(
file_get_contents( 'session.json' ),
JSON_OBJECT_AS_ARRAY
);
} else {
$_SESSION = [];
file_put_contents(
'session.json',
json_encode( [] )
);
}
#*/
## $_GET für CLI simulieren:
#/*
$_GET['showFoo']=1;
$_GET['showBar']=0;
$_GET['showBaz']=0;
$_GET['showTok']=1;
$_GET['sortFoo']=1;
$_GET['sortBar']=0;
$_GET['sortBaz']=0;
$_GET['sortTok']=-1;
$_GET['sortOrder']='Foo,Tok';
#*/
## Simulation:
## In der Realität die Spalten aus der Datenbank holen:
## "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table';"
$arColumns = ['Foo', 'Bar', 'Baz', 'Tok'];
## Programm ##################
if ( isset( $_SESSION['ShowColumns'] ) ) {
$arShowColumns = array_keys( $_SESSION['ShowColumns'] );
} else {
$arShowColumns = [];
}
$allowed = [1,0,-1];
foreach ( $arColumns as $column ) {
if ( isset( $_GET['show'.$column ] ) ) {
if ( ! in_array( $_GET['show'.$column], $allowed ) ) {
trigger_error(
'Wert '.$_GET['show'.$column].' in $_GET["show'.$column.'] ist nicht erlaubt.',
E_USER_ERROR
);
}
if ( 1 == $_GET['show'.$column ] ) {
$_SESSION['ShowColumns'][$column] = true;
} elseif ( 0 == $_GET['show'.$column ] ) {
unset( $_SESSION['ShowColumns'][$column] );
}
}
if ( isset( $_GET['sort'.$column ] ) ) {
if ( ! in_array( $_GET['sort'.$column], $allowed ) ) {
trigger_error(
'Wert '.$_GET['sort'.$column].' in $_GET["show'.$column.'] ist nicht erlaubt.',
E_USER_ERROR
);
}
if ( 1 == $_GET['sort'.$column ] ) {
$_SESSION['SortColumns'][$column] = 'ASC';
} elseif ( -1 == $_GET['sort'.$column ] ) {
$_SESSION['SortColumns'][$column] = 'DESC';
} else {
unset( $_SESSION['SortColumns'][$column] );
}
}
}
if ( isset($_GET['sortOrder'] ) ) {
$_SESSION['SortOrder']=[];
$sortOrder = explode( ',', $_GET['sortOrder'] );
foreach ($sortOrder as $item ) {
if (in_array( $item, $arColumns ) ) {
$_SESSION['SortOrder'][] = $item;
} else {
trigger_error(
'Wert '.$_GET['sort'.$column].' in $_GET["sortOrder."] ist nicht erlaubt.',
E_USER_ERROR
);
}
}
}
if ( ! isset( $_SESSION['SortOrder'] ) ) {
trigger_error(
'Wenn sortiert werden soll muss die sortOrder angegeeben werden',
E_USER_ERROR
);
}
file_put_contents(
'session.json',
json_encode( $_SESSION, JSON_PRETTY_PRINT )
);
echo file_get_contents('session.json');
# Welche Spalten sollen gezeigt werden?
$selects = [];
foreach ( array_keys( $_SESSION['ShowColumns'] ) as $key ) {
if ( $_SESSION['ShowColumns'][$key]) {
$selects[] = '`' . $key . '`';
}
}
# wie soll sortiert werden?
$sortOrders = array();
foreach( $_SESSION['SortOrder'] as $item ) {
if ( $_SESSION['SortColumns'][$item] == 'DESC' ) {
$sortOrders[] = '`' . $item . '` DESC' ;
} else {
$sortOrders[] = '`' . $item . '`' ;
}
}
if ( count( $sortOrders ) ) {
$orders = ' ORDER BY ' . implode( ', ', $sortOrders );
} else {
$orders = '';
}
$sql = 'SELECT ' . implode( ', ' , $selects ) . ' from `Tabelle`' . $orders;
echo PHP_EOL, $sql, PHP_EOL;