SD Karte für Raspberry Pi erstellen

Als erstes müssen wir die neue SD Karte formatieren. Das machen wir z.B. mit dem Festplattendienstprogramm unter MAC OS. Wir formatieren die SD Karte mit Extended FAT (FAT32).

Danach stecken wir die Karte in den Mac und checken als welche Disk die SD Karte erkannt wird. Bei mir ist es /dev/disk4.

bzimmer@BZ-Mac Raspi % 
.
.
.

/dev/disk4 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.9 GB     disk4
   1:             Windows_FAT_32 boot                    43.7 MB    disk4s1
   2:                      Linux                         7.9 GB     disk4s2
.
.
.

Bevor wir das Image auf die SD Karte mittels „dd“ schreiben, müssen wir /dev/disk4s1 unmounten.

bzimmer@BZ-Mac Raspi % diskutil unmount /dev/disk4s1
Volume boot on disk4s1 unmounted
bzimmer@BZ-Mac Raspi % sudo dd if=Raspi_Image_2021.img of=/dev/disk4

SSH Key Authentication

Wenn euer Server aus dem Internet erreichbar ist solltet ihr die SSH Authentication auf SSH Key umstellen. Hier zeige ich euch eine kurze Anleitung wie man das am Besten bewerkstelligt.

Wir benötigen drei Schritte um die Authentication auf Keys umzustellen.

  • SSH Key lokal generieren
  • Public Key auf deinen Server kopieren
  • SSH Agent konfigurieren

SSH Key generieren

user@myMacbook ~ % ssh-keygen -t rsa -b 4096 -C "myRaspis" -f .ssh/myRaspis_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/myRaspis_rsa.
Your public key has been saved in .ssh/myRaspis_rsa.pub.
The key fingerprint is:
SHA256:+8wmN/aTxbiqiii3+k9dO3fanpcXtTiOcb4yIIOTpp8 myRaspis
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|                 |
|                .|
|      o S    o. o|
|     * + + ..+oo |
|    + o * o B+...|
|. .+ .. .*=B++o .|
|.=+o+E...**=B+.. |
+----[SHA256]-----+

Während der Erstellung der Keys wird man nach einer Passphrase gefragt, diese sollte man definitiv vergeben. Es gibt im SSH Package ein kleines Programm ssh-agent, dieses kleine Programm nimmt uns das eingeben der Passphrase bei jedem Login ab. Später dazu mehr. Danach findet man in .ssh/ zwei neue Dateien:

user@myMacbook ~ % ls -l .ssh
-rw-------  1 bzimmer  staff   3414  4 Mai 21:51 myRaspis_rsa
-rw-r--r--  1 bzimmer  staff    734  4 Mai 21:51 myRaspis_rsa.pub

Die Datei myServer_rsa ist der private Schlüssel und sollte gut aufgehoben und nirgends hinkopiert werden, ausser in dein Keepass(x).

SSH Key auf Remote Server kopieren

Die Datei myServer_rsa.pub ist der public Key und wird auf all deine Server kopiert. Dies kann man zum einen per ssh-copy-id oder ganz klassisch, den Inhalt vom public Key auf den Servern in die Datei .ssh/authorized_keys einfügen.

user@myMacbook ~ % ssh-copy-id -i .ssh/myRaspis_rsa.pub pi@192.168.21.56
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/myRaspis_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
pi@192.168.21.56's password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'pi@192.168.21.56'"
and check to make sure that only the key(s) you wanted were added.

Nun müsste auf dem Server in der Datei .ssh/authorized_keys der public Key enthalten sein. Man sollte so etwas ähnliches hier sehen:

pi@raspi-sp1: ~ $ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1........SS5XYCRbhdQ== myRaspis

Nun kann man sich per ssh pi@192.168.21.56 und Key authentication auf dem Server einloggen.

user@myMacbook ~ % ssh pi@192.168.21.56 -i .ssh/myRaspis_rsa
Enter passphrase for key '.ssh/myRaspis_rsa':

pi@raspi-sp1: ~ $

