Benutzer-Werkzeuge

Webseiten-Werkzeuge


php

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
php [2023-09-14 10:49:55] – [PHP-Script um auf eine MS-SQL-Datenbank zuzugreifen] manfredphp [2024-10-14 11:38:17] (aktuell) – [Lösung] manfred
Zeile 1: Zeile 1:
 +====== PHP ======
 +
 +automatisch die aktuellste Version runterladen:
 +  > for i in $(links -dump http://php.net/downloads.php | fgrep 'Current Stable' | head -n1 | sed 's/ /\n/g' | grep -P '[0-9]+.[0-9]+.[0-9]+');do wget -nc -O php-${i}.tar.gz http://de1.php.net/get/php-${i}.tar.gz/from/this/mirror ; done
 +
 +
 +===== Bücher =====
 +
 +  * ISBN-13: ''978-3839154090'' (PHP für dich: So einfach war PHP-lernen noch nie! von Claudia Unkelbach)
 +
 +
 +===== Links =====
 +
 +  * [[http://reeg.junetz.de/DSP/node13.html]]
 +  * [[http://mikiwiki.org/wiki/PHP]]
 +  * [[http://www.php.net/manual/de/index.php]]
 +  * [[http://www.teialehrbuch.de/Kostenlose-Kurse/PHP/22349-Vorwort.html]]
 +  * [[http://www.dynamic-webpages.de/php/]]
 +
 +
 +===== Syntax =====
 +
 +
 +==== allgemeines zur Ausgabe ====
 +
 +zeigt alle für die CLI aktivierten Module an
 +  > php -m
 +
 +zeigt alle für FPM (nginx) aktivierten Module an
 +  > php-fpm8.1 -m
 +
 +zeigt alle aktiven nginx-Module an
 +  > ls -lha /etc/nginx/modules-enabled/
 +
 +
 +=== Array anzeigen ===
 +
 +  > echo var_export($result);
 +  mysqli_stmt::__set_state(array(
 +     'affected_rows' => NULL,
 +     'insert_id' => NULL,
 +     'num_rows' => NULL,
 +     'param_count' => NULL,
 +     'field_count' => NULL,
 +     'errno' => NULL,
 +     'error' => NULL,
 +     'error_list' => NULL,
 +     'sqlstate' => NULL,
 +     'id' => NULL,
 +  ))
 +
 +  > print var_export($result);
 +  mysqli_stmt::__set_state(array(
 +     'affected_rows' => NULL,
 +     'insert_id' => NULL,
 +     'num_rows' => NULL,
 +     'param_count' => NULL,
 +     'field_count' => NULL,
 +     'errno' => NULL,
 +     'error' => NULL,
 +     'error_list' => NULL,
 +     'sqlstate' => NULL,
 +     'id' => NULL,
 +  ))
 +
 +  > print_r($result);
 +  mysqli_stmt Object
 +  (
 +      [affected_rows] => 4
 +      [insert_id] => 0
 +      [num_rows] => 4
 +      [param_count] => 0
 +      [field_count] => 1
 +      [errno] => 0
 +      [error] => 
 +      [error_list] => Array
 +          (
 +          )
 +  
 +      [sqlstate] => 00000
 +      [id] => 1
 +  )
 +
 +
 +==== PHP-Fehler anzeigen ====
 +
 +diese zwei Zeilen an den Anfang des fehlerhaften Skriptes setzen:
 +  <?php
 +  ini_set( 'display_errors', true );
 +  error_reporting( E_ALL | E_STRICT );
 +  ...
 +
 +
 +==== PHP-Info ====
 +
 +  <?php
 +  phpinfo();
 +  ?>
 +
 +
 +==== OS-Info ====
 +
 +  <?php
 +  echo PHP_OS();
 +  ?>
 +
 +
 +==== uname -a ====
 +
 +  <?php
 +  echo php_uname(a);
 +  ?>
 +
 +==== if not ====
 +
 +  <?php
 +  if($var != 'xyz') { }
 +  ?>
 +
 +
 +==== alle variablen ausgeben ====
 +
 +  * [[http://forum.de.selfhtml.org/archiv/2005/9/t115273/]]
 +  * [[http://de3.php.net/manual/de/function.print-r.php]]
 +
 +  <?php
 +  print_r($_POST);
 +  print_r($GLOBALS, 1);
 +  print_r(get_defined_vars());
 +  print_r(get_declared_classes());
 +  print_r(get_defined_functions());
 +  ?>
 +
 +  <?php
 +          print '$GLOBALS = ' . var_export($GLOBALS, true) . "\n";
 +  ?>
 +
 +
 +==== Array in Variable speichern ====
 +
 +  * [[http://www.php-einfach.de/php-tutorial/php-array.php]]
 +
 +<file php save_array>
 +  <?php
 +  // Wenn du die Kommata's im Array nicht haben MUSST:
 +  $string = implode(",", $array);
 +  
 +  // oder so:
 +  $string = implode(",", $array["artikel"]);
 +  
 +  // Wenn doch:
 +  foreach($array as $value)
 +  {
 +          $string .= $value;
 +  }
 +  
 +  // oder so:
 +  foreach($array as $key => $value)
 +  {
 +          $string .= $key . " = " . $value . "\n";
 +  }
 +  
 +  // hier werden aus dem Array nur die Werte von "key=artikel" in der Variablen gespeichert:
 +  foreach ($_REQUEST as $key => $value) {
 +          if (strncmp($key, "artikel") == 0) {
 +                  $string .= $value;
 +          }
 +  }
 +  ?>
 +</file>
 +
 +==== Arrays ausgeben ====
 +
 +<file php show_array_1>
 +foreach($allResults as $key=>$val){  
 +        print ($val["name"] . "\n"); 
 +}
 +</file>
 +
 +<file php show_array_2>
 +foreach($allResults as $value)
 +{
 +        $string = $value["name"];
 +        print ($string . "\n");
 +}
 +</file>
 +
 +<file php show_array_3>
 +foreach($allResults as $value)
 +{
 +        print ($value["name"] . "\n");
 +}
 +</file>
 +
 +<file php show_array_4>
 +foreach($allResults as $key => $value)
 +{
 +        print ($key . "=" . $value["name"] . "\n");
 +        print ($value["name"] . "\n");
 +}
 +</file>
 +
 +<file php show_array_5>
 +foreach($allResults as $key => $value)
 +{
 +        $string = $key . "=" . $value["name"];
 +        print ($string . "\n");
 +}
 +</file>
 +
 +
 +==== Das global Schlüsselwort ====
 +
 +Um die Variablen innerhalb und außerhalb der Funktion zugänglich zu machen, bietet PHP das Schlüsselwort global. Dieses Schlüsselwort ermöglicht es, außerhalb einer Funktion liegende Variablen "in die Funktion hinein" zu holen. Nur dadurch können sie auch innerhalb der Funktion ihre Gültigkeit besitzen und z.B. ausgegeben werden.
 +
 +Beachten Sie, dass eine Änderung der Variable, die Sie mittels global für die Funktion sichtbar gemacht haben, nicht nur für die Verwendung innerhalb der Funktion gilt, sondern auch außerhalb.
 +
 +  ?>
 +  
 +  <?php
 +  $a = 1;
 +  $b = 2;
 +  
 +  function Summe()
 +  {
 +          global $a;
 +          global $b;
 +          $a = $a + $b;
 +  }
 +  
 +  Summe();
 +  echo $a;
 +  ?>
 +
 +
 +==== Die Verwendung von GLOBALS ====
 +
 +  <?php
 +  echo print_r($GLOBALS , 1);
 +  ?>
 +
 +  <?php
 +  $name = Fritz;
 +  echo $GLOBALS["name"];
 +  ?>
 +
 +  <?php
 +  $a = 1;
 +  $b = 2;
 +  
 +  function Summe()
 +  {
 +          $GLOBALS["a"] = $GLOBALS["a"] + $GLOBALS["b"];
 +  }
 +  
 +  Summe();
 +  echo $a;
 +  ?>
 +
 +
 +==== statische Variablen ====
 +
 +Normalerweise würde diese Funktion sinnlos sein, da die Variable "$a" immer wieder auf "0" gesetzt wird
 +und nach der Ausgabe erst um "1" erhöht wird.
 +
 +Da die Variable "$a" aber als //static// deklariert wurde, verliert sie ihren Wert nicht
 +und die Funktion gibt bei jedem Aufruf einen neuen Wert aus, der um "1" höher ist als der
 +vorhergehende Wert.
 +
 +  <?php
 +  function Test()
 +  {
 +          static $a = 0;
 +          echo $a;
 +          $a++;
 +  }
 +  ?>
 +
 +Static-Variablen ermöglichen auch einen Weg zum Umgang mit rekursiven Funktionen. Das sind Funktionen, die sich selbst aufrufen. Hierbei besteht die Gefahr, so genannte Endlos- Schleifen zu programmieren. Sie müssen also einen Weg vorsehen, diese Rekursion zu beenden. Die folgende einfache Funktion zählt rekursiv bis 10. Die statische Variable "$zaehler" wird benutzt, um die Rekursion zu beenden:
 +
 +  <?php
 +  function Test()
 +  {
 +          static $zaehler = 0;
 +  
 +          $zaehler++;
 +          echo $zaehler;
 +          if ($zaehler < 10) {
 +                  Test ();
 +          }
 +          $zaehler--;
 +  }
 +  ?>
 +
 +Statische Variablen werden wie in oben stehenden Beispielen deklariert.
 +Das Zuweisen eines Wertes, welcher das Ergebnis eines Ausdrucks ist, wird mit einem //parse error quittiert//.
 +
 +
 +==== Dateioperationen ====
 +
 +siehe [[http://php.net/manual/de/function.fopen.php]]
 +
 +^ mode ^ Beschreibung  ^
 +| 'r' | Nur zum Lesen geöffnet; platziere Dateizeiger auf Dateianfang.  |
 +| 'r+' | Zum Lesen und Schreiben geöffnet; platziere Dateizeiger auf Dateianfang.  |
 +| 'w' | Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen.  |
 +| 'w+' | Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen.  |
 +| 'a' | Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen. In diesem Modus ist ''fseek()'' wirkungslos; beim Schreiben wird immer angehängt.  |
 +| 'a+' | Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen. In diesem Modus wirkt sich ''fseek()'' nur auf die Leseposition aus; beim Schreiben wird immer angehängt.  |
 +| 'x' | Erzeuge und Öffne nur zum Schreiben; platziere Dateizeiger auf Dateianfang. Falls die Datei schon existiert, wird der **fopen()** Aufruf fehlschlagen durch Rückgabe von **FALSE** und dem Auslösen eines Fehlers der Stufe **E_WARNING**. Existiert die Datei nicht, versuche, diese zu erzeugen. Dies ist zur Angabe der ''O_EXCL''/''O_CREAT'' Flags für den darunterliegenden ''open(2)'' System Aufruf äquivalent.  |
 +| 'x+' | Erzeuge und Öffne zum Schreiben und Lesen; ansonsten ist das Verhalten gleich wie bei 'x' |
 +| 'c' | Öffne Datei nur zum Schreiben. Wenn die Datei nicht existiert, wird diese erzeugt. Wenn sie existiert, wird sie weder gekürzt (im Gegensatz zu 'w'), noch schlägt der Aufruf dieser Funktion fehl (wie dies mit 'x' der Fall ist). Der Dateizeiger wird auf den Dateianfang platziert. Dies kann nützlich sein, wenn man eine "beratende" (kooperative) Sperre erhalten möchte (siehe flock()) bevor man versucht, die Datei zu ändern, da die Nutzung von 'w' die Datei kürzen könnte, bevor die Sperre erhalten wurde (falls Kürzen gewünscht ist, kann ftruncate() genutzt werden, nachdem die Sperre angefragt wurde).  |
 +| 'c+' | Öffne Datei zum Lesen und Schreiben; ansonsten ist das Verhalten gleich wie bei 'c' |
 +| 'e' | Setzt das close-on-exec Flag für den geöffneten Datei-Descriptor. Nur verfügbar, wenn PHP auf POSIX.1-2008 konformen System kompiliert wurde.  |
 +
 +
 +==== Variablen und Dateien ====
 +
 +<file php>
 +<?php
 +
 +//
 +// Inhalt der Variable anzeigen
 +//
 +echo $test;
 +
 +//
 +// GET-Daten in Variablen schreiben
 +//
 +$var1 = $_GET["var1"];
 +$var2 = $_GET["var2"];
 +$var3 = $_GET["var3"];
 +$var4 = $_GET["var4"];
 +
 +//
 +// Variablen-Inhalt einem SHELL-Script übergeben
 +//
 +$KOMMANDO1 = "/opt/bin/test.sh"." var1=".$var1." var2=".$var2." var3=".$var3." var4=".$var4;
 +
 +//
 +// SHELL-Kommando ausführen
 +//
 +echo shell_exec("$KOMMANDO1;");
 +
 +//
 +// Variablen-Inhalt durch eine Pipe schicken
 +//
 +$KOMMANDO2 = "echo"." '".$test."' | /opt/bin/test.sh";
 +
 +//
 +// SHELL-Kommando ausführen
 +//
 +echo shell_exec("$KOMMANDO2;");
 +?>
 +</file>
 +
 +
 +==== Variable-Inhalt in eine Datei schreiben ====
 +
 +Inhalt der Variablen "$test" wird in die Datei "/tmp/test.txt" geschrieben:
 +  <?php
 +  $dateiname = "/tmp/test.txt";
 +  $handler = fOpen($dateiname , "a+");
 +  fWrite($handler , $test);
 +  fWrite($handler , "\n");
 +  fClose($handler);
 +  ?>
 +
 +hiermit kann man nachsehen, welche Daten z.Z. in den Variablen stehen,
 +alle Variableninhalte werden in die Datei "/tmp/GLOBALS.txt" geschrieben:
 +  <?php
 +  $dateiname = "/tmp/GLOBALS.txt";
 +  $handler = fOpen($dateiname , "w+");
 +  fWrite($handler , print_r($GLOBALS, 1));
 +  fClose($handler);
 +  ?>
 +
 +alle Inhalte des HTTP_REFERER in die Datei "/tmp/HTTP_REFERER.txt" schreiben:
 +  <?php
 +  $dateiname = "/tmp/HTTP_REFERER.txt";
 +  $handler = fOpen($dateiname , "w+");
 +  fWrite($handler , $_SERVER["HTTP_REFERER"]);
 +  fClose($handler);
 +  ?>
 +
 +aus dem HTTP_REFERER soll nur die Info über die Variable "release" in die Datei "/tmp/release.txt" geschrieben werden: [[http://www.php-kurs.info/tutorial-google_referer_auslesen.html]]
 +  <?php
 +  $dateiname = "/tmp/release.txt";
 +  $handler = fOpen($dateiname , "w+");
 +  $_ref = $_SERVER['HTTP_REFERER'];
 +  $_ref .= '&'; 
 +  preg_match('/&release=(.*)&/UiS', $_ref, $INHALT);
 +  $RELEASE=$INHALT[1];
 +  fWrite($handler , $RELEASE);
 +  fClose($handler);
 +  ?>
 +
 +
 +==== Inhalt aus einer Datei auslesen ====
 +
 +[[http://php.net/manual/de/function.file-get-contents.php]]
 +
 +  <?php
 +  
 +  $datei_name=("datei.txt");
 +  //$datei_inhalt_array=file($datei_name);
 +  $datei_inhalt=file_get_contents($datei_name);
 +  echo $datei_inhalt;
 +  ?>
 +
 +
 +==== Wert aus einer Datei auslesen ====
 +
 +Beispiel-Configurationsdatei vorbereiten:
 +  # echo 'RELEASE="1.2.3"' >> /etc/datei.conf
 +
 +  <?php
 +  
 +  $cfgverzeichnis=("/etc");
 +  $cfgdatei=("datei.conf");
 +  $cfgdatei_inhalt=file($cfgverzeichnis."/".$cfgdatei);
 +  foreach ($cfgdatei_inhalt as $index => $zeile) {
 +          if(strncmp($zeile,"RELEASE",7)==0) {
 +                  $release_wert=substr($line,9,strlen($zeile)-11);
 +          }
 +  }
 +  echo $release_wert;
 +  
 +  ?>
 +
 +  - "RELEASE" ist die zu suchende Zeichenfolge und sie sie ist "7" Zeichen lang;
 +  - die "9" gibt die Anzahl der zu überspringenden Zeichen an ('RELEASE="' -> 7+2=9);
 +  - "strlen($zeile)" ist eine interne Funktion, die die Gesamtlänge der Zeile angibt;
 +  - es sollen "Gesamtlänge" minus "11" Zeichen gelesen werden;
 +  - auf "11" kommt man, in dem die "7" zu überspringenden Zeichen mit dem abschließenden doppelten Hochkommata (") und dem Zeilenumbruch addiert werden (die ja jeweils ein weiteres Zeichen dar stellen) => ('RELEASE="'+'"\n' -> 7+2+2=11);
 +  - damit ist die ZEILENLÄNGE minus 11 genau die Zeichenanzahl, die zwischen den doppelten Anführungszeichen stehen;
 +
 +
 +==== warten bis eine Datei da ist ====
 +
 +Hier ist diese nützliche Funktion:
 +  function auf_datei_warten($wartedatei) {
 +      $loop_max=100;
 +      $loop_zahl=0;
 +      while (!file_exists($wartedatei)) {
 +          sleep(1);
 +          $loop_zahl++;
 +          flush();
 +          if ($loop_zahl > $loop_max)  {
 +              return false;
 +          }       
 +      }
 +      return true;
 +  }
 +
 +und so setzt man sie beispielsweise ein:
 +  if (auf_datei_warten($dateiname)) {
 +  // Datei ist da, kann los gehen...
 +  // wir geben der Datei noch eine Sekunde extra
 +  sleep(1);
 +  } else {
 +  // Datei ist in der vorgegebenen Zeitspanne nicht eingetroffen. ABBRUCH!
 +  exit(1);
 +  }
 +
 +
 +==== Datenbankzugriff ====
 +
 +mit Ubuntu werden die im folgenden benötigten Pakete so installiert:
 +  > apt install php5 php5-mysql php5-sybase
 +
 +
 +=== mysql_connect (veraltet) ===
 +
 +<file php>
 +<?php
 +//
 +// Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 entfernt.
 +// Verwenden Sie stattdessen die Erweiterungen MySQLi oder PDO_MySQL.
 +//
 +
 +$servername = "db3347.lan";
 +$username = "dbbenutzer";
 +$password = "geheim";
 +$datenbank = "";
 +$dbport = "3347";
 +
 +// Create connection
 +$link = mysql_connect($servername . ':' . $dbport, $username, $password);
 +
 +// Check connection
 +if (!$link) {
 +    echo "Fehler: konnte nicht mit MySQL verbinden." . PHP_EOL;
 +    echo "Debug-Fehlernummer: " . mysql_connect_errno() . PHP_EOL;
 +    echo "Debug-Fehlermeldung: " . mysql_connect_error() . PHP_EOL;
 +    exit;
 +}
 +
 +echo "Erfolg: es wurde ordnungsgemäß mit MySQL verbunden! Die Datenbank " . $datenbank . " ist toll." . PHP_EOL;
 +echo "Host-Informationen: " . mysql_get_host_info($link) . PHP_EOL;
 +
 +mysql_close($link);
 +?>
 +</file>
 +
 +<file php>
 +<?php
 +//
 +// Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 entfernt.
 +// Verwenden Sie stattdessen die Erweiterungen MySQLi oder PDO_MySQL.
 +//
 +
 +$servername = "db3347.lan";
 +$username = "dbbenutzer";
 +$password = "geheim";
 +$datenbank = "";
 +$dbport = "3347";
 +
 +// Create connection
 +if (!mysql_connect($servername . ':' . $dbport, $username, $password)) {
 +    echo 'Konnte nicht zu mysql verbinden';
 +    exit;
 +}
 +
 +$sql = "SHOW DATABASES;";
 +//$sql = "SHOW TABLES FROM $datenbank";
 +$result = mysql_query($sql);
 +
 +if (!$result) {
 +    echo "DB Fehler, konnte Tabellen nicht auflisten\n";
 +    echo 'MySQL Fehler: ' . mysql_error();
 +    exit;
 +}
 +
 +$ausgabe = "";
 +while ($row = mysql_fetch_row($result)) {
 +    $ausgabe .= "{$row[0]}\n";
 +}
 +echo $ausgabe;
 +
 +mysql_free_result($result);
 +?>
 +</file>
 +
 +
 +=== mysqli_connect (alt) ===
 +
 +  * [[http://www.php-kurs.com/mysql-datenbank-auslesen.htm]]
 +  * [[http://www.html-info.eu/mysql-und-php/basiswissen-sql/item/tipps-fuer-effiziente-datenbankabfragen.html]]
 +
 +<file php>
 +<?php
 +
 +// http://php.net/manual/de/function.mysqli-connect.php
 +// https://www.w3schools.com/php/func_mysqli_fetch_row.asp
 +
 +$servername = $argv['1'];
 +$dbport = $argv['2'];
 +$username = $argv['3'];
 +$password = $argv['4'];
 +//$datenbank = $argv['5'];
 +
 +// Create connection
 +//$link = new mysqli($servername, $username, $password, $datenbank, $dbport);
 +$link = new mysqli($servername, $username, $password, '', $dbport);
 +$link -> set_charset('utf8');
 +
 +if ($link -> connect_errno) {
 +        printf("Verbindung fehlgeschlagen: %s\n", $mysqli->connect_error);
 +        exit();
 +}   
 +
 +$sql = "SHOW DATABASES;";
 +//$sql = "SHOW TABLES FROM $datenbank";
 +//print_r($link -> prepare($sql));
 +
 +$result = $link -> prepare($sql);
 +$result -> execute();
 +$result -> store_result();
 +$result = mysqli_query($link,$sql);
 +
 +//echo var_export($result);
 +//print var_export($result);
 +//print_r($result);
 +
 +$ausgabe = ""; 
 +while ($row=mysqli_fetch_row($result)) {
 +        $ausgabe .= "{$row[0]}\n";
 +}
 +
 +echo $ausgabe;
 +$result -> close();
 +$link -> close();
 +?>
 +</file>
 +
 +
 +=== PDO ===
 +
 +Die Option ''PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT'' darf nicht verwendet werden!
 +Ihr ist es scheißegal ob sie auf "true" oder "false" gesetzt wird, sie schaltet die Verifikation **IMMER** ab!!!
 +
 +  * [[http://php.net/manual/de/ref.pdo-mysql.connection.php]]
 +  * [[https://www.ibm.com/docs/en/db2/11.5?topic=pdo-commit-modes|Commit modes in PHP (PDO)]]
 +  * [[::Datenbankverbindungen zu einer MySQL mit SSL-Verschlüsselung#Mit dem PDO-Client von PHP]]
 +
 +Ubuntu
 +  > apt install php-cli php-mysql
 +
 +<file php show_users.php>
 +#!/usr/bin/php
 +
 +<?php
 +// Abfrage definieren
 +$sql = "SELECT * FROM user";
 +
 +// Verbindung zur Datenbank aufbauen
 +$dbh = new pdo('mysql:host=11.12.13.14;port=3306;dbname=mysql', 'root', 'geheim');
 +
 +// Verbindung nutzen
 +foreach ($dbh->query($sql) as $row) {
 +   echo $row['Host']."\t\t".$row['User']."\t\t".$row['authentication_string']."\n";
 +}
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +zeigt alle hinterlegten Benutzer an:
 +  > php show_users.php
 +
 +<file php show_tables.php>
 +<?php
 +$sql = "SHOW TABLES";
 +$dbh = new pdo('mysql:host=11.12.13.14;port=3306;dbname=mysql','root','XXXXXXXX');
 +foreach ($dbh->query($sql) as $row) {
 +       echo $row['Tables_in_mysql']."\n";
 +}
 +$dbh = null;
 +?>
 +</file>
 +
 +zeigt alle Tabellen, aus der Datenbank "mysql" an:
 +  > php show_tables.php
 +
 +zeigt alle hinterlegten Benutzer an:
 +  > php show_users.php
 +
 +<file php /usr/local/bin/mysqlshow.php>
 +#!/usr/bin/php
 +
 +<?php
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +
 +// Abfrage definieren
 +$sql = "SHOW DATABASES;";
 +
 +// Verbindung zur Datenbank aufbauen
 +//$dbh = new pdo('mysql:host=' . $dbhost . ';port=' . $dbport . ';dbname=mysql', $dbuser , $dbpass);
 +$dbh = new pdo('mysql:host=' . $dbhost . ';port=' . $dbport , $dbuser , $dbpass);
 +
 +// Verbindung nutzen
 +foreach ($dbh->query($sql) as $row) {
 +   echo $row['Database'] . "\n";
 +}
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +  > /usr/local/bin/mysqlshow.php [User] [Passwort] [Host] [Port]
 +  > /usr/local/bin/mysqlshow.php root geheim 192.168.1.14 3306
 +
 +<file bash /root/bin/mysqlshow+ssl.php>
 +#!/usr/bin/php
 +
 +<?php
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +$db_key = $argv['5'];
 +$db_crt = $argv['6'];
 +$db_ca = $argv['7'];
 +
 +// wo sind die PEM-Dateien zu finden?
 +//$ssl_optionen=array(
 +//      PDO::MYSQL_ATTR_SSL_KEY         => '/path/to/client-key.pem',
 +//      PDO::MYSQL_ATTR_SSL_CERT        => '/path/to/client-cert.pem',
 +//      PDO::MYSQL_ATTR_SSL_CA          => '/path/to/ca-cert.pem'
 +//);
 +
 +$ssl_optionen=array(
 +        PDO::MYSQL_ATTR_SSL_KEY                 => $db_key,
 +        PDO::MYSQL_ATTR_SSL_CERT                => $db_crt,
 +        PDO::MYSQL_ATTR_SSL_CA                  => $db_ca,
 +        PDO::ATTR_PERSISTENT                    => false
 +);
 +
 +
 +// Abfrage definieren
 +$sql = "SHOW DATABASES";
 +
 +// Verbindung zur Datenbank aufbauen
 +//$dbh = new pdo('mysql:host=' . $dbhost . ';port=' . $dbport . ';dbname=mysql', $dbuser , $dbpass);
 +try {
 +$dbh = new PDO(
 +//      'mysql:host=' . $dbhost . ';port=' . $dbport , $dbuser , $dbpass
 +        'mysql:host=' . $dbhost . ';port=' . $dbport , $dbuser , $dbpass, $ssl_optionen
 +);
 +} catch (PDOException $e) {
 +        print "Error!: " . $e->getMessage() . "\n";
 +        die();
 +}
 +
 +// Verbindung nutzen
 +// Verbindung nutzen
 +foreach ($dbh->query($sql) as $row) {
 +        echo $row['Database'] . "\n";
 +}
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +<file php datenbankzugriff_arg1.php>
 +#!/usr/bin/php
 + 
 +<?php
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +$dbname = $argv['5'];
 +$dbtab = $argv['6'];
 +
 +$dbdsn=('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname);
 +print "dbdsn='" . $dbdsn ."'\n";
 +print "\n";
 +
 +// Abfrage definieren
 +$sql = "SELECT id FROM " . $dbtab . " LIMIT 1";
 +print "sql='" . $sql ."'\n";
 +print "\n";
 + 
 +// Verbindung zur Datenbank aufbauen
 +//$dbh = new pdo('mysql:host=11.12.13.14;port=3306;dbname=mysql', 'root', 'geheim');
 +$dbh = new pdo($dbdsn, $dbuser, $dbpass);
 +$sql = $dbh->prepare($sql);
 +$sql->execute();
 + 
 +// Verbindung nutzen
 +$total = $sql->fetchColumn();
 +print "total='" . $total ."'\n";
 +print "\n";
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +  > php datenbankzugriff_arg1.php root geheim 192.168.10.1 3306 testdb testtab
 +
 +<file php datenbankzugriff_arg2.php>
 +#!/usr/bin/php
 + 
 +<?php
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +$dbname = $argv['5'];
 +$dbtab = $argv['6'];
 +
 +$dbdsn=('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname);
 +print "dbdsn='" . $dbdsn ."'\n";
 +print "\n";
 +
 +// Abfrage definieren
 +$sql = "SELECT id FROM " . $dbtab . " LIMIT 10";
 +print "sql='" . $sql ."'\n";
 +print "\n";
 + 
 +// Verbindung zur Datenbank aufbauen
 +$dbh = new pdo($dbdsn, $dbuser, $dbpass);
 +$sql = $dbh->prepare($sql);
 +$sql->execute();
 + 
 +while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
 +        echo $row['id']."\n";
 +}
 +print "\n";
 + 
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +  > php datenbankzugriff_arg2.php root geheim 192.168.10.1 3306 testdb testtab
 +
 +
 +<file php datenbankzugriff_arg3.php>
 +<?php
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +$dbname = $argv['5'];
 +$dbtab = $argv['6'];
 +
 +$dbdsn=('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname);
 +//print "dbdsn='" . $dbdsn ."'\n";
 +//print "\n";
 +
 +// Abfrage definieren
 +$sql = "SELECT * FROM " . $dbtab . " LIMIT 10";
 +//$sql = "SELECT * FROM " . $dbtab . " ORDER BY submitdate DESC LIMIT 0,1000";
 +//print "sql='" . $sql ."'\n";
 +//print "\n";
 +
 +// Verbindung zur Datenbank aufbauen
 +$dbh = new pdo($dbdsn, $dbuser, $dbpass);
 +$sql = $dbh->prepare($sql);
 +$sql->execute();
 +
 +// Datei öffnen
 +$dateiname = "/tmp/test.txt";
 +//$dateiname = "/dev/null";
 +//$handler = fOpen($dateiname , "a+");
 +$handler = fOpen($dateiname , "w");
 +
 +while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
 +        //echo $row['id']."\n";
 +        //print_r($row)."\n";
 +        //fWrite($handler , $row['id']."\n");
 +        fWrite($handler , print_r($row,1) . "\n");
 +}
 +//print "\n";
 +
 +// Datei wieder schließen
 +fClose($handler);
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +  > php datenbankzugriff_arg3.php root geheim 192.168.10.1 3306 testdb testtab
 +
 +Der Inhalt der Datei ''/tmp/test.txt'' ist ein Array, keine von Menschen lesbare Tabelle, wie man es von der Ausgabe durch "''mysql -t''" her kennt.
 +
 +In der foldenden wird bei einem Verbindungsfehler, die Fehlerausgabe in eine separate Datei geschrieben:
 +<file php datenbankzugriff_arg4.php>
 +<?php
 +//
 +// apt install php5 php5-mysql
 +//
 +
 +// Argumente
 +$dbuser = $argv['1'];
 +$dbpass = $argv['2'];
 +$dbhost = $argv['3'];
 +$dbport = $argv['4'];
 +$dbname = $argv['5'];
 +$dbtab = $argv['6'];
 +
 +$dbdsn=('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname);
 +//print "dbdsn='" . $dbdsn ."'\n";
 +//print "\n";
 +
 +// Abfrage definieren
 +$sql = "SELECT * FROM " . $dbtab . " LIMIT 10";
 +//$sql = "SELECT * FROM " . $dbtab . " ORDER BY submitdate DESC LIMIT 0,1000";
 +//print "sql='" . $sql ."'\n";
 +//print "\n";
 +
 +// Fehlerdatei öffnen
 +$fehlerdatei = "/var/log/php_mysqldb_fehler.log";
 +$fehlerhandler = fOpen($fehlerdatei , "a+");
 +
 +// Verbindung zur Datenbank aufbauen
 +try {
 +        $dbh = new pdo($dbdsn, $dbuser, $dbpass);
 +        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 +        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
 +
 +        $sql = $dbh->prepare($sql);
 +        $sql->execute();
 +
 +}
 +catch(Exception $e) {
 +        fWrite($fehlerhandler , date(date("Y-m-d H:i:s",time())) . " Exception -> " . print_r($e->getMessage(),1) . "\n");
 +}
 +
 +// Datei öffnen
 +$infodatei = "/tmp/test";
 +$infohandler = fOpen($infodatei , "a+");
 +
 +// Daten aus der DB abrufen
 +while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
 +        //echo $row['id']."\n";
 +        //print_r($row)."\n";
 +        //fWrite($handler , $row['id']."\n");
 +        fWrite($infohandler , print_r($row,1) . "\n");
 +}
 +//print "\n";
 +
 +// Datei wieder schließen
 +fClose($fehlerhandler);
 +fClose($infohandler);
 +
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +?>
 +</file>
 +
 +<file php show_databases.php>
 +<?php
 +
 +$servername = $argv['1'];
 +$dbport = $argv['2'];
 +$username = $argv['3'];
 +$password = $argv['4'];
 +
 +// Verbindung zur Datenbank aufbauen
 +try
 +{
 +        $link = new PDO("mysql:host=$servername;port=$dbport", $username, $password);
 +        // set the PDO error mode to exception
 +        //$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 +        //echo "Connected successfully\n";
 +}
 +
 +catch(PDOException $e)
 +{
 +        echo "Connection failed: " . $e->getMessage();
 +}
 +
 +// Abfrage definieren
 +$sql = "SHOW DATABASES;";
 +$stmt = $link->query($sql);
 +$row_count = $stmt->rowCount();
 +//echo $row_count.' rows selected';
 +$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
 +//echo var_export($results);
 +$ausgabe = "";
 +foreach ($results as $a)
 +{
 +        foreach ($a as $key => $value)
 +        {
 +                //echo $key . " = " . $value . "\n";
 +                //echo $value[$key] . "\n";
 +                $ausgabe .= $key . " = " . $value . "\n";
 +                //$ausgabe .= $value[$key] . "\n";
 +        }
 +}
 +
 +//echo "--------------------------------------------------------------------------------\n";
 +echo $ausgabe;
 +?>
 +</file>
 +
 +  > php db-test_pdo.php 192.168.0.10 3306 root geheim
 +  Database = information_schema
 +  Database = meinedb
 +  Database = mysql
 +  Database = performance_schema
 +
 +
 +<file php show_tables.php>
 +<?php
 +
 +$servername = $argv['1'];
 +$dbport = $argv['2'];
 +$username = $argv['3'];
 +$password = $argv['4'];
 +$datenbank = $argv['5'];
 +
 +// Verbindung zur Datenbank aufbauen
 +try
 +{
 +        $link = new PDO("mysql:host=$servername;dbname=$datenbank;port=$dbport", $username, $password);
 +        // set the PDO error mode to exception
 +        //$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 +        //echo "Connected successfully\n";
 +}
 +
 +catch(PDOException $e)
 +{
 +        echo "Connection failed: " . $e->getMessage();
 +}
 +
 +// Abfrage definieren
 +$sql = "SHOW TABLES;";
 +$stmt = $link->query($sql);
 +$row_count = $stmt->rowCount();
 +//echo $row_count.' rows selected';
 +$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
 +//echo var_export($results);
 +$ausgabe = "";
 +foreach ($results as $a)
 +{
 +        foreach ($a as $key => $value)
 +        {
 +                //echo $key . " = " . $value . "\n";
 +                //echo $value[$key] . "\n";
 +                $ausgabe .= $key . " = " . $value . "\n";
 +                //$ausgabe .= $value[$key] . "\n";
 +        }
 +}
 +
 +//echo "--------------------------------------------------------------------------------\n";
 +echo $ausgabe;
 +?>
 +</file>
 +
 +  > php db-test_pdo.php 192.168.0.10 3306 root geheim meinedb
 +  Tables_in_meinedb = name
 +  Tables_in_meinedb = vorname
 +  Tables_in_meinedb = geburtstag
 +
 +
 +=== PHP-Script um auf eine MS-SQL-Datenbank zuzugreifen ===
 +
 +Damit der DB-Zugriff per ''PHP 7.2'' funktioniert, müssen die verwendeten Benutzer mit "''mysql_native_password''" angelegt worden sein:
 +  > echo "CREATE USER dbbenutzer IDENTIFIED WITH mysql_native_password BY 'geheim' ; GRANT SELECT ON *.* TO 'dbbenutzer'@'%'; FLUSH PRIVILEGES;" | mysql
 +
 +**Die Funktion ''mssql_connect'' wurde mit PHP Version 7 entfernt!**
 +<file php mssqlshow.php>
 +<?php
 +        #
 +        # http://php.net/manual/de/book.mssql.php
 +        #
 +
 +        $dbhandle = mssql_connect('192.168.200.30:49411', 'fritz', 'xYz123');
 +        if (!$dbhandle || !mssql_select_db('datenbankname', $dbhandle)) {
 +                die('Es konnte keine Verbindung mit der MsSQL-Datenbank hergestellt werden!');
 +        }else{
 +                echo"Verbindung mit der MsSQL-Datenbank wurde hergestellt.";
 +        }
 +
 +        ### eine Möglichkeit, sich die Tabellen anzeigen zu lassen
 +        $v = mssql_query("SELECT * FROM sys.Tables;")
 +                or die('A error occured: ' . mysql_error());
 +        $row = mssql_fetch_array($v);
 +        print "\n";
 +        echo $row[0];
 +        print "\n";
 +
 +        ### eine andere Möglichkeit, sich die Tabellen anzeigen zu lassen
 +        $v = mssql_query("SELECT table_name FROM information_schema.tables;")
 +                or die('A error occured: ' . mysql_error());
 +        $row = mssql_fetch_array($v);
 +        print "\n";
 +        echo $row[0];
 +        print "\n";
 +
 +        mssql_free_result($v);
 +        mssql_close($dbhandle);
 +?>
 +</file>
 +
 +<file php mssql_show.php>
 +<?php
 +//
 +// http://php.net/manual/de/book.mssql.php
 +// http://de2.php.net/manual/de/pdo.construct.php
 +//
 +
 +// Argumente
 +$dbdriver = $argv['1'];
 +$dbuser = $argv['2'];
 +$dbpass = $argv['3'];
 +$dbhost = $argv['4'];
 +$dbport = $argv['5'];
 +$dbname = $argv['6'];
 +
 +// das Ziel zusammenstellen
 +$dsn = $dbdriver . ':dbname=' . $dbname . ';host=' . $dbhost . ':' . $dbport;
 +
 +// mit DB verbinden
 +try {$connection = new PDO($dsn, $dbuser, $dbpass);
 +} catch (PDOException $e) {
 +        die('Es konnte keine Verbindung mit der MsSQL-Datenbank hergestellt werden! '.$e->getMessage());
 +}
 +
 +// die Tabellen anzeigen lassen
 +$stmt = $connection->prepare('SELECT * FROM sys.Tables;');
 +$stmt->execute();
 +
 +// alles anzeigen
 +$allResults = $stmt->fetchAll();
 +//print_r($allResults);
 +
 +foreach($allResults as $key=>$val){  
 +        print ($val["name"] . "\n"); 
 +}
 +
 +// alles wieder zu machen
 +mssql_free_result($stmt);
 +mssql_free_result($allResults);
 +mssql_close($connection);
 +?>
 +</file>
 +
 +Beispiel:
 +  > php mssql_show.php dblib Benutzer geheimesPasswort 192.168.0.33 49411 DatenbankName
 +
 +
 +<file php mssql_show_databases.php>
 +<?php
 +
 +//
 +// Verbindung zu einer MS-SQL-DB
 +//
 +
 +// Argumente
 +$dbuser = 'benutzer';
 +$dbpass = 'geheim';
 +$dbhost = 'host.domain.net';
 +$dbport = '1433';
 +$dbname = 'datenbankname';
 +$dbdrvr = 'dblib';
 + 
 +// Abfrage definieren
 +$sql = "SELECT name, database_id, create_date FROM sys.databases;";
 + 
 +// Verbindung zur Datenbank aufbauen
 +$dbh = new pdo($dbdrvr . ':host=' . $dbhost . ';port=' . $dbport , $dbuser , $dbpass);
 +
 +foreach ($dbh->query($sql) as $row) {
 +   echo "| " . $row['database_id'] . " | " . $row['create_date'] . " | " . $row['name'] . " |" . "\n";
 +}
 + 
 +// und nach der Nutzung, die Verbindung beenden
 +$dbh = null;
 +
 +exit();
 +?>
 +
 +</file>
 +
 +
 +=== MySQL-Datenbankzugriff über eine per SSL/TLS verschlüsselte Verbindung ===
 +
 +[[::Datenbankverbindungen zu einer MySQL mit SSL-Verschlüsselung]]
 +
 +
 +===== PHP-Script um Spammer zu finden =====
 +
 +Um einen Spammer zu finden, der per PHP-Befehl Mails versendet, gibt es einen
 +einfachen Trick - man verwendet ein Handlerscript.
 +
 +Man lässt die Mails von PHP nicht direkt an sendmail senden, sondern an ein
 +Script, welches zuerst einen Syslog-Eintrag vornimmt und dann die Mail an
 +sendmail weitergibt. Dabei setzt das Script vor die Mail (also als erste
 +Headerzeile) eine Zeile, die den Web-User enthält.
 +
 +So kann man sowohl im Syslog-Logfile zählen, wer wie viele Mails verschickt wie
 +auch im Header der Mail bei Abuse-Beschwerden sehen, wer die Nachrichten
 +versendet hat.
 +
 +Folgendes Script kann hier eingesetzt werden:
 +---------------------------------------------
 +        #!/bin/bash
 +        logger -t sendmail-php -- Message sent from $1 &> /dev/null
 +        (
 +        echo "X-ConfixxWeb: $1"
 +        cat
 +        ) | /usr/sbin/sendmail -t -i
 +
 +
 +Das Script wird unter /usr/sbin/sendmail-php gespeichert und mit
 +  chmod 755 /usr/sbin/sendmail-php
 +ausführbar gemacht.
 +
 +Nun muss man noch dafür sorgen, dass PHP nicht mehr sendmail nutzt, sondern
 +sendmail-php. Dies lässt sich bei Systemen ohne Confixx in den VirtualHost
 +Einstellungen von Apache machen:
 +
 +        <VirtualHost>
 +        ...
 +        php_admin_value sendmail_path "/usr/sbin/sendmail-php www1"
 +        </VirtualHost>
 +
 +Auf Rechnern mit Confixx lässt sich das für mehrere User gleichzeitig setzen, wenn man
 +folgende Zeile bei httpd-specials für den User setzt:
 +
 +        php_admin_value sendmail_path "/usr/sbin/sendmail-php ##user##"
 +
 +Die Funktion kann man testen, indem man folgendes PHP-Script in ein
 +Webverzeichnis setzt und per http aufruft:
 +
 +        <?php
 +          $from="example@server.de";
 +          $to="deinname@server.de";
 +          $subject="Testnachricht - bitte loeschen!";
 +          $message="Testnachricht - bitte loeschen!";
 +          mail($to, $subject, $message, "From: $from");
 +          echo "<h1>Die Nachricht wurde versendet.</h1>";
 +        ?>
 +
 +Dies sollte folgenden Eintrag im Syslog (/var/log/syslog oder bei Suse
 +/var/log/messages) ergeben:
 +
 +        Jun 30 18:00:00 hostname sendmail-php: Message sent from www1
 +
 +Einen Ueberblick erhä man schnell durch folgendes Kommando:
 +
 +        cat /var/log/syslog | grep sendmail-php
 +
 +Weiterhin sollte die Nachricht direkt unter den Received Zeilen folgenden
 +Header enthalten:
 +
 +        X-ConfixxWeb: www1
 +
 +Spamnachrichten lassen sich damit schnell einem User zuordnen.
 +
 +Mit folgendem Kommando lä sich herausfinden, welcher User laut aktuellem
 +Syslog wie viele Nachrichten versendet hat:
 +
 +        grep sendmail-php /var/log/syslog | awk '{print $9}' | sort | uniq -c | sort -n
 +
 +
 +===== PHP-Script um das Format von Bildern zu ermitteln =====
 +
 +  * [[dateinamen_und_verzeichnisnamen_automatisiert_aendern#home_bin_bildformatphp|/home/bin/bildformat.php]]
 +
 +
 +==== /home/bin/bildformat.php ====
 +
 +  #!/bin/php
 +  
 +  <?php
 +          #
 +          #print_r(get_defined_vars());
 +          #
 +  
 +          $info = getimagesize ($argv['1']);
 +  
 +          print $info['0'] . "x" . $info['1'];
 +  
 +          #print "\n";
 +          #print $info['3'];
 +  ?>
 +
 +
 +==== Beispiel ====
 +
 +Damit dieses Script unter FreeBSD genauso funktioniert,
 +wie unter Linux, muss ein symbolischer Link angelegt werden:
 +  # ln -s /usr/local/bin/php /bin/
 +
 +So benutzt man das Script:
 +  # /home/bin/bildformat.php fotos/Bild_0001.jpg
 +  
 +  2272x1704
 +
 +
 +
 +===== Array in einen String umwandeln und dann mit SED und GREP bearbeiten =====
 +
 +
 +==== Aufgabenstellung ====
 +
 +Im Array "$_SERVER" findet sich die folgende Zeichenkette:
 +  ["QUERY_STRING"]=> string(743) "ceph_storage_id=1&pool_name=erster-pool&lunsmax=8&lunssort=pool_lun_name&lunsorder=ASC&lunsoffset=0&lunslimit=20&pool_lun_snap_name=test1_lun.20180813125125&ceph_storage_id=1&pool_name=erster-pool&pool_lun_name=test1_lun&pool_lun_snap_name=test1_lun.20180813125125&action=takesnap&identifier%5B%5D=test1_lun&pool_lun_snap_name=test2_lun.20180813125125&identifier%5B%5D=test2_lun&pool_lun_snap_name=test3_lun.20180813125125&pool_lun_snap_name=test4_lun.20180813125125&pool_lun_snap_name=test5_lun.20180813125125&pool_lun_snap_name=test6_lun.20180813125125&pool_lun_snap_name=test7_lun.20180813125125&pool_lun_snap_name=test8_lun.20180813125125"
 +
 +In dieser Zeichenkette gibt es die beiden Schlüsselwörter "pool_lun_name" und "pool_lun_snap_name".
 +Leider ist das Schlüsselwort "pool_lun_snap_name" mehrfach vorhanden, so das dieser Schlüssel immer den letzten Wert haben würde, wenn man dieses String in ein Array umwandeln würde.
 +Um den richtigen Wert von den 5 "pool_lun_snap_name"-Schlüsseln zu ermitteln, brauchen wir erst den Wert des Schlüssels "pool_lun_name".
 +Der richtige Wert bzw. der gesuchte Wert von "pool_lun_snap_name" beinhaltet im ersten Teil den kompletten Wert von "pool_lun_name".
 +
 +Zum Beispiel
 +  pool_lun_name=test1_lun
 +  pool_lun_snap_name=test1_lun.20180813125125
 +
 +Also wird der "pool_lun_snap_name"-Wert gesucht, der mit "test1_lun" (Wert vom "pool_lun_name"-Schlüssel) gefolgt von einem "." anfängt.
 +
 +
 +==== Lösung ====
 +
 +<file c _SERVER>
 +_SERVER:
 +array(60) {
 +  ["HTTPS"]=>
 +  string(2) "on"
 +  ["SSL_SERVER_S_DN_CN"]=>
 +  string(9) "hostname"
 +  ["SSL_SERVER_I_DN_CN"]=>
 +  string(20) "Puppet CA: hostname"
 +  ["SSL_VERSION_INTERFACE"]=>
 +  string(13) "mod_ssl/2.4.7"
 +  ["SSL_VERSION_LIBRARY"]=>
 +  string(14) "OpenSSL/1.0.1f"
 +  ["SSL_PROTOCOL"]=>
 +  string(7) "TLSv1.2"
 +  ["SSL_SECURE_RENEG"]=>
 +  string(4) "true"
 +  ["SSL_COMPRESS_METHOD"]=>
 +  string(4) "NULL"
 +  ["SSL_CIPHER"]=>
 +  string(27) "ECDHE-RSA-AES128-GCM-SHA256"
 +  ["SSL_CIPHER_EXPORT"]=>
 +  string(5) "false"
 +  ["SSL_CIPHER_USEKEYSIZE"]=>
 +  string(3) "128"
 +  ["SSL_CIPHER_ALGKEYSIZE"]=>
 +  string(3) "128"
 +  ["SSL_CLIENT_VERIFY"]=>
 +  string(4) "NONE"
 +  ["SSL_SERVER_M_VERSION"]=>
 +  string(1) "3"
 +  ["SSL_SERVER_M_SERIAL"]=>
 +  string(2) "02"
 +  ["SSL_SERVER_V_START"]=>
 +  string(24) "Jun 1 09:00:00 2015 GMT"
 +  ["SSL_SERVER_V_END"]=>
 +  string(24) "Jun 2 09:00:00 2020 GMT"
 +  ["SSL_SERVER_S_DN"]=>
 +  string(12) "CN=hostname"
 +  ["SSL_SERVER_I_DN"]=>
 +  string(23) "CN=Puppet CA: hostname"
 +  ["SSL_SERVER_A_KEY"]=>
 +  string(13) "rsaEncryption"
 +  ["SSL_SERVER_A_SIG"]=>
 +  string(23) "sha256WithRSAEncryption"
 +  ["SSL_SESSION_ID"]=>
 +  string(64) "e7lb7l4938558ld33da984ldl42c99f56286ffb25lef95298496f770lb6a7959"
 +  ["SSL_SESSION_RESUMED"]=>
 +  string(7) "Resumed"
 +  ["HTTP_HOST"]=>
 +  string(10) "10.10.10.100"
 +  ["HTTP_USER_AGENT"]=>
 +  string(76) "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
 +  ["HTTP_ACCEPT"]=>
 +  string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
 +  ["HTTP_ACCEPT_LANGUAGE"]=>
 +  string(35) "de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3"
 +  ["HTTP_ACCEPT_ENCODING"]=>
 +  string(17) "gzip, deflate, br"
 +  ["HTTP_REFERER"]=>
 +  string(349) "https://10.10.10.100/der/pfad/zum/skript.php?strMsg=Liste+der+Luns+auf+erster-pool+im+Ceph-Pool+1%3Cbr%3E%3Cpre%3E%3Cb%3EEs+gibt+keine+Snapshots.%0A%3C%2Fb%3E%3C%2Fpre%3E%2Ftmp%2Fceph-storage-manager%2F3961498%2F0.ceph.lun.listsnap¤ttab=tab0&redirect=yes&action=listsnap&ceph_storage_id=1&pool_name=erster-pool"
 +  ["HTTP_COOKIE"]=>
 +  string(48) "phplm_expand=menu2_30|menu2_31|; phplm_collapse="
 +  ["HTTP_DNT"]=>
 +  string(1) "1"
 +  ["HTTP_CONNECTION"]=>
 +  string(10) "keep-alive"
 +  ["HTTP_UPGRADE_INSECURE_REQUESTS"]=>
 +  string(1) "1"
 +  ["PATH"]=>
 +  string(60) "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 +  ["SERVER_SIGNATURE"]=>
 +  string(71) "
 +Apache/2.4.7 (Ubuntu) Server at 10.10.10.100 Port 443
 +
 +"
 +  ["SERVER_SOFTWARE"]=>
 +  string(21) "Apache/2.4.7 (Ubuntu)"
 +  ["SERVER_NAME"]=>
 +  string(10) "10.10.10.100"
 +  ["SERVER_ADDR"]=>
 +  string(10) "10.10.10.100"
 +  ["SERVER_PORT"]=>
 +  string(3) "443"
 +  ["REMOTE_ADDR"]=>
 +  string(9) "10.10.10.17"
 +  ["DOCUMENT_ROOT"]=>
 +  string(8) "/var/www"
 +  ["REQUEST_SCHEME"]=>
 +  string(5) "https"
 +  ["CONTEXT_PREFIX"]=>
 +  string(0) ""
 +  ["CONTEXT_DOCUMENT_ROOT"]=>
 +  string(8) "/var/www"
 +  ["SERVER_ADMIN"]=>
 +  string(19) "webmaster@localhost"
 +  ["SCRIPT_FILENAME"]=>
 +  string(67) "/var/www/der/pfad/zum/skript.php"
 +  ["REMOTE_PORT"]=>
 +  string(5) "33266"
 +  ["REMOTE_USER"]=>
 +  string(7) "benutzer"
 +  ["AUTH_TYPE"]=>
 +  string(5) "Basic"
 +  ["GATEWAY_INTERFACE"]=>
 +  string(7) "CGI/1.1"
 +  ["SERVER_PROTOCOL"]=>
 +  string(8) "HTTP/1.1"
 +  ["REQUEST_METHOD"]=>
 +  string(3) "GET"
 +  ["QUERY_STRING"]=>
 +  string(743) "ceph_storage_id=1&pool_name=erster-pool&lunsmax=8&lunssort=pool_lun_name&lunsorder=ASC&lunsoffset=0&lunslimit=20&pool_lun_snap_name=test1_lun.20180813125125&ceph_storage_id=1&pool_name=erster-pool&pool_lun_name=test1_lun&pool_lun_snap_name=test1_lun.20180813125125&action=takesnap&identifier%5B%5D=test1_lun&pool_lun_snap_name=test2_lun.20180813125125&identifier%5B%5D=test2_lun&pool_lun_snap_name=test3_lun.20180813125125&pool_lun_snap_name=test4_lun.20180813125125&pool_lun_snap_name=test5_lun.20180813125125&pool_lun_snap_name=test6_lun.20180813125125&pool_lun_snap_name=test7_lun.20180813125125&pool_lun_snap_name=test8_lun.20180813125125"
 +  ["REQUEST_URI"]=>
 +  string(803) "/der/pfad/zum/skript.php?ceph_storage_id=1&pool_name=erster-pool&lunsmax=8&lunssort=pool_lun_name&lunsorder=ASC&lunsoffset=0&lunslimit=20&pool_lun_snap_name=test1_lun.20180813125125&ceph_storage_id=1&pool_name=erster-pool&pool_lun_name=test1_lun&pool_lun_snap_name=test1_lun.20180813125125&action=takesnap&identifier%5B%5D=test1_lun&pool_lun_snap_name=test2_lun.20180813125125&identifier%5B%5D=test2_lun&pool_lun_snap_name=test3_lun.20180813125125&pool_lun_snap_name=test4_lun.20180813125125&pool_lun_snap_name=test5_lun.20180813125125&pool_lun_snap_name=test6_lun.20180813125125&pool_lun_snap_name=test7_lun.20180813125125&pool_lun_snap_name=test8_lun.20180813125125"
 +  ["SCRIPT_NAME"]=>
 +  string(59) "/der/pfad/zum/skript.php"
 +  ["PHP_SELF"]=>
 +  string(59) "/der/pfad/zum/skript.php"
 +  ["PHP_AUTH_USER"]=>
 +  string(7) "benutzer"
 +  ["PHP_AUTH_PW"]=>
 +  string(10) "geheim"
 +  ["REQUEST_TIME_FLOAT"]=>
 +  float(1534158435.146)
 +  ["REQUEST_TIME"]=>
 +  int(1534158435)
 +}
 +</file>
 +
 +aus dem Array "$_SERVER" wird der String von "QUERY_STRING" in ein Array umgewandelt, in dem die Werte für //Key// und //Value// zusammen als //Value// eingetragen werden:
 +  $server_query_array = explode('&', $_SERVER['QUERY_STRING']);
 +
 +das eben erzeugte Array wird in einen String umgewandelt:
 +  $server_query_string = implode('&', $server_query_array);
 +
 +in dem String werden die "&" gegen " " (Leerzeichen) ausgetauscht:
 +  $neuer_string = preg_replace("/[&]/", " ", $server_query_string);
 +
 +hier definieren wir eine Zeichenfolge, nach der wir suchen werden:
 +  $pattern   = 'pool_lun_name';
 +
 +hier ermitteln wir die Position, an der das Suchmuster beginnt:
 +  $pool_lun_name_pos = strpos($neuer_string, "$pattern=");
 +
 +hier ermitteln wir, an welcher stelle der Wert nach dem Suchmuster zuende ist:
 +  $pool_lun_name_end = strpos($neuer_string, " ", $offset = $pool_lun_name_pos);
 +
 +hier wird das gesuchte Schlüsselwort (Suchmuster) mit seinem Wert ermittelt:
 +  $pool_lun = trim(substr($neuer_string, $pool_lun_name_pos, $pool_lun_name_end - $pool_lun_name_pos));
 +
 +hier wird aus der gefundenen Zeichenfolge nur der Wert gespeichert:
 +  $pool_lun_name = preg_replace("/pool_lun_name[=]/", "", $pool_lun);
 +
 +jetzt können wir endlich nach dem richtigen Wert der 5 gleichen Schlüsselwörter suchen, hier wird die Startposition davon abgespeichert:
 +  $pool_lun_snap_name_pos = strpos($neuer_string, "=$pool_lun_name.");
 +
 +hier wird die Endposition des gesuchten Wertes abgespeichert:
 +  $pool_lun_snap_name_end = strpos($neuer_string, " ", $offset = $pool_lun_snap_name_pos);
 +
 +hier schneiden wir uns aus der gespeicherten Zeichenkette den Wert aus, den wir letztendlich gesucht haben:
 +  $pool_lun_snap_name = trim(substr($neuer_string, $pool_lun_snap_name_pos + "1", $pool_lun_snap_name_end - $pool_lun_snap_name_pos));
 +  echo $pool_lun_snap_name;
 +
 +
 +wir wollen die 3 Zeichen "xyz" haben, die unmittelbar vor einer bekannten Zeichenkette ":abc defg:" im "$datensatz" stehen
 +  $string_pos = strpos($datensatz, ':abc defg:');
 +  $gesuchter_string = trim(substr($datensatz, $string_pos - 3, 3));
 +bei "... xyz:abc defg: ..." ist die Zeichenkette "xyz" gesucht aber nur ":abc defg:" ist bekannt.
 +
 +
 +===== ein kleines Beispiel =====
 +
 +[[https://192.168.1.80/openqrm/base/server/konfig_mgmt/konfigurations-management.php?konfig_mgmt=ja]]
 +
 +<file bash /usr/lib/cgi-bin/konfigurations_management.sh>
 +#!/bin/bash
 +
 +#------------------------------------------------------------------------------#
 +#
 +# Status melden
 +#
 +#------------------------------------------------------------------------------#
 +
 +if [ "x${1}" != "x" ] ; then
 +        echo "$(date +'%F %T'): Status = '${1}'" >> /tmp/konfigurations_management.log
 +fi
 +</file>
 +
 +<file php /usr/share/openqrm/web/base/server/konfig_mgmt/konfigurations-management.php>
 +<?php
 +/*
 +Mit diesem Skript sollen der Status gemeldet werden.
 +*/
 +
 +//phpinfo();
 +
 +//
 +// GET-Daten in Variablen schreiben
 +// das letzte übergebene Schlüssel-Wert-Paar gilt,
 +// weil alle anderen überschrieben werden
 +//
 +foreach ($_GET as $key => $value) {
 +        if (strncmp($key, "konfig_mgmt") == 0) {
 +                $status .= $value;
 +        }
 +}
 +
 +//echo    "1: " . $status . "<br>";
 +//print   "2: " . $status . "<br>";
 +//print_r("3: " . $status . "<br>");
 +
 +//print "/usr/lib/cgi-bin/konfigurations_management.sh " . $status . "<br>";
 +
 +//
 +// Variablen-Inhalt einem SHELL-Script übergeben
 +//
 +$KOMMANDO1 = "/usr/lib/cgi-bin/konfigurations_management.sh " . $status;
 + 
 +//
 +// SHELL-Kommando ausführen
 +//
 +echo shell_exec("$KOMMANDO1;");
 + 
 +?>
 +
 +<html>
 +<head>
 +<title>openQRM Konfigurations-Management</title>
 +</head>
 +<body>
 +
 +Status
 +
 +</body>
 +</file>
 +
 +  > cat /tmp/konfigurations_management.log
 +
 +
 +===== Zeichenketten mit PHP verschlüsseln =====
 +
 +Vorher muß das Paket ''php-cli'' (z.B.: ''apt install php7.4-cli'') installiert werden.
 +
 +
 +==== Vorbereitung für das Beispiel ====
 +
 +als erstes benötigen wir ein RSA-Schlüsselpaar:
 +  > openssl genrsa -out openssl_private_key.pem 4096
 +  > openssl rsa -in openssl_private_key.pem -out openssl_public_key.pem -outform PEM -pubout
 +
 +
 +==== ein einfaches Beispiel ====
 +
 +  > php /tmp/php_openssl_verschl.php
 +  > ls -lha verschluesselt.txt
 +  -rw-rw-r-- 1 fritz fritz 684 Jun  9 17:03 verschluesselt.txt
 +  
 +  > php /tmp/php_openssl_entschl.php 
 +  Hallo Welt!
 +
 +//In diesem Beispiel wird, mit dem ersten Aufruf, die Zeichenkette "''Hallo Welt!''", verschlüsselt, in eine Datei geschrieben.
 +Und mit dem zweiten Aufruf wird der Inhalt der Datei wieder entschlüsselt und ausgegeben.//
 +
 +<file php php_openssl_verschl.php>
 +<?php
 +openssl_public_encrypt("Hallo Welt!", $crypttext, trim(file_get_contents("openssl_public_key.pem")));
 +
 +$dateihandle = fopen("verschluesselt.txt","w");
 +$b64crypt = base64_encode("$crypttext");
 +
 +fwrite($dateihandle, $b64crypt);
 +fclose($dateihandle);
 +?>
 +</file>
 +
 +<file php php_openssl_entschl.php>
 +<?php
 +$crypttext=base64_decode(trim(file_get_contents("verschluesselt.txt")));
 +
 +openssl_private_decrypt("$crypttext", $decrypted, trim(file_get_contents("openssl_private_key.pem")));
 +
 +echo "$decrypted";
 +?>
 +</file>
 +
 +
 +==== Ein- und Ausgabe soll über jeweils eine Datei laufen ====
 +
 +  > echo "Hallo Welt!" > entschluesselt.txt
 +  > php /tmp/php_openssl_verschl.php
 +  > ls -lha verschluesselt.txt 
 +  -rw-rw-r-- 1 fritz fritz 684 Jun  9 17:24 verschluesselt.txt
 +  
 +  > rm entschluesselt.txt
 +  > php /tmp/php_openssl_entschl.php 
 +  
 +  > cat entschluesselt.txt ; echo
 +  Hallo Welt!
 +
 +<file php php_openssl_verschl.php>
 +<?php
 +openssl_public_encrypt(trim(file_get_contents("entschluesselt.txt")), $crypttext, trim(file_get_contents("openssl_public_key.pem")));
 + 
 +$dateihandle = fopen("verschluesselt.txt","w");
 +$b64crypt = base64_encode("$crypttext");
 +
 +fwrite($dateihandle, $b64crypt);
 +fclose($dateihandle);
 +?>
 +</file>
 +
 +<file php php_openssl_entschl.php>
 +<?php
 +$crypttext=base64_decode(trim(file_get_contents("verschluesselt.txt")));
 +openssl_private_decrypt("$crypttext", $decrypted, trim(file_get_contents("openssl_private_key.pem")));
 + 
 +$dateihandle = fopen("entschluesselt.txt","w");
 +
 +fwrite($dateihandle, $decrypted);
 +fclose($dateihandle);
 +?>
 +</file>
 +