Files
t2000-steckerpruefer/pagecontent/database-search.php
2026-01-02 20:52:43 +01:00

323 lines
11 KiB
PHP
Executable File

<?php
// Diese Seite durchsucht die Datenbank nach gespeicherten Werten (keine Brücken, Programme, etc..)
$meta = $_GET["meta"];
$view = $_GET["view"];
$db = new SQLite3('../db-test/test.db');
// Die Suche, auf welche nach der Durchführung einer Messung zugegriffen wird (ganz unten: möchten Sie die Messung in die Datenbank aufnehmen...)
if($view == "results") {
?>
<div class="inventory-table">
<?php
$result = 0;
// Hole die Orte
$result = $db->query(" SELECT * FROM places WHERE name LIKE '%" . strtolower($meta) . "%' ");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
// Wenn die suche leer ist, sollen auch keine Ergebnisse kommen (siehe Vorschläge ignorieren)
if($meta == "") {
return;
}
?>
<div class="row" style="cursor: pointer" onclick="$('#database-search-term').val('<?php echo $row["name"]; ?>'); search('results');">
<img src="/vendor/icons/map-pin.svg" class="map" /><span><?php echo $row["name"]; ?></span>
</div>
<?php
}
// Wenn ein Ergebnis gefunden wird...
if($result == 1) {
// ... biete an, alle Vorschläge zu ignorieren
?>
<div class="row" style="cursor: pointer; width:50%;margin:15px auto;background-color: #f6615173" onclick="$('#database-search-term').attr('onkeyup',''); search('results','x');">
<img src="/vendor/icons/xmark.svg" class="" /><span align="center">Vorschläge ignorieren</span>
</div>
<?php
}
// Ende der Sucherergebnisse
?>
</div>
<?php
}
// Hier wird der Bestand angezeigt, der in der Bestandsuche nach einem Tastenanschlag erscheint
if($view == "program" && isset($meta) && !empty($meta)) {
// weil die Bestandssuche (im Gegensatz zur Ortssuche) die Programmbezeichnung durhcsucht, ist hier etwas mehr Aufwand erforderlich
// hole die Programmbezeichnung via 2x JOIN aus der Datenbank
$result = $db->query("
SELECT
m.id AS measurement_id,
m.comment AS comment,
m.timestamp AS timestamp,
m.place_name AS place_name,
b.value AS bit_value,
b.position AS bit_position
FROM
measurements m
JOIN places p ON p.name = m.place_name
JOIN measurement_program_id_bits b ON b.measurement_id = m.id
ORDER BY m.id
");
/*
Ausgabe sieht z.B. so aus:
| measurement_id | comment | timestamp | place_name | bit_value | bit_position |
| -------------- | ------- | --------- | ------------ | --------- | ------------ |
| 1 | xyz.. | 34535454 | Dudweiler Df | S | 0 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 1 |
| 1 | xyz.. | 34535454 | Dudweiler Df | 4 | 2 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 3 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 4 |
| 7 | abc.. | 48548574 | Mannheim Hbf | A | 0 |
| 7 | abc.. | 48548574 | Mannheim Hbf | 6 | 1 |
| 7 | abc.. | 48548574 | Mannheim Hbf | 4 | 2 |
| 7 | abc.. | 48548574 | Mannheim Hbf | - | 3 |
| 7 | abc.. | 48548574 | Mannheim Hbf | S | 4 |
*/
// Die Datenbank wird als dreifach indexiertes Array gespeichert
$database_db = [];
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$database_db[$row["place_name"]][$row["measurement_id"]]["program_id_bits"][$row["bit_position"]] = $row["bit_value"];
$database_db[$row["place_name"]][$row["measurement_id"]]["comment"] = $row["comment"];
$database_db[$row["place_name"]][$row["measurement_id"]]["timestamp"] = $row["timestamp"];
}
/*
$database_db
└── $row["place_name"]
└── $row["measurement_id"]
├── "program_id_bits"
│ └── $row["bit_position"]
│ └── $row["bit_value"]
├── "program_id_string"
│ └── implode('', $bits)
├── "comment"
│ └── $row["comment"]
└── "timestamp"
└── $row["timestamp"]
*/
// speichere die Bits als String, damit diese einfacher durchsuchbar sind
foreach ($database_db as $place => $entries) {
foreach ($entries as $index => $info) {
$bits = $info['program_id_bits'];
$database_db[$place][$index]['program_id_string'] = implode('', $bits);
}
}
// durchsuche nach der Query im Programm-ID-String
foreach($database_db as $place_name => $measurements) {
$found = false;
foreach ($measurements as $measurement_id => $measurement) {
if(str_contains(strtolower($measurement["program_id_string"]), strtolower($meta))) {
$found = true;
}
}
if($found != true) {
continue;
}
?>
<div class="row">
<img src="/vendor/icons/map-pin.svg" class="map" />
<span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <?php echo $place_name; ?>
</span>
<div class="plug-table" style="display: block;" id="<?php echo $database_db[$place_name]; ?>">
<?php
foreach ($measurements as $measurement_id => $measurement) {
if(!str_contains(strtolower($measurement["program_id_string"]), strtolower($meta))) {
continue;
}
print('
<div class="row">
<div class="label" style="width: 180px;">
<span>');
$i = 0;
foreach($measurement["program_id_bits"] as $programIDChar) {
echo '<span class="label-char">' . $programIDChar . '</span>';
$i++;
}
print('
</span>
</div>
<div>
<div class="label" style="width: 50%;">
<span>' . date("d.m.Y H:i:s", $measurement["timestamp"]) . '</span>
</div>');
?>
<div class="options">
<img src="/vendor/icons/trash.svg" onclick="if(confirm('Sicher? Diese Änderung kann nicht rückgängig gemacht werden! )') == true){save('inventory','remove','<?php echo $measurement_id; ?>')}">
</div>
<?php
print('
</div>
</div>');
if(!empty($measurement["comment"])) {
print('
<div class="row" style="position: relative; height: auto;padding: 0 15;padding-left: 40px;box-sizing:border-box;">
<img src="/vendor/icons/info-circle.svg" style=" top: 2.5px;left: 10px;" />');
echo $measurement["comment"];
print('
</div>');
}
}
?>
</div>
</div>
<?php
}
}
// Hier wird der Bestand angezeigt, der in der Bestandssuche nach dem Klick auf "Alle Einträge holen" angezeigt wird
elseif ($view == "program") {
/*
Ausgabe sieht z.B. so aus:
| measurement_id | comment | timestamp | place_name | bit_value | bit_position |
| -------------- | ------- | --------- | ------------ | --------- | ------------ |
| 1 | xyz.. | 34535454 | Dudweiler Df | S | 0 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 1 |
| 1 | xyz.. | 34535454 | Dudweiler Df | 4 | 2 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 3 |
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 4 |
| 7 | abc.. | 48548574 | Mannheim Hbf | A | 0 |
| 7 | abc.. | 48548574 | Mannheim Hbf | 6 | 1 |
| 7 | abc.. | 48548574 | Mannheim Hbf | 4 | 2 |
| 7 | abc.. | 48548574 | Mannheim Hbf | - | 3 |
| 7 | abc.. | 48548574 | Mannheim Hbf | S | 4 |
*/
$result = $db->query("
SELECT
m.id AS measurement_id,
m.comment AS comment,
m.timestamp AS timestamp,
m.place_name AS place_name,
b.value AS bit_value,
b.position AS bit_position
FROM
measurements m
JOIN places p ON p.name = m.place_name
JOIN measurement_program_id_bits b ON b.measurement_id = m.id
ORDER BY m.id
");
// Die Datenbank wird als dreifach indexiertes Array gespeichert
$database_db = [];
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$database_db[$row["place_name"]][$row["measurement_id"]]["program_id_bits"][$row["bit_position"]] = $row["bit_value"];
$database_db[$row["place_name"]][$row["measurement_id"]]["comment"] = $row["comment"];
$database_db[$row["place_name"]][$row["measurement_id"]]["timestamp"] = $row["timestamp"];
}
/*
$database_db
└── $row["place_name"]
└── $row["measurement_id"]
├── "program_id_bits"
│ └── $row["bit_position"]
│ └── $row["bit_value"]
├── "program_id_string"
│ └── implode('', $bits)
├── "comment"
│ └── $row["comment"]
└── "timestamp"
└── $row["timestamp"]
*/
foreach($database_db as $place_name => $measurements) {
?>
<div class="row">
<img src="/vendor/icons/map-pin.svg" class="map" /><span>[<?php echo count($database_db[$place_name]); ?>] <?php echo $place_name; ?></span>
<img src="/vendor/icons/arrow-down-tag.svg" class="down" onclick="$('#<?php echo preg_replace('/[^a-zA-Z0-9]/', '',$place_name); ?>').css('display','block');"/>
<div class="plug-table" style="display: none;" id="<?php echo preg_replace('/[^a-zA-Z0-9]/', '',$place_name); ?>">
<?php
foreach ($measurements as $measurement_id => $measurement) {
print('
<div class="row" style="margin-bottom: 0;">
<div class="label" style="width: 180px;">
<span>');
foreach($measurement["program_id_bits"] as $programIDChar) {
echo '
<span class="label-char">' . $programIDChar . '</span>';
}
print('
</span>
</div>
<div>
<div class="label" style="width: 50%;">
<span>' . date("d.m.Y H:i:s", $measurement["timestamp"]) . '</span>
</div>');
?>
<div class="options"><img src="/vendor/icons/trash.svg" onclick="if(confirm('Sicher? Diese Änderung kann nicht rückgängig gemacht werden! )') == true){save('inventory','remove','<?php echo $measurement_id; ?>')}"></div>
<?php
print('
</div>
</div>');
if(!empty($measurement["comment"])) {
print('
<div class="row" style="position: relative; height: auto;padding: 0 15;padding-left: 40px;box-sizing:border-box;"><img src="/vendor/icons/info-circle.svg" style=" top: 2.5px;left: 10px;" />');
echo $measurement["comment"];
print('
</div>');
}
}
?>
</div>
</div>
<?php
}
}