Die Option -i .ssh/myRaspis_rsa ist nur notwendig, da wir ganz am Anfang die erzeugten Keys in die Dateien .ssh/myRaspis_rsa und .ssh/myRaspis_rsa.pub geschrieben haben. Standardmäßig werden die Dateien .ssh/id_rsa und .ssh/id_rsa.pub erzeugt. Diese werden dann auch beim verbinden standardmäßig ausgewählt.

SSH Agent konfigurieren

Nun wollen wir das lästige eingeben der Passphrase noch irgendwie umgehen. Dazu haben die Entwickler von SSH das Programm ssh-agent entwickelt. Mit ssh-add -L kann man checken ob der Agent die Keys schon geladen hat. Dies wird wahrscheinlich beim ersten Mal nicht der Fall sein. Um die Keys zu laden führt man den Befehl ssh-add aus, danach wird man für jeden vorhandenen Public Key nach der Passphrase gefragt, die dann in der lokalen keychain abgelegt wird.

user@myMacbook ~ % ssh-add -L
The agent has no identities.
# Alle Keys laden und Passphrase in Keychain eintragen
user@myMacbook ~ % ssh-add
Enter passphrase for /home/user/.ssh/myRaspis_rsa:
Identity added: /home/user/.ssh/myRaspis_rsa (/home/user/.ssh/myRaspis_rsa)

# Nun sollte man hier alle geladenen Keys sehen
user@myMacbook ~ % ssh-add -L
ssh-rsa AAAAB3Nza..............FTcrMMZS0OzKlQ== myRaspis

Beim nächsten ssh login kann man sich ohne Eingabe der Passphrase einloggen. Als allerletztes kann man jetzt in der /etc/ssh/sshd_config das Login per Password verbieten in dem man die Password Authentication auf NO setzt: PasswordAuthentication no.

Nun müsste man jedesmal bevor man sich auf diesem/diesen Servern einloggt alle Keys laden mit ssh-add. Um dies zu umgehen müssen wir die Datei ~/.ssh/config erstellen, wenn noch nicht vorhanden. In diese Datei müssen wir folgende Sequenz einfügen:

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/myRaspis_rsa

Danach müssen wir den Mac einmal neustarten und wir brauchen beim SSH Login keine Passphrase mehr eingeben.

Zusammenfassung

Hier nochmal alles in Kürze und mit Standardwerten, also ohne die oben angegebenen „myRaspis_rsa“ und „myRaspis_rsa.pub“.

# Keys erzeugen
ssh-keygen -t rsa -b 4096 -C "myRaspis"

# public Keys auf remote Server kopieren
ssh-copy-id pi@192.168.21.56

# SSH Keys in den SSH Agent laden
ssh-add

# Config Datei auf Macbook anlegen
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

# auf dem Server die PasswordAuthentication abschalten 
PasswordAuthentication no

zweites Dropdown Menü abhängig vom ersten Dropdown anzeigen

Hier will ich euch mal zeigen, wie ich mir eine Navigation mit zwei Dropdown Menüs gebaut habe. Anforderung war allerdings, dass das zweite Dropdown Menü sich abhängig von der Auswahl des ersten Dropdown Menüs ändern soll. Im ersten Dropdown Menü lasse ich mir alle Router anzeigen die in der Datenbank stehen. Wenn ich einen Router ausgewählt habe, soll das zweite Dropdown Menü eingeblendet werden und nur die Interfaces auswählbar sein, die am Router verfügbar sind.

Ich habe hier meine altbewährte Mysql Tabelle „router“ genommen und noch eine zweite Tabelle „interfaces“ erstellt.

-- Tabelle "interfaces" erstellen und befüllen

