From: Jean-Marc Pigeon Date: Wed, 10 Dec 2025 20:17:47 +0000 (-0500) Subject: Addition de gestbl to work on data display X-Git-Tag: tag-0.19~12 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=e98fac1a8f45f745630a0a9055ab477cd2755756;p=jmp%2Fmailleur Addition de gestbl to work on data display --- diff --git a/www/chat3.php b/www/chat3.php new file mode 100644 index 0000000..9debfeb --- /dev/null +++ b/www/chat3.php @@ -0,0 +1,169 @@ +pdo = $pdo; + $this->table = $table; + $this->columns = $columns; + } + + public function fetchFiltered(array $selectedColumns, string $search, int $limit): array + { + if(empty($selectedColumns) || trim($search)===''){ + $sql = "SELECT * FROM {$this->table} ORDER BY creation DESC LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + $whereParts = []; + $params = []; + foreach($selectedColumns as $i => $col){ + if(!in_array($col,$this->columns,true)) continue; + $whereParts[] = "$col ILIKE :s$i"; + $params[":s$i"] = "%$search%"; + } + $where = implode(" OR ", $whereParts); + $sql = "SELECT * FROM {$this->table} WHERE $where ORDER BY creation DESC LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + foreach($params as $k=>$v) $stmt->bindValue($k,$v); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } +} + +/* ======================================================= + Gestion AJAX + ======================================================= */ +if(php_sapi_name()!=='cli' && isset($_POST['search'])){ + header("Content-Type: application/json"); + $pdo = new PDO("pgsql:host=localhost;dbname=mailleur","mailleur","mailleurpass", + [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); + $filter = new TableFilter($pdo,"actions",["remoteip","reverse","creation"]); + $selected = $_POST["columns"]??[]; + $search = $_POST["search"]??""; + $limit = (int)($_POST["limit"]??20); + $data = $filter->fetchFiltered($selected,$search,$limit); + echo json_encode($data); + exit; +} + +/* ======================================================= + Page HTML + ======================================================= */ +$lang = $_GET["lang"]??"en"; +$labels = ["en"=>["Remote IP","Reverse","Creation"],"fr"=>["IP distante","Reverse","Création"]]; +$colKeys = ["remoteip","reverse","creation"]; +$L = $labels[$lang]; +?> + + + + +Bigre Super-DB Paginated JMP + + + + + +
+ +
+ + +
+ + +
+ + + + + + $label): ?> + + + + + +
+ + + + + + diff --git a/www/chat4.php b/www/chat4.php new file mode 100644 index 0000000..91da797 --- /dev/null +++ b/www/chat4.php @@ -0,0 +1,192 @@ +pdo = $pdo; + $this->table = $table; + $this->columns = $columns; + } + + public function fetchFiltered(array $selectedColumns, string $search, int $limit): array + { + if(empty($selectedColumns)) $selectedColumns = $this->columns; + + if(trim($search)===''){ + $sql = "SELECT * FROM {$this->table} ORDER BY creation DESC LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + $whereParts = []; + $params = []; + foreach($selectedColumns as $i => $col){ + if(!in_array($col,$this->columns,true)) continue; + $key = ":s$i"; + $whereParts[] = "$col ILIKE $key"; + $params[$key] = "%$search%"; + } + + $where = implode(" OR ", $whereParts); + $sql = "SELECT * FROM {$this->table} WHERE $where ORDER BY creation DESC LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + + foreach($params as $k=>$v){ + $stmt->bindValue($k,$v,PDO::PARAM_STR); + } + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } +} + +/* ======================================================= + Gestion AJAX + ======================================================= */ +if(php_sapi_name()!=='cli' && isset($_POST['search'])){ + header("Content-Type: application/json"); + $pdo = new PDO("pgsql:host=localhost;dbname=mailleur","mailleur","mailleurpass", + [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); + $filter = new TableFilter($pdo,"actions",["remoteip","reverse","creation"]); + + $selected = $_POST["columns"]??[]; + if(empty($selected)) $selected = ["remoteip","reverse","creation"]; + + $search = $_POST["search"]??""; + $limit = (int)($_POST["limit"]??20); + $data = $filter->fetchFiltered($selected,$search,$limit); + echo json_encode(["rows"=>$data,"search"=>$search]); + exit; +} + +/* ======================================================= + Page HTML + ======================================================= */ +$lang = $_GET["lang"]??"en"; +$labels = ["en"=>["Remote IP","Reverse","Creation"],"fr"=>["IP distante","Reverse","Création"]]; +$colKeys = ["remoteip","reverse","creation"]; +$L = $labels[$lang]; +?> + + + + +Super-DB Paginated Highlight + + + + + +
+ +
+ + +
+ + +
+ + + + + + $label): ?> + + + + + +
+ + + + + + diff --git a/www/exetbl.php b/www/exetbl.php new file mode 100644 index 0000000..83a7faa --- /dev/null +++ b/www/exetbl.php @@ -0,0 +1,12 @@ +require_once 'TableFilter.php'; +$pdo = new PDO("pgsql:host=localhost;dbname=mailleur","mailleur","mailleurpass", [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION +]); + +$filter = new TableFilter($pdo, "actions", ["remoteip","reverse","creation"]); + +// Exemple simple : +$rows = $filter->fetchFiltered(["remoteip","reverse"], "localhost", 20); + +// Ensuite ton PHP construit son HTML/JS à partir de $rows + diff --git a/www/gestbl.php b/www/gestbl.php new file mode 100644 index 0000000..06391b1 --- /dev/null +++ b/www/gestbl.php @@ -0,0 +1,73 @@ +gestbl.php + Generic and autonomous class for Mailleur + ======================================================= */ +class TableFilter +{ + private PDO $pdo; + private string $table; + private array $columns; + + /** + * Constructor + * @param PDO $pdo PDO connection + * @param string $table Table name + * @param array $columns Columns available for filtering + */ + public function __construct(PDO $pdo, string $table, array $columns) + { + $this->pdo = $pdo; + $this->table = $table; + $this->columns = $columns; + } + + /** + * Fetch filtered rows from the table + * + * @param array $selectedColumns Columns to filter (subset of $this->columns) + * @param string $search Search text + * @param int $limit Number of rows to return + * @return array Associative array of rows + */ + public function fetchFiltered(array $selectedColumns, string $search = '', int $limit = 20): array + { + // If no columns selected, use all + if (empty($selectedColumns)) $selectedColumns = $this->columns; + + // If search is empty, just SELECT with LIMIT + if (trim($search) === '') { + $sql = "SELECT * FROM {$this->table} ORDER BY 1 LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + // Build WHERE clause for multiple columns + $whereParts = []; + $params = []; + foreach ($selectedColumns as $i => $col) { + if (!in_array($col, $this->columns, true)) continue; + $key = ":s$i"; + $whereParts[] = "$col ILIKE $key"; + $params[$key] = "%$search%"; + } + $where = implode(" OR ", $whereParts); + + // Prepare and execute statement + $sql = "SELECT * FROM {$this->table} WHERE $where ORDER BY 1 LIMIT :limit"; + $stmt = $this->pdo->prepare($sql); + + foreach ($params as $k => $v) { + $stmt->bindValue($k, $v, PDO::PARAM_STR); + } + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + + $stmt->execute(); + + // Return associative array + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } +} +