CREATE TABLE `interfaces` (
  `if_id` int(11) NOT NULL,
  `rtr_id` int(11) NOT NULL,
  `ifname` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Daten für Tabelle `interfaces`
--

INSERT INTO `interfaces` (`if_id`, `rtr_id`, `ifname`) VALUES
(1, 1, 'TenGigE0/1/0/0'),
(2, 1, 'TenGigE0/1/0/1'),
(3, 1, 'TenGigE0/1/0/2'),
(4, 1, 'TenGigE0/1/0/3'),
(5, 2, 'TenGigE0/2/0/0'),
(6, 2, 'TenGigE0/2/0/1'),
(7, 2, 'TenGigE0/2/0/2'),
(8, 2, 'TenGigE0/2/0/3'),
(9, 3, 'TenGigE0/3/0/0'),
(10, 3, 'TenGigE0/3/0/1'),
(11, 3, 'TenGigE0/3/0/2'),
(12, 3, 'TenGigE0/3/0/3'),
(13, 4, 'TenGigE0/4/0/0'),
(14, 4, 'TenGigE0/4/0/1'),
(15, 4, 'TenGigE0/4/0/2'),
(16, 4, 'TenGigE0/4/0/3'),
(17, 5, 'TenGigE0/5/0/0'),
(18, 5, 'TenGigE0/5/0/1'),
(19, 5, 'TenGigE0/5/0/2'),
(20, 5, 'TenGigE0/5/0/3'),
(21, 6, 'TenGigE0/6/0/0'),
(22, 6, 'TenGigE0/6/0/1'),
(23, 6, 'TenGigE0/6/0/2'),
(24, 6, 'TenGigE0/6/0/3'),
(25, 7, 'TenGigE0/7/0/0'),
(26, 7, 'TenGigE0/7/0/1'),
(27, 7, 'TenGigE0/7/0/2'),
(28, 7, 'TenGigE0/7/0/3'),
(29, 8, 'TenGigE0/8/0/0'),
(30, 8, 'TenGigE0/8/0/1'),
(31, 8, 'TenGigE0/8/0/2'),
(32, 8, 'TenGigE0/8/0/3');

-- Tabelle "router" erstellen und befüllen

CREATE TABLE `router` (
  `id` int(11) NOT NULL,
  `routername` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Daten für Tabelle `router`
--

INSERT INTO `router` (`id`, `routername`) VALUES
(1, 'router1'),
(2, 'router2'),
(3, 'router3'),
(4, 'router4'),
(5, 'router5'),
(6, 'router6'),
(7, 'router7'),
(8, 'router8');

Zur Erklärung, in der Tabelle „interfaces“ gibt es eine Spalte „rtr_id“, das ist die „id“ aus der Tabelle „router“. Router 4 hat die id=4, somit gehören alle Interfaces aus der Tabelle „interfaces“ dem Router 4, wo die „rtr_id“ = 4 ist. Zur Vereinfachung haben alle Interfaces als zweite Zahl die Nummer des Routers (Router 4 = TenGigE0/4/x/y).

Ich habe mir nun eine PHP Script „inc.functions.php“ erstellt in dem ich all meine PHP Funktionen reinschreibe. Wir müssen in zwei PHP Scripten die DB Verbindung aufbauen und ich habe jeweils eine Funktion für die Dropdown Menüs geschrieben. Dieses Script include ich in jeder anderen PHP Datei.

<?php

// Verbindung zur Mysql DB herstellen
function db_connect() {

    //database Production credentials
    define('DBHOST', 'localhost');
    define('DBUSER', 'testingdb_admin');
    define('DBPASS', 'secure');
    define('DBNAME', 'testingdb');
    try {

        //create PDO connection
        $db = new PDO("mysql:host=" . DBHOST . ";dbname=" . DBNAME, DBUSER, DBPASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"));
        echo 'Verbunden mit ' . DBNAME . '!';
    } catch (PDOException $e) {
        //show error
        echo '<p class="error">' . $e->getMessage() . '</p>';
        exit;
    }
    return $db;
}

// Dropdown Menü fur Router erstellen
function createDropDownRouter($id) {

    // Funktion erzeugt ein Dropdown Menu aus der DB
    try {
        $statement = db_connect()->prepare("SELECT * FROM router;");
        $statement->execute();
        $router = $statement->fetchAll(PDO::FETCH_ASSOC);
        
    } catch (PDOException $e) {
        echo '<p class="error">' . $e->getMessage() . '</p>';
    }
    for ($i = 0; $i < count($router); $i++) {
        if (!isset($id) || empty($id)) {
            echo '<option value="' . $router[$i]['id'] . '">' . $router[$i]['routername'] . '</option>';
        } else {
            echo '<option value="' . $router[$i]['id'] . '" ' . ($router[$i]['id'] == $id ? "selected" : "") . ' >' . $router[$i]['routername'] . '</option>';
        }
    }
}

// Dropdown Menü für Interfaces erstellen
function createDropDownInterfaces($if) {

    // Funktion erzeugt ein Dropdown Menu aus der DB
    try {
        $statement = db_connect()->prepare("SELECT * FROM interfaces WHERE rtr_id='" . $if . "';");
        $statement->execute();
        $interface = $statement->fetchAll(PDO::FETCH_ASSOC);
        
    } catch (PDOException $e) {
        echo '<p class="error">' . $e->getMessage() . '</p>';
    }
    for ($i = 0; $i < count($interface); $i++) {
        echo '<option value="' . $interface[$i]['if_id'] . '" ' . ($interface[$i]['if_id'] == $id ? "selected" : "") . ' >' . $interface[$i]['ifname'] . '</option>';
    }
}

Nun erstellen wir uns eine HTML Seite mit einem Formular in dem zunächst nur das Dropdown Menü für die Router und der Submit Button angezeigt werden. Des Weiteren erstellen wir noch einen DIV Container „interfaces“ für das Dropdown Menü interfaces und einen DIV Container „wait“ für die Lade Grafik. Da wir das Dropdown Menü „router“ abschicken müssten um das Dropdown Menü „interfaces“ zu erstellen machen wir das ganze mit Ajax. Wir rufen per Ajax Post Request das Script „interfaces.php“ auf. Wenn der Ajax Request abgeschickt wurde blenden wir die Lade Grafik, das Dropdown Menü „interfaces“ und den Submit Button ein. Wenn das Dropdown Menü „router“ ein zweites Mal betätigt wird, blenden wir das Dropdown Menü „interfaces“ und den Submit Button wieder aus. Dann wird der Ajax Post Request abgeschickt, und wir blenden die Lade Grafik aus und den Rest wieder ein.

<?php
include_once 'inc.functions.php';
?>
<!-- Dropdown Menü interfaces -->
<select name = "interfaces">
    <option value = "" > W&auml;hle ...</option>
    <?php createDropDownInterfaces($_POST['wert']);
    ?>
</select>


Das PHP Script mit dem „router“ Dropdown Menü.

<?php
// HTML Header und jquery includen
include_once 'inc.header.php';
// PHP Funktionen includen
include_once 'inc.functions.php';

if (!empty($_POST['router'])) {
    $id = $_POST['router'];
} else {
    $id = '';
}
?>
<form method="POST">
    <table>
        <td>
            <div class="router_select">
                <select name="router">
                    <option value="">W&auml;hle ...</option>
                    <?php createDropDownRouter($id); ?>
                </select>
            </div>
        </td>
        <td>
            <div id="wait" style="display: none;">
                <img alt="Please Wait" src="ajax-loader.gif"/>
            </div>
            <div id="interfaces" style="display: none;">
            </div>
        </td>
        <td>
            <input name="senden" type="submit" value="Senden">
        </td>
    </table>
</form>

Nun kommt noch die ganze Jquery Logik dazu, die dieses Vorhaben ermöglicht. Die Zeile 5 in der Java Script Datei bräuchte man normalerweise nicht, wenn man den Submit Button in der router.php per default ausblendet (style=“display: none;“). Ich wollte hier nur mal die verschiedenen Möglichkeiten aufzeigen.

            $(document).ready(function () {
                // Submit Button nach dem Aufrufen der Seite erstmal ausblenden
                // bräuchte man nicht, wenn man "style="display: none;" dem Submit Button hinzufügt
                $('input[name = "senden"]').hide();
                $('.router_select').change(function () {
                    // Wenn man das Router Menü schon mal bedient hat und es ein zweites Mal macht,
                    // müssen das Menü Interfaces und der Submit Button wieder ausgeblendet werden
                    $('#interfaces').hide();
                    $('input[name = "senden"]').hide();
                    // Loading Grafik anzeigen
                    $('#wait').show();
                    // Sending AJAX request
                    $.ajax({
                        url: 'interfaces.php',
                        type: 'post',
                        data: {
                            // wert wird als $_POST['wert'] an die interfaces.php geschickt
                            wert: $('.router_select option:selected').val()
                        },
                        success: function (data) {
                            // Daten von interfaces.php anzeigen
                            $('#interfaces').html(data);
                            // Loading Grafik anzeigen und nach 1,5s ausblenden
                            $('#wait').fadeOut(1500);
                            // DIV interfaces nach 1,5s einblenden
                            $('#interfaces').delay(1500).fadeIn(2000);
                            // Submit Button nach 1,6s einblenden
                            $('input[name = "senden"]').delay(1600).fadeIn(2000);
                        }
                    });
                });
            }
            );

Anbei ein paar Bilder wie das Menü aussieht, das erste ist der Ausgangszustand, es wird nur ein Dropdown Menü gezeigt, dann das Bild mit der Ladegrafik, dann sieht man wie das zweite Dropdown Menü und der Submit Button eingeblendet. Als letztes sieht man die Auswahl der verfügbaren Interfaces am Router1. Hübsch machen müsst ihr das Menü selber. 🙂

So sieht es mit bewegten Bildern aus. 🙂

Mysql und MysqlDump Befehle

Ich habe hier mal eine kleine Übersicht der gängigsten Mysql und Mysqldump Befehle erstellt, da ich diese auch immer wieder brauche.

Datenbank erzeugen und User für diese Datenbank anlegen.

-- DB erstellen
CREATE DATABASE testingdb;

-- User erstellen
CREATE USER 'testingdb_admin'@'localhost' IDENTIFIED BY 'securepassword';

-- dem User alle Rechte für die DB zuweisen
GRANT ALL PRIVILEGES ON myblog . * TO 'testingdb_admin'@'localhost';

-- Rechte neu einlesen
FLUSH PRIVILEGES;

-- Rechte verifizieren
SHOW GRANTS FOR 'testingdb_admin'@'localhost';

Das Passwort vom Mysql User ändern wir in dem wir mit „mysqladmin“ das alte und danach das neue Passwort eingeben.

-- Passwort ändern von User "testingdb_admin"
./mysqladmin -u testingdb_admin -psecurepassword password secure

-- Start Mysql mit dem alten Passwort --> funktioniert nicht
./mysql -u testingdb_admin -psecurepassword testingdb
ERROR 1045 (28000): Access denied for user 'testingdb_admin'@'localhost' (using password: YES)

-- Start Mysql mit dem neuen Passwort --> funktioniert
./mysql -u testingdb_admin -psecure testingdb

Nun erstellen wir mit „mysqldump“ ein Backup unserer Datenbank. Wir benutzen mysqldump dafür und leiten die Ausgabe in eine Datei um.

-- Mysql Dump der gesamten Datenbank mit allen Tabellen erstellen
./mysqldump -u testingdb_admin -p testingdb > testingdb.sql

-- Mysql Dump für Tabelle "router" erstellen
./mysqldump -u testingdb_admin -p testingdb router > testingdb.sql

-- aus Mysql Dump die Datenbank wieder herstellen
./mysqldump -u testingdb_admin -p testingdb < testingdb.sql

Wenn wir ein regelmäßiges Backup unserer DB benötigen, sollten wir uns ein Bash Script schreiben und dieses dann per Cronjob täglich starten. Ich habe mal zwei Versionen meines Shell Scripts aufgezeigt. Ich gehe mal davon aus, das das Shell Script täglich gestartet wird.

Der Befehl in Zeile 5 speichert den Dump mit Tag im Dateinamen (testingdb_dump_08.sql), das bedeutet unser ältestes Backup ist 30 oder 31 Tage alt, je nachdem wieviel Tage der aktuelle Monat hat.

Der Befehl in Zeile 8 speichert den Dump mit Tag und Monat im Dateinamen (testingdb_dump_08_03.sql), das bedeutet unser ältestes Backup ist ein Jahr alt. Am 08.03. des nächsten Jahres wird diese Datei überschrieben.

Der Befehl in Zeile 11 speichert den Dump mit Tag, Monat und Jahr im Dateinamen (testingdb_dump_08_03_2018.sql), das bedeutet wir können auf jeden Tag mit dem Backup zurück springen, da die Dateien nie überschrieben werden.

#!/bin/bash

# Script speichert den mysql dump in Datei "testingdb_dump_08.sql"
/usr/bin/mysqldump -u testingdb_admin -psecure testingdb > /db_backup/testingdb_dump_$(date "+%d").sql

# Script speichert den mysql dump in Datei "testingdb_dump_08_03.sql" 
/usr/bin/mysqldump -u testingdb_admin -psecure testingdb > /db_backup/testingdb_dump_$(date "+%d_%m").sql

# Script speichert den mysql dump in Datei "testingdb_dump_08_03_2018.sql" 
/usr/bin/mysqldump -u testingdb_admin -psecure testingdb > /db_backup/testingdb_dump_$(date "+%d_%m_%Y").sql

 

Dropdown Menü aus DB dynamisch erstellen

Heute möchte ich euch zeigen, wie man sich ein Dropdown Menü dynamisch aus einer Mysql DB erstellt. Als erstes erstellen wir uns eine Tabelle mit zwei Spalten, eine Spalte ist Primary Key „id“ und die andere Spalte enthält die Router Namen.

-- Tabelle erstellen
CREATE TABLE `router` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `routername` varchar(256) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Tabelle befüllen
INSERT INTO `router` (`id`, `routername`) VALUES
(1, 'router1'),
(2, 'router2'),
(3, 'router3'),
(4, 'router4'),
(5, 'router5'),
(6, 'router6'),
(7, 'router7'),
(8, 'router8');

-- Tabelle anzeigen
mysql> SELECT * FROM router;
+----+------------+
| id | routername |
+----+------------+
|  1 | router1    |
|  2 | router2    |
|  3 | router3    |
|  4 | router4    |
|  5 | router5    |
|  6 | router6    |
|  7 | router7    |
|  8 | router8    |
+----+------------+
8 rows in set (0,01 sec)

Als erstes verbinden wir uns mit der Datenbank und schreiben per prepared Statement die Ausgabe aus der Datenbank in das Array „$router“. Dann erstellen wir uns ein HTML Formular und fügen das Dropdown Menü (select) ein. Nun müssen wir die „option“ Tags für das Select Menü erstellen. Dazu wird das Array $router per for-Schleife Zeile für Zeile ausgegeben und in option Tags eingebettet.

<?php
//database Production credentials
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', 'root');
define('DBNAME', 'test');
try {

    //create PDO connection
    $db = new PDO("mysql:host=" . DBHOST . ";dbname=" . DBNAME, DBUSER, DBPASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"));
} catch (PDOException $e) {
    //show error
    echo '<p class="error">' . $e->getMessage() . '</p>';
    exit;
}

try {
    $statement = $db->prepare("SELECT * FROM router;");
    $statement->execute();
    $router = $statement->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo '<p class="error">' . $e->getMessage() . '</p>';
}
?>
<form method="POST">
    <select name="router">
        <option value="">W&auml;hle ...</option>
        <?php
        for ($i = 0; $i < count($router); $i++) {
            echo '<option value="' . $router[$i]['id'] . '">' . $router[$i]['routername'] . '</option>';
        }
        ?>
    </select>
    <input type="submit" value="Senden">
</form>

Die for-Schleife in den Zeilen 30-32 erzeugt die ganze Dynamik des Formulars. Zur Erklärung, wir müssen die option Tags wie folgt erzeugen:

<option value="1">router1</option>
<option value="2">router2</option>
.
.
.

Dies geschieht alles in Zeile 31. In dem Array $router sind alle Werte aus der DB enthalten, die „id“ und der „routername“. Da wir nicht wissen wieviel Einträge das Array hat, lassen wir es durch eine for-Schleife laufen und erhöhen bei jedem Durchlauf die Variable $i.

Mittels

  • $router[$i][‚id‘] <– id = Datenbank Spalte ‚id‘, die Namen müssen gleich sein
  • $router[$i][‚routername‘] <– routername = Datenbank Spalte ‚routername‘, die Namen müssen gleich sein

holen wir Zeile für Zeile die Werte aus der DB und tragen sie in die option Tags ein. Das ist die ganze Herrlichkeit.

Dropdown Menü mit vorausgewähltem option Tag

Wenn wir nun z.B. einen Routernamen vorauswählen wollen, abhängig von dem was unser User gewählt hat, müssen wir im Prinzip nur eine Zeile in unserem Script ändern. Wir müssen in einem option Tag nur das keyword „selected“ einfügen.

Beispiel hier wird router2 im Dropdown Menü angezeigt:

<option value="1">router1</option>
<option value="2" selected >router2</option>
.
.
.

Wie machen wir das am besten. Wir müssen auf alle Fälle das Formular einmal abgesendet haben. Dann bekommen wir eine $_POST[‚router‘] Variable übergeben, in der die id aus der Datenbank steht.

Array
(
    [router] => 2
)

Nun müssen wir bei jedem Zeilendurchlauf die id aus der Datenbank mit dem Wert der der $_POST[‚router‘] Variable vergleichen. Wenn beide Werte gleich sind, fügen wir das Keyword „selected“ in den option Tag ein. Dazu bedienen wir uns der Kurzschreibweise von if/else, da wir das innerhalb eines echo benötigen.

// if/else Kurzschreibweise innerhalb eines echo
// Erklärung:
// Wenn $id == 8, dann füge "selected" ein, ansonsten füge nichts ein

echo $id == '8' ? "selected" : "";

 

Als erstes schreiben wir die globale $_POST[‚router‘] Variable in eine $id Variable und ändern dann die Zeile 31 wie folgt:

// $_POST['router'] in $id schreiben
if (!empty($_POST['router'])) {
    $id = $_POST['router'];
}
// diese Zeile ändern von:
echo '<option value="' . $router[$i]['id'] . '">' . $router[$i]['routername'] . '</option>';

// in:
echo '<option value="' . $router[$i]['id'] . '" ' . ($router[$i]['id'] == $id ? "selected" : "") . ' >' . $router[$i]['routername'] . '</option>';

HTML Formular als Quelltext, hier sieht dass die $_POST[‚router‘] Variable = 3 ist und im Menü der Router3 vor ausgewählt wurde.

Array
(
    [router] => 3
)
<form method="POST">
    <select name="router">
        <option value="">W&auml;hle ...</option>
        <option value="1"  >router1</option>
		<option value="2"  >router2</option>
		<option value="3" selected >router3</option>
		<option value="4"  >router4</option>
		<option value="5"  >router5</option>
		<option value="6"  >router6</option>
		<option value="7"  >router7</option>
		<option value="8"  >router8</option>
    </select>
    <input type="submit" value="Senden">
</form>

 

 

 

 

 

 

Datum in PHP formatieren

Hier will ich euch zeigen wie wir das Datum aus einer Mysql Datenbank in einem deutschen Format anzeigen lassen. Mysql gibt den Wert aus der Zelle mit dem Daten Typ „Timestamp“ wie folgt zurück:

2018-03-06 22:04:16

Nun möchten wir aus diesem Format ein ordentliches deutsches Datumsformat ausgeben. Dafür schreiben wir uns eine eigene Funktion in PHP. Wir haben eine ganz einfache Mysql Tabelle mit einer „id“ und einer „zeitstempel“ spalte. Continue Reading