<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Joopi - Migrationssammler]]></title>
		<link>https://forum.hermann-splitthoff.de/</link>
		<description><![CDATA[Joopi - https://forum.hermann-splitthoff.de]]></description>
		<pubDate>Sat, 02 May 2026 07:40:36 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Groß-/Kleinschreibung nicht beachten]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=2180</link>
			<pubDate>Sun, 02 Nov 2025 09:57:22 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=2180</guid>
			<description><![CDATA[In der Bash wird bei der Ausführung von Befehlen die Groß-/Kleinschreibung standardmäßig beachtet. Um selber steuern zu können, ob die Groß-/Kleinschreibung beachtet wird oder nicht, gibt es folgende Parameter, die bei <span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color">find</span></span> oder <span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color">grep</span></span> genutzt werden können.<br />
<br />
Ein Beispiel für die Beachtung von Groß-/Kleinschreibung mit dem Befehl <span style="font-weight: bold;" class="mycode_b">find</span> (case-sensitive / case-insensitive):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>find . -iname "*.jpg"</code></div></div><br />
<span style="font-size: large;" class="mycode_size">-name = case-sensitive<br />
-<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color">i</span></span>name = case-insensitive</span><br />
<br />
Der Standard für den Befehl <span style="font-weight: bold;" class="mycode_b">grep</span> ist, dass Groß-/Kleinschreibung beachtet wird. Um diesen auszuschalten, ist die Option <span style="font-weight: bold;" class="mycode_b">-i</span> notwendig.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>grep -i "error" /var/log/*.log</code></div></div><br />
Es werden also alle Log-Dateien, egal wie sie benannt wurden, durchsucht.]]></description>
			<content:encoded><![CDATA[In der Bash wird bei der Ausführung von Befehlen die Groß-/Kleinschreibung standardmäßig beachtet. Um selber steuern zu können, ob die Groß-/Kleinschreibung beachtet wird oder nicht, gibt es folgende Parameter, die bei <span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color">find</span></span> oder <span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color">grep</span></span> genutzt werden können.<br />
<br />
Ein Beispiel für die Beachtung von Groß-/Kleinschreibung mit dem Befehl <span style="font-weight: bold;" class="mycode_b">find</span> (case-sensitive / case-insensitive):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>find . -iname "*.jpg"</code></div></div><br />
<span style="font-size: large;" class="mycode_size">-name = case-sensitive<br />
-<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color">i</span></span>name = case-insensitive</span><br />
<br />
Der Standard für den Befehl <span style="font-weight: bold;" class="mycode_b">grep</span> ist, dass Groß-/Kleinschreibung beachtet wird. Um diesen auszuschalten, ist die Option <span style="font-weight: bold;" class="mycode_b">-i</span> notwendig.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>grep -i "error" /var/log/*.log</code></div></div><br />
Es werden also alle Log-Dateien, egal wie sie benannt wurden, durchsucht.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Einigen Code zu MySQL]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1368</link>
			<pubDate>Sat, 23 Nov 2024 19:06:12 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1368</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">MySQL - wichtige Stringfunktionen</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">CHAR_LENGTH(str ):</span> Gibt die Länge eines Strings zurück. Sehr interessant um zu wissen wie lange eine Zeichenkette ist. Diese Funktion zählt die Zeichen, nicht die Bytes.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT CHAR_LENGTH( "Hallo" );</code></div></div><br />
ergibt also:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>5</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">LEFT(str,len)</span>: Gibt die ersten len Buchstaben eines Strings der linken Seite zurück.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT LEFT( "das ist ein Test", 9 );</code></div></div><br />
würde demzufolge "das ist e" zurückgeben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">RIGHT(str,len)</span>: Gibt dementsprechend die rechte Seite eines Strings zurück.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT RIGHT("Das ist ein TEST",10);</code></div></div><br />
ist dann "t ein TEST".<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - verbinden zweiter Tabellen per JOIN</span><br />
<br />
Sehr häufig müssen 2 Tabellen miteinander verbunden werden. Denn oft stehen Tabellen mit einander in Verbindung. Zum Beispiel beinhaltet eine Tabelle mit Kundendaten in einer Spalte das Bundesland in dem der Kunde wohnt. Natürlich könnte man jetzt immer dort "Hessen" eintragen. Geschickter ist es aber in dieser Spalte nur eine Nummer zu hinterlegen, die in der Tabelle "Bundesländer" dann mit der id von Hessen verknüpft ist.<br />
<br />
Viele werden jetzt sagen: "Hessen ist doch schnell getrippt, warum Tabellen verbinden". Das schöne ist, man kann komplette Datensätze miteinander verbinden, ohne alle Angaben nochmal eintragen zu müssen. Zum Beispiel braucht man dann in einer Tabelle "Rechnungen" nicht mehr alle Kundeninformationen speichern wie z.B. Name, Strasse, plz, ort. Sondern man speichert nur noch die Zahl oder id des Kunden aus der "Kundentabelle". Man spricht hier von Entitäten.<br />
<br />
Eingie Varianten sind LEFT JOIN, RIGHT JOIN, oder INNER JOIN. Hier mal 3 Beispiele:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
INNER JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Bei einem INNER JOIN werden zum Beispiel nur die Daten angezeigt, die in beiden Tabellen übereinstimmen. Also werden in diesem Fall nur Kunden mit einer Rechnung angezeigt.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
LEFT JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Bei einem LEFT JOIN werden zum Beispiel alle Daten der Linken Tabelle des Joins angezeigt, und wenn in der Rechten Tabelle keine übereinstimmenden Daten vorhanden sind, bleiben diese Spalten dann eben leer. Also werden in diesem Fall alle Kunden angezeigt, ob Sie eine rechnunge haben oder nicht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
RIGHT JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Dieses Beispiel macht eigentlich keinen Sinn. Es besagt, daß alle Rechnungen angezeigt werden sollen, auch wenn es für diese Rechnung in der Tabelle Kunden keinen Kunden gibt. Und Rechnungen ohne Kunden machen nun wirklich keinen Sinn. Aber dennoch braucht man diese Funktion. Stellen Sie sich zum Beispiel den Fall vor, daß ein Kunde aus versehen aus der Kundentabelle gelöscht wurde. Mit dieser Funktion kann man jetzt nach Rechnungen suchen, die keinen Kunden haben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Bei einer MySQL die Standart-Kollation ändern</span><br />
<br />
Da hat man eine neue MySQL Datenbank angelegt, und muss nach dem Einfügen der Tabellen mit entsetzen feststellen, dass alle Text-Spalten mit der Standart Kollation latin1_swedish_ci angelegt werden. Da kann es dann schon mal zu Problemen mit den Umlauten kommen. Wie kann man jetzt den Standart der Kollation auf einen Anderen setzen? Hier ist der SQL-Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ALTER DATABASE `db-name` <br />
DEFAULT CHARACTER SET latin1 <br />
COLLATE  latin1_german1_ci;</code></div></div><br />
Wenn man, wie es normalerweise der Fall ist, oft mit Umlauten und vielleicht sogar mit der russischen Schrift arbeitet, dann ist es besser folgende Collation zu benutzen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ALTER DATABASE `db422430845` <br />
DEFAULT CHARACTER SET utf8 <br />
DEFAULT COLLATE utf8_general_ci;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - aktuelle Zeit oder Datum in eine Spalte schreiben</span><br />
<br />
Sehr oft kommt es for daß man das aktuelle Datum in eine Spalte einer Tabelle eintragen will. Sehr häufig benutzt man es für eine Spalte in der der letzte Log-In protokolliert wird. Oder man will festhalten wann ein Datensatz angelegt, oder das letzte Mal geändert wurde. Man kann das in php erledigen, und den wert dann gleich richtig formatiert mitschicken, man könnte das aber sofort und einfacher per MySQL erledigen. Hier wird jetzt das Datum samt Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19 10:03:25'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=NOW()</code></div></div><br />
Wenn Sie nur das Datum eintragen möchten, dann wäre das hier das richtige. Hier wird jetzt nur das Datum im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=CURDATE()</code></div></div><br />
Wegen der Vollständigkeit hier noch die Zeit. Mit den beiden letzten funktionen könnte man dann die Logindaten in zwei verschiedene Spalten schreiben. Eine für das Datum eine für die Zeit. Hier wird jetzt die Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '10:03:25'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=CURTIME( );</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Ein Deutsches Datum per SQL in die Datenbank schreiben</span><br />
<br />
Oft steht man vor dem Problem, daß mann ein Deutsches Datum in eine Zelle schreiben muss. Doch dummerweise versteht MySQL das deutsche Datumsformat nicht. Oft wird dann mit php oder anderen Scripten das Datum in kleine Teilstrings zerstückelt. Doch hier gibt es einen kleinen netten SQL-Befhel, der das alles wie von selbst macht. Hier ist der SQL-Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>INSERT INTO `tabelle` (`id` ,`datum`) VALUES ('', STR_TO_DATE('14.04.2006', '%d.%m.%Y'));</code></div></div><br />
MySQL - Ein Datum aus der MySQL-Datenbank im Deutschen Format anzeigen<br />
<br />
Wir wissen jetzt, wie man ein Deutsches Datum in die Datenbank bekommt. Doch wie bekommt man es jetzt von dort wieder im Deutschen Format raus ??? Hierfür gibt es jetzt noch ein MySQL-Befehl, und der sieht so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT DATE_FORMAT(datum, '%d.%m.%Y') AS MeinDatum FROM tabelle;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Mit IN Array eine MySQL-Datenbank durchsuchen</span><br />
<br />
Manchmal kommt es vor, daß man eine Datenbank nach mehreren Begriffen durchsuchen muss. Man könnte jetzt natürlich die Begriffe aneinanderreihen nach dem Motto: "WHERE test LIKE 'A' OR test LIKE 'B' OR test LIKE 'C' ". Aber das macht den MySQL Code sehr unübersichtlich, wenn man mal gerne 20 oder mehr Begriffe abfragen möchte. Hier gitb es eine tolle Hilfe. Den Befehl IN ('A', 'B', 'C').<br />
<br />
So würde das Ganze dann aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * <br />
FROM tabelle<br />
WHERE test IN ('A', 'B', 'C');</code></div></div><br />
Wenn das Array schon in php in einer Variable vorliegt, könnte man das Ganze noch besser machen. Und zwar so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;array = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I');<br />
&#36;SQLarray = "'" . implode("','", &#36;array) . "'";<br />
<br />
&#36;MySQL = "SELECT * FROM tabelle WHERE test IN (&#36;SQLarray);";<br />
echo &#36;MySQL;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Datensätze aus zwei Spalten in einer Spalte zusammenfassen</span><br />
<br />
Ab und zu kommt es auch vor, daß man die Werte zweier Spalten in einer Spalte zusammenfassen möchte. Auch hierfür gibt es einen bestimmten SQL-Befehl. In meinem Beispiel werden die beiden Werte mit einem Komma getrennt in die 3. Spalte geschrieben. Hier ist der SQL-Code:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE INTO tabelle1  <br />
SET Spalte3 = CONCAT( Spalte1, ', ', Spalte2 )<br />
WHERE bedingung = 1</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Mit IF eine MySQL-Datenbank abfragen</span><br />
<br />
Heute ist es mir mal wieder passiert, dass ich in einer Datenbank eine Abfrage machen wollte mit der man auf einen bestimmten Umstand anders reagieren könnte. Und dabei ist mir mal wieder nicht die richtige Syntax eingefallen. Ich wollte den Inhalt einer Spalte abfragen, und wenn diese nicht vorhanden ist, soll der Wert einer anderen Spalte genommen werden.<br />
<br />
Der Grund dafür könnte sein, dass eine Tabelle verschiedene Sprachversionen in den einzelnen Spalten ist, und wenn jetzt z.B. Spanisch noch nicht übersetzt ist, soll er eben die Übersetzung aus der Englischen Spalte nehmen.<br />
<br />
So würde das Ganze dann aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT IF(spanisch LIKE '',englisch,spanisch) AS MeinText<br />
FROM tabelle<br />
WHERE id = 1;</code></div></div><br />
<br />
Das schöne daran ist, ich kann jetzt in meinem php Code einfach echo &#36;row['MeinText']; einbauen und muss mich dann hier nicht mit einer php IF-Then-Else Geschichte rumplagen, da es in MySQL doch einfacher zu handhaben ist.<br />
<br />
Vielleicht hilft Euch das ja weiter. Mir hat es zumindest geholfen. :-)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Datensätze suchen, die nicht einer Anforderung entsprechen</span><br />
<br />
Heute stand ich vor dem Problem Datensätze zu suchen, die einem Kriterium nicht entsprechne dürfen. Da ich dies schon öfter benutzt habe und heute danach gefragt wurde, möchte ich dies jetzt hier für die Nachwelt festhalten. Hier ist der relativ simple SQL-Code für My SQL<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM teballe <br />
WHERE spalte NOT LIKE 'SuchBegriff';</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Bei einer WHERE Abfrage nach einem Teilstring suchen</span><br />
<br />
Wie macht man es, wenn man nur nach einem Teilstring in MySQL suchen möchte? Das ist sehr ähnlich wie bei MS Access. Einfach mit left und right scuhen, wenn sich der Teilstring am Ende oder am Anfang befindet.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE left(spalte, 5) LIKE '12345';</code></div></div><br />
Eine andere Möglichkeit wäre natürlich mit dem Platzhaltersymbol '%' zu suchen. Dann findet er diesen Teilstring egal wo sich dieser in der Spalte befindet.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE spalte LIKE '%12345%';</code></div></div><br />
In diesem Zusammenhang sei noch erwänt, daß man auch nach einem String suchen kann, bei dem man einen oder mehrere Buchstaben durch einen Platzhalter oder Joker ersetzt. In dem unten gezeigten Beispiel findet er 12345 oder auch 10345. Das ist zum Beispiel interessant, wenn man nicht mehr weiß ob man in einem Spanischen Wort das 'ñ' mit einem normalen 'n' geschrieben hat oder nicht. So könnte man dann nach 'Espa_a' suchen und er würde 'España' und auch 'Espana' finden.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE spalte LIKE '%1_345%';</code></div></div><br />
Letzte Änderung dieser Information:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>19.01.2012 10:47 h</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Nach einem Strings einer bestimmten Länge suchen</span><br />
<br />
Manchmal könnte es vorkommen, daß man Strings sucht, die eine bestimmte Länge aufweisen. So ist es mir zumindest heute ergangen. Dafür gibt es auch SQL Funktionen. Für meinen Fall half mir heute diese SQL.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT *<br />
FROM tabelle<br />
WHERE CHAR_LENGTH( spalte ) &gt;5;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Eine Spalte in zwei Tabellen vergleichen und fehlende anzeigen</span><br />
<br />
Soeben habe ich mich gefragt, wie man eine Spalte in zwei Tabellen vergleichen kann. Ich hatte zwei Tabellen, die eigentlich die gleiche Anzahl von datensätzen haben sollte. Hatten Sie aber nicht. Die eine Tabelle hatte einen Satz mehr. Damit ich nicht meine Jugendzeit damit verbringe, diesen einen Satz zu suchen, habe ich eine SQL-Abfrage geschrieben. Hier ist sie:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT a.spalteA<br />
FROM tabelle1 AS a<br />
LEFT JOIN tabelle2 AS b ON a.spalteA = b.id<br />
WHERE b.id IS NULL;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Werte einer Spalte in eine andere Spalte schreiben</span><br />
<br />
Heute hatte ich das Problem, daß ich Werte einer Spalte in eine andere Spalte schreiben mußte, und das über 24 Spalten hinweg bei einer Anzahl von 1200 Datensätzen. Da läßt sich logischerweise nichts mehr mit der Hand machen. Also kam ich zu folgender Lösung:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE `tabelle` SET <br />
wert1 = wert4, <br />
wert2 = wert5, <br />
wert3 = wert6;</code></div></div><br />
Dabei sollte man aber bedenken, daß man nicht Spalte 1 auf Spalte 2 und dann erste Spalte 2 auf Spalte 3 setzen kann. Denn dann hat man dreimal den Wert der Spalte 1. Man muß am hinteren Ende der Tabelle anfagnen, damit man sich nicht die Werte überschreibt. Bei solchen Angelegenheiten ist es sowieso ratsam man macht erst einmal einen Test mit einer Beispieltabelle, und dann erst an den richtigen Daten. Am Besten ist es auch vorher von der Datenbank ein Backup zu erstellen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Spalte mit einer bestimmten Anzahl von Buchstaben füllen</span><br />
<br />
Wollten Sie schon mal eine Spalte mit einer bestimmten Anzahl von Buchstaben füllen? Das mußte ich heute. Meine Tabelle braucht in einer Spalte eine gewisse Anzahl von Buchstaben für einen Belegunskalender für Ferienhäuser. Also muß in der Spalte für den Januar 31 Buchstaben stehen, für Februar 2012 natürlich 29, da dies ein Schaltjahr ist. Hier folgender Vorschlag:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE `tabelle` SET <br />
januar = REPEAT('F',31),<br />
februar = REPEAT('F',29);</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">MySQL - wichtige Stringfunktionen</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">CHAR_LENGTH(str ):</span> Gibt die Länge eines Strings zurück. Sehr interessant um zu wissen wie lange eine Zeichenkette ist. Diese Funktion zählt die Zeichen, nicht die Bytes.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT CHAR_LENGTH( "Hallo" );</code></div></div><br />
ergibt also:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>5</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">LEFT(str,len)</span>: Gibt die ersten len Buchstaben eines Strings der linken Seite zurück.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT LEFT( "das ist ein Test", 9 );</code></div></div><br />
würde demzufolge "das ist e" zurückgeben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">RIGHT(str,len)</span>: Gibt dementsprechend die rechte Seite eines Strings zurück.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT RIGHT("Das ist ein TEST",10);</code></div></div><br />
ist dann "t ein TEST".<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - verbinden zweiter Tabellen per JOIN</span><br />
<br />
Sehr häufig müssen 2 Tabellen miteinander verbunden werden. Denn oft stehen Tabellen mit einander in Verbindung. Zum Beispiel beinhaltet eine Tabelle mit Kundendaten in einer Spalte das Bundesland in dem der Kunde wohnt. Natürlich könnte man jetzt immer dort "Hessen" eintragen. Geschickter ist es aber in dieser Spalte nur eine Nummer zu hinterlegen, die in der Tabelle "Bundesländer" dann mit der id von Hessen verknüpft ist.<br />
<br />
Viele werden jetzt sagen: "Hessen ist doch schnell getrippt, warum Tabellen verbinden". Das schöne ist, man kann komplette Datensätze miteinander verbinden, ohne alle Angaben nochmal eintragen zu müssen. Zum Beispiel braucht man dann in einer Tabelle "Rechnungen" nicht mehr alle Kundeninformationen speichern wie z.B. Name, Strasse, plz, ort. Sondern man speichert nur noch die Zahl oder id des Kunden aus der "Kundentabelle". Man spricht hier von Entitäten.<br />
<br />
Eingie Varianten sind LEFT JOIN, RIGHT JOIN, oder INNER JOIN. Hier mal 3 Beispiele:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
INNER JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Bei einem INNER JOIN werden zum Beispiel nur die Daten angezeigt, die in beiden Tabellen übereinstimmen. Also werden in diesem Fall nur Kunden mit einer Rechnung angezeigt.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
LEFT JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Bei einem LEFT JOIN werden zum Beispiel alle Daten der Linken Tabelle des Joins angezeigt, und wenn in der Rechten Tabelle keine übereinstimmenden Daten vorhanden sind, bleiben diese Spalten dann eben leer. Also werden in diesem Fall alle Kunden angezeigt, ob Sie eine rechnunge haben oder nicht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM kunde<br />
RIGHT JOIN rechnung ON kunde.id=rechnung.rech_id;</code></div></div><br />
Dieses Beispiel macht eigentlich keinen Sinn. Es besagt, daß alle Rechnungen angezeigt werden sollen, auch wenn es für diese Rechnung in der Tabelle Kunden keinen Kunden gibt. Und Rechnungen ohne Kunden machen nun wirklich keinen Sinn. Aber dennoch braucht man diese Funktion. Stellen Sie sich zum Beispiel den Fall vor, daß ein Kunde aus versehen aus der Kundentabelle gelöscht wurde. Mit dieser Funktion kann man jetzt nach Rechnungen suchen, die keinen Kunden haben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Bei einer MySQL die Standart-Kollation ändern</span><br />
<br />
Da hat man eine neue MySQL Datenbank angelegt, und muss nach dem Einfügen der Tabellen mit entsetzen feststellen, dass alle Text-Spalten mit der Standart Kollation latin1_swedish_ci angelegt werden. Da kann es dann schon mal zu Problemen mit den Umlauten kommen. Wie kann man jetzt den Standart der Kollation auf einen Anderen setzen? Hier ist der SQL-Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ALTER DATABASE `db-name` <br />
DEFAULT CHARACTER SET latin1 <br />
COLLATE  latin1_german1_ci;</code></div></div><br />
Wenn man, wie es normalerweise der Fall ist, oft mit Umlauten und vielleicht sogar mit der russischen Schrift arbeitet, dann ist es besser folgende Collation zu benutzen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ALTER DATABASE `db422430845` <br />
DEFAULT CHARACTER SET utf8 <br />
DEFAULT COLLATE utf8_general_ci;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - aktuelle Zeit oder Datum in eine Spalte schreiben</span><br />
<br />
Sehr oft kommt es for daß man das aktuelle Datum in eine Spalte einer Tabelle eintragen will. Sehr häufig benutzt man es für eine Spalte in der der letzte Log-In protokolliert wird. Oder man will festhalten wann ein Datensatz angelegt, oder das letzte Mal geändert wurde. Man kann das in php erledigen, und den wert dann gleich richtig formatiert mitschicken, man könnte das aber sofort und einfacher per MySQL erledigen. Hier wird jetzt das Datum samt Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19 10:03:25'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=NOW()</code></div></div><br />
Wenn Sie nur das Datum eintragen möchten, dann wäre das hier das richtige. Hier wird jetzt nur das Datum im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=CURDATE()</code></div></div><br />
Wegen der Vollständigkeit hier noch die Zeit. Mit den beiden letzten funktionen könnte man dann die Logindaten in zwei verschiedene Spalten schreiben. Eine für das Datum eine für die Zeit. Hier wird jetzt die Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '10:03:25'<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE tabelle SET login=CURTIME( );</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Ein Deutsches Datum per SQL in die Datenbank schreiben</span><br />
<br />
Oft steht man vor dem Problem, daß mann ein Deutsches Datum in eine Zelle schreiben muss. Doch dummerweise versteht MySQL das deutsche Datumsformat nicht. Oft wird dann mit php oder anderen Scripten das Datum in kleine Teilstrings zerstückelt. Doch hier gibt es einen kleinen netten SQL-Befhel, der das alles wie von selbst macht. Hier ist der SQL-Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>INSERT INTO `tabelle` (`id` ,`datum`) VALUES ('', STR_TO_DATE('14.04.2006', '%d.%m.%Y'));</code></div></div><br />
MySQL - Ein Datum aus der MySQL-Datenbank im Deutschen Format anzeigen<br />
<br />
Wir wissen jetzt, wie man ein Deutsches Datum in die Datenbank bekommt. Doch wie bekommt man es jetzt von dort wieder im Deutschen Format raus ??? Hierfür gibt es jetzt noch ein MySQL-Befehl, und der sieht so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT DATE_FORMAT(datum, '%d.%m.%Y') AS MeinDatum FROM tabelle;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Mit IN Array eine MySQL-Datenbank durchsuchen</span><br />
<br />
Manchmal kommt es vor, daß man eine Datenbank nach mehreren Begriffen durchsuchen muss. Man könnte jetzt natürlich die Begriffe aneinanderreihen nach dem Motto: "WHERE test LIKE 'A' OR test LIKE 'B' OR test LIKE 'C' ". Aber das macht den MySQL Code sehr unübersichtlich, wenn man mal gerne 20 oder mehr Begriffe abfragen möchte. Hier gitb es eine tolle Hilfe. Den Befehl IN ('A', 'B', 'C').<br />
<br />
So würde das Ganze dann aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * <br />
FROM tabelle<br />
WHERE test IN ('A', 'B', 'C');</code></div></div><br />
Wenn das Array schon in php in einer Variable vorliegt, könnte man das Ganze noch besser machen. Und zwar so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;array = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I');<br />
&#36;SQLarray = "'" . implode("','", &#36;array) . "'";<br />
<br />
&#36;MySQL = "SELECT * FROM tabelle WHERE test IN (&#36;SQLarray);";<br />
echo &#36;MySQL;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Datensätze aus zwei Spalten in einer Spalte zusammenfassen</span><br />
<br />
Ab und zu kommt es auch vor, daß man die Werte zweier Spalten in einer Spalte zusammenfassen möchte. Auch hierfür gibt es einen bestimmten SQL-Befehl. In meinem Beispiel werden die beiden Werte mit einem Komma getrennt in die 3. Spalte geschrieben. Hier ist der SQL-Code:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE INTO tabelle1  <br />
SET Spalte3 = CONCAT( Spalte1, ', ', Spalte2 )<br />
WHERE bedingung = 1</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Mit IF eine MySQL-Datenbank abfragen</span><br />
<br />
Heute ist es mir mal wieder passiert, dass ich in einer Datenbank eine Abfrage machen wollte mit der man auf einen bestimmten Umstand anders reagieren könnte. Und dabei ist mir mal wieder nicht die richtige Syntax eingefallen. Ich wollte den Inhalt einer Spalte abfragen, und wenn diese nicht vorhanden ist, soll der Wert einer anderen Spalte genommen werden.<br />
<br />
Der Grund dafür könnte sein, dass eine Tabelle verschiedene Sprachversionen in den einzelnen Spalten ist, und wenn jetzt z.B. Spanisch noch nicht übersetzt ist, soll er eben die Übersetzung aus der Englischen Spalte nehmen.<br />
<br />
So würde das Ganze dann aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT IF(spanisch LIKE '',englisch,spanisch) AS MeinText<br />
FROM tabelle<br />
WHERE id = 1;</code></div></div><br />
<br />
Das schöne daran ist, ich kann jetzt in meinem php Code einfach echo &#36;row['MeinText']; einbauen und muss mich dann hier nicht mit einer php IF-Then-Else Geschichte rumplagen, da es in MySQL doch einfacher zu handhaben ist.<br />
<br />
Vielleicht hilft Euch das ja weiter. Mir hat es zumindest geholfen. :-)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Datensätze suchen, die nicht einer Anforderung entsprechen</span><br />
<br />
Heute stand ich vor dem Problem Datensätze zu suchen, die einem Kriterium nicht entsprechne dürfen. Da ich dies schon öfter benutzt habe und heute danach gefragt wurde, möchte ich dies jetzt hier für die Nachwelt festhalten. Hier ist der relativ simple SQL-Code für My SQL<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM teballe <br />
WHERE spalte NOT LIKE 'SuchBegriff';</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Bei einer WHERE Abfrage nach einem Teilstring suchen</span><br />
<br />
Wie macht man es, wenn man nur nach einem Teilstring in MySQL suchen möchte? Das ist sehr ähnlich wie bei MS Access. Einfach mit left und right scuhen, wenn sich der Teilstring am Ende oder am Anfang befindet.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE left(spalte, 5) LIKE '12345';</code></div></div><br />
Eine andere Möglichkeit wäre natürlich mit dem Platzhaltersymbol '%' zu suchen. Dann findet er diesen Teilstring egal wo sich dieser in der Spalte befindet.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE spalte LIKE '%12345%';</code></div></div><br />
In diesem Zusammenhang sei noch erwänt, daß man auch nach einem String suchen kann, bei dem man einen oder mehrere Buchstaben durch einen Platzhalter oder Joker ersetzt. In dem unten gezeigten Beispiel findet er 12345 oder auch 10345. Das ist zum Beispiel interessant, wenn man nicht mehr weiß ob man in einem Spanischen Wort das 'ñ' mit einem normalen 'n' geschrieben hat oder nicht. So könnte man dann nach 'Espa_a' suchen und er würde 'España' und auch 'Espana' finden.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT * FROM tabelle <br />
WHERE spalte LIKE '%1_345%';</code></div></div><br />
Letzte Änderung dieser Information:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>19.01.2012 10:47 h</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Nach einem Strings einer bestimmten Länge suchen</span><br />
<br />
Manchmal könnte es vorkommen, daß man Strings sucht, die eine bestimmte Länge aufweisen. So ist es mir zumindest heute ergangen. Dafür gibt es auch SQL Funktionen. Für meinen Fall half mir heute diese SQL.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT *<br />
FROM tabelle<br />
WHERE CHAR_LENGTH( spalte ) &gt;5;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Eine Spalte in zwei Tabellen vergleichen und fehlende anzeigen</span><br />
<br />
Soeben habe ich mich gefragt, wie man eine Spalte in zwei Tabellen vergleichen kann. Ich hatte zwei Tabellen, die eigentlich die gleiche Anzahl von datensätzen haben sollte. Hatten Sie aber nicht. Die eine Tabelle hatte einen Satz mehr. Damit ich nicht meine Jugendzeit damit verbringe, diesen einen Satz zu suchen, habe ich eine SQL-Abfrage geschrieben. Hier ist sie:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT a.spalteA<br />
FROM tabelle1 AS a<br />
LEFT JOIN tabelle2 AS b ON a.spalteA = b.id<br />
WHERE b.id IS NULL;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Werte einer Spalte in eine andere Spalte schreiben</span><br />
<br />
Heute hatte ich das Problem, daß ich Werte einer Spalte in eine andere Spalte schreiben mußte, und das über 24 Spalten hinweg bei einer Anzahl von 1200 Datensätzen. Da läßt sich logischerweise nichts mehr mit der Hand machen. Also kam ich zu folgender Lösung:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE `tabelle` SET <br />
wert1 = wert4, <br />
wert2 = wert5, <br />
wert3 = wert6;</code></div></div><br />
Dabei sollte man aber bedenken, daß man nicht Spalte 1 auf Spalte 2 und dann erste Spalte 2 auf Spalte 3 setzen kann. Denn dann hat man dreimal den Wert der Spalte 1. Man muß am hinteren Ende der Tabelle anfagnen, damit man sich nicht die Werte überschreibt. Bei solchen Angelegenheiten ist es sowieso ratsam man macht erst einmal einen Test mit einer Beispieltabelle, und dann erst an den richtigen Daten. Am Besten ist es auch vorher von der Datenbank ein Backup zu erstellen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MySQL - Spalte mit einer bestimmten Anzahl von Buchstaben füllen</span><br />
<br />
Wollten Sie schon mal eine Spalte mit einer bestimmten Anzahl von Buchstaben füllen? Das mußte ich heute. Meine Tabelle braucht in einer Spalte eine gewisse Anzahl von Buchstaben für einen Belegunskalender für Ferienhäuser. Also muß in der Spalte für den Januar 31 Buchstaben stehen, für Februar 2012 natürlich 29, da dies ein Schaltjahr ist. Hier folgender Vorschlag:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>UPDATE `tabelle` SET <br />
januar = REPEAT('F',31),<br />
februar = REPEAT('F',29);</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Einigen Code zu PHP]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1366</link>
			<pubDate>Sat, 23 Nov 2024 18:55:51 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1366</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">PHP - Suchen eines Key in einem Array</span><br />
<br />
Manchmal ist es notwendig die Position eines Wertes in einem Array zu wissen. Dafür gibt es einen php-Befehl: array_search.<br />
Hier mal ein kleines Beispiel:<br />
 <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;MeinArray = array("W0","W1","W2","W3");  &#36;MeinKey = array_search("W2", &#36;MeinArray);  echo "Mein Key = ".&#36;MeinKey; </code></div></div> <br />
Das Ergebnis dieser Abfrage ist dann:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Mein Key = 2</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Der erste Key eines Array soll höher als Null sein.</span><br />
<br />
Es kommt auch schon einmal vor, das Array mit einem anderen key anfangen soll. Ein normales Array fängt immer mit einem Key von 0 an. Was wäre aber jetzt, wenn edas programm verlangt, das der Key mit 100 anfangen soll? Hier gibt es auch eine einfache Lösung.<br />
<br />
Hier mal ein kleines Beispiel:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;MeinArray = array("W0","W1","W2","W3");<br />
&#36;MeinNeyesArray = array(100 =&gt; "W100","W101","W102","W103");  <br />
echo "Mein 102 = ".&#36;MeinNeyesArray[102]; </code></div></div> <br />
Das Ergebnis dieser Abfrage ist dann:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Mein 102 = W102</blockquote>
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Hier die Beispiele mit der date() - Funktion</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("d.m.Y");</code></div></div><br />
Heutiges Datum mit jeweils führender Null und vierstellige Jahreszahl so sieht's: aus:<br />
<br />
03.01.2023<br />
<br />
Auch die Zeit kann man damit darstellen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("h:i:s &#92;h");</code></div></div><br />
Zu bedenken ist dabei, daß es sich um die Zeit des Servers handet. Und so sieht's aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>05:14:13 h</blockquote>
<br />
<br />
Man kann beides zusammentun, und erhält dann etwas wie:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("l jS F Y h:i:s");</code></div></div><br />
<br />
Hier das Ergebnis:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Tuesday 3rd January 2023 05:14:13</blockquote>
<br />
<br />
Jetzt noch ein letztes Beispiel, wie man auch andere Daten außer dem heutigen Datum darstellen kann, und sogar auch damit rechnen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?php<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;noon = mktime(12,0,0, date("m"), date("d"), date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;morgen = mktime(0,0,0, date("m"), date("d")+1, date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;letztermonat = mktime(0,0,0, date("m")-1, date("d"), date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;naechstesjahr = mktime(0,0,0, date("m"), date("d"), date("Y")+1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Heute Mittag = ".date("d.m.Y h:i:s", &#36;noon)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Morgen = ".date("d.m.Y", &#36;morgen)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Letzer Monat = ".date("d.m.Y", &#36;letztermonat)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Nächstes Jahr = ".date("d.m.Y", &#36;naechstesjahr)."&lt;br&gt;";<br />
?&gt;</code></div></div><br />
Und so sieht das ganze dann aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Heute Mittag = 03.01.2023 12:00:00<br />
Morgen = 04.01.2023<br />
Letzer Monat = 03.12.2022<br />
Nächstes Jahr = 03.01.2024</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Ein Datum aus der Datenbank richtig darstellen</span><br />
<br />
Wenn man ein Datum in der Datenbank speichert wird es normalerweise in einer Art und Weise gespeicher, daß man es in deutsch nicht wirklich lesen kann. Aus diesem Grund gibt es einen netten php-Befehl, der das Datum in ein Array packt, und von dort wieder ausgelesen werden kann.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;datum = explode("-",tabellenspalte);  <br />
echo &#36;datum[2].".".&#36;datum[1].".".&#36;datum[0]; </code></div></div><br />
Das Ganze würde aber auch Sinn machen, daß man es direkt in der SQL-Abfrage ändert. Das können Sie aber in der Rubrik Tipps und Tricks für MySQL nachlesen<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Mit strpos einen String suchen</span><br />
<br />
Sehr oft kommt es vor, daß man überprüfen muss ob ein String in einem anderen String vorhanden ist. Hierfür ist der php-Befehl strpos('meinstring','suchstring'); hilfreich.<br />
<br />
Hier mal eine kleines Beispiel:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?php <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;meinString = 'abc'; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;findMich  = 'a'; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;pos = strpos(&#36;meinString, &#36;findMich); <br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;pos !== false) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Der String '&#36;findMich' wurde im String <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&#36;meinString' gefunden";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo " und befindet sich an Position &#36;pos"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Der String '&#36;findMich' wurde nicht im String <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&#36;meinString' gefunden"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
?&gt;</code></div></div><br />
weitere Beispiele und Erklärungen finden Sie auf der Seite<br />
<a href="http://php.net/manual/de/function.strpos.php" target="_blank" rel="noopener" class="mycode_url">http://php.net/manual/de/function.strpos.php</a><br />
<br />
Ab und zu muss man aber nach dem letzten Vorkommen eines Zeichens suchen. Dafür gibt es auch einen Befehl, der da wäre: strrpos('meinstring','suchstring')<br />
<br />
Beide Befehle kann man noch mit einem dritten Parameter versehen. Der besagt ab welchem Zeichen gesucht werden soll. Wenn dieser Wert negativ ist, dann würde er ab dem Zeichen vom Ende der Zeichenkette anfangen zu suchen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;pos = strpos('abcdef abcdef', 'a', 1); // &#36;pos = 7, nicht 0</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">PHP - Anzahl der Tage eines Monats ermitteln</span><br />
<br />
In letzter Zeit treffe ich immer öfter auf das Problem, wie ich herausfinden kann, wieviel Tage ein bestimmter Monat hat. Dazu gibt es natürlich auch einen Programmierweg. Dieser setzt sich aus den beiden php-Funktionen<br />
mktime und date zusammen. Zuerst muß man das Datum von einem Text in einen Wert, den sogannten Timestamp, umwandeln. Dies sind die Sekunden seit dem 01.01.1970. Damit kann man dann wiederum ermittlen, wieviel Tage der Monat hat. Hier mal das script dazu:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo date("t",mktime(0,0,0,2,1,2012));</code></div></div><br />
<br />
Und das ergebins davon ist:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>29</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Grossen Zahl nach Tausendern mit Trennzeichen darstellen</span><br />
<br />
Wenn man eine grosse Zahl wie z.B. 10000000 auf einer Webseite darstellen möchte, wird das Lesen dieser Zahl bei so vielen Nullen etwas schwierig. Hierfür gibt es eine php-Funktion die sich number_fomrat nennt. Sie Syntax ist recht simple.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo number_format('10000000', 0, ',', '.');<br />
echo number_format('10000000', 2, ',', '.');<br />
echo number_format('10000000');</code></div></div><br />
So würde das ganze dann fertig aussehen:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>10.000.000<br />
10.000.000,00<br />
10,000,000</blockquote>
<br />
<br />
Die erste Zeile ist das Deutsche Zahlenformat. Die zweite Zeile wird mit der Zahl 2 dazu veranlasst noch 2 Stellen hinter dem komma anzuzeigen. Die Dritte Zeile ist das engliche Zahlen Format.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">PHP - Suchen eines Key in einem Array</span><br />
<br />
Manchmal ist es notwendig die Position eines Wertes in einem Array zu wissen. Dafür gibt es einen php-Befehl: array_search.<br />
Hier mal ein kleines Beispiel:<br />
 <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;MeinArray = array("W0","W1","W2","W3");  &#36;MeinKey = array_search("W2", &#36;MeinArray);  echo "Mein Key = ".&#36;MeinKey; </code></div></div> <br />
Das Ergebnis dieser Abfrage ist dann:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Mein Key = 2</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Der erste Key eines Array soll höher als Null sein.</span><br />
<br />
Es kommt auch schon einmal vor, das Array mit einem anderen key anfangen soll. Ein normales Array fängt immer mit einem Key von 0 an. Was wäre aber jetzt, wenn edas programm verlangt, das der Key mit 100 anfangen soll? Hier gibt es auch eine einfache Lösung.<br />
<br />
Hier mal ein kleines Beispiel:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;MeinArray = array("W0","W1","W2","W3");<br />
&#36;MeinNeyesArray = array(100 =&gt; "W100","W101","W102","W103");  <br />
echo "Mein 102 = ".&#36;MeinNeyesArray[102]; </code></div></div> <br />
Das Ergebnis dieser Abfrage ist dann:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Mein 102 = W102</blockquote>
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Hier die Beispiele mit der date() - Funktion</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("d.m.Y");</code></div></div><br />
Heutiges Datum mit jeweils führender Null und vierstellige Jahreszahl so sieht's: aus:<br />
<br />
03.01.2023<br />
<br />
Auch die Zeit kann man damit darstellen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("h:i:s &#92;h");</code></div></div><br />
Zu bedenken ist dabei, daß es sich um die Zeit des Servers handet. Und so sieht's aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>05:14:13 h</blockquote>
<br />
<br />
Man kann beides zusammentun, und erhält dann etwas wie:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>date("l jS F Y h:i:s");</code></div></div><br />
<br />
Hier das Ergebnis:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Tuesday 3rd January 2023 05:14:13</blockquote>
<br />
<br />
Jetzt noch ein letztes Beispiel, wie man auch andere Daten außer dem heutigen Datum darstellen kann, und sogar auch damit rechnen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?php<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;noon = mktime(12,0,0, date("m"), date("d"), date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;morgen = mktime(0,0,0, date("m"), date("d")+1, date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;letztermonat = mktime(0,0,0, date("m")-1, date("d"), date("Y"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;naechstesjahr = mktime(0,0,0, date("m"), date("d"), date("Y")+1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Heute Mittag = ".date("d.m.Y h:i:s", &#36;noon)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Morgen = ".date("d.m.Y", &#36;morgen)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Letzer Monat = ".date("d.m.Y", &#36;letztermonat)."&lt;br&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Nächstes Jahr = ".date("d.m.Y", &#36;naechstesjahr)."&lt;br&gt;";<br />
?&gt;</code></div></div><br />
Und so sieht das ganze dann aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Heute Mittag = 03.01.2023 12:00:00<br />
Morgen = 04.01.2023<br />
Letzer Monat = 03.12.2022<br />
Nächstes Jahr = 03.01.2024</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Ein Datum aus der Datenbank richtig darstellen</span><br />
<br />
Wenn man ein Datum in der Datenbank speichert wird es normalerweise in einer Art und Weise gespeicher, daß man es in deutsch nicht wirklich lesen kann. Aus diesem Grund gibt es einen netten php-Befehl, der das Datum in ein Array packt, und von dort wieder ausgelesen werden kann.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;datum = explode("-",tabellenspalte);  <br />
echo &#36;datum[2].".".&#36;datum[1].".".&#36;datum[0]; </code></div></div><br />
Das Ganze würde aber auch Sinn machen, daß man es direkt in der SQL-Abfrage ändert. Das können Sie aber in der Rubrik Tipps und Tricks für MySQL nachlesen<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Mit strpos einen String suchen</span><br />
<br />
Sehr oft kommt es vor, daß man überprüfen muss ob ein String in einem anderen String vorhanden ist. Hierfür ist der php-Befehl strpos('meinstring','suchstring'); hilfreich.<br />
<br />
Hier mal eine kleines Beispiel:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?php <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;meinString = 'abc'; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;findMich  = 'a'; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;pos = strpos(&#36;meinString, &#36;findMich); <br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;pos !== false) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Der String '&#36;findMich' wurde im String <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&#36;meinString' gefunden";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo " und befindet sich an Position &#36;pos"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Der String '&#36;findMich' wurde nicht im String <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&#36;meinString' gefunden"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
?&gt;</code></div></div><br />
weitere Beispiele und Erklärungen finden Sie auf der Seite<br />
<a href="http://php.net/manual/de/function.strpos.php" target="_blank" rel="noopener" class="mycode_url">http://php.net/manual/de/function.strpos.php</a><br />
<br />
Ab und zu muss man aber nach dem letzten Vorkommen eines Zeichens suchen. Dafür gibt es auch einen Befehl, der da wäre: strrpos('meinstring','suchstring')<br />
<br />
Beide Befehle kann man noch mit einem dritten Parameter versehen. Der besagt ab welchem Zeichen gesucht werden soll. Wenn dieser Wert negativ ist, dann würde er ab dem Zeichen vom Ende der Zeichenkette anfangen zu suchen.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;pos = strpos('abcdef abcdef', 'a', 1); // &#36;pos = 7, nicht 0</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">PHP - Anzahl der Tage eines Monats ermitteln</span><br />
<br />
In letzter Zeit treffe ich immer öfter auf das Problem, wie ich herausfinden kann, wieviel Tage ein bestimmter Monat hat. Dazu gibt es natürlich auch einen Programmierweg. Dieser setzt sich aus den beiden php-Funktionen<br />
mktime und date zusammen. Zuerst muß man das Datum von einem Text in einen Wert, den sogannten Timestamp, umwandeln. Dies sind die Sekunden seit dem 01.01.1970. Damit kann man dann wiederum ermittlen, wieviel Tage der Monat hat. Hier mal das script dazu:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo date("t",mktime(0,0,0,2,1,2012));</code></div></div><br />
<br />
Und das ergebins davon ist:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>29</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">PHP - Grossen Zahl nach Tausendern mit Trennzeichen darstellen</span><br />
<br />
Wenn man eine grosse Zahl wie z.B. 10000000 auf einer Webseite darstellen möchte, wird das Lesen dieser Zahl bei so vielen Nullen etwas schwierig. Hierfür gibt es eine php-Funktion die sich number_fomrat nennt. Sie Syntax ist recht simple.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo number_format('10000000', 0, ',', '.');<br />
echo number_format('10000000', 2, ',', '.');<br />
echo number_format('10000000');</code></div></div><br />
So würde das ganze dann fertig aussehen:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>10.000.000<br />
10.000.000,00<br />
10,000,000</blockquote>
<br />
<br />
Die erste Zeile ist das Deutsche Zahlenformat. Die zweite Zeile wird mit der Zahl 2 dazu veranlasst noch 2 Stellen hinter dem komma anzuzeigen. Die Dritte Zeile ist das engliche Zahlen Format.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Daten aus Tabelle in eine andere Tabelle erfassen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1355</link>
			<pubDate>Fri, 22 Nov 2024 12:41:24 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1355</guid>
			<description><![CDATA[Aus gegebenem Anlass wollte ich wissen, ob ich aus einer Tabelle oder einem JOIN-Statement Tabellenzeilen in einer neuen oder bestehenden Tabelle einfügen kann.<br />
<br />
Ergebnis: ja, das geht.<br />
<br />
Das war mein erster Versuch, um dieses Thema zu lösen (recht naiv, aber wer nicht wagt, der nicht gewinnt):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT id, anz_datei INTO result FROM anzahlen WHERE anz_datei &gt; 100;</code></div></div><br />
Es kommt dabei zu einer Fehlermeldung seitens MySQL:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>#1327 - Nicht deklarierte Variable: result</blockquote>
<br />
Das kann so nicht funktionieren, denn die aufnehmende Tabelle ist nicht vorhanden. Also muss die Tabelle erstellt werden, zur Laufzeit, um eben Daten aufnehmen zu können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CREATE TABLE result SELECT id, anz_datei FROM anzahlen WHERE anz_datei &gt; 100;</code></div></div><br />
Das hat funktioniert, denn die Tabelle wird angelegt, bevor die SELECT-Anweisung startet. Die neue Tabelle wurde mit Daten gefüllt. Das AUTO_INCREMENT aus dem Feld id wurde jedoch nicht mitgenommen. Solche Tabellen würde ich auch nur dann einsetzen, wenn ich sie temporär brauche (vielleicht versus Views?).<br />
Ob die Attribute der Felder, die erstellt werden müssen, mitgeschleppt werden, muss ich noch recherchieren.<br />
<br />
Nun sollen weitere Daten in die Tabelle aufgenommen werden. Dies erfolgt dann auf diese Art und Weise:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>INSERT INTO result (id, anz_datei) SELECT id, anz_datei FROM anzahlen WHERE anz_datei = 5094;</code></div></div><br />
Hierbei ist zu beachten, dass die aufnehmende Tabelle bereits existiert. Und schon sind die Daten erfasst und stehen zur Verfügung.<br />
<br />
Warum kam ich auf diese Thematik?<br />
<br />
Wenn ich ein Programm laufen lassen, dass sich Daten aus Tabellen mit JOIN-Statements holt, dann macht es vielleicht Sinn, die Abfragen vorab zu gestalten (und auch auszuführen), um später im Programmablauf nur noch auf Tabelle zugreifen zu können, ohne das die aufwendigen JOIN-Anweisung abzuarbeiten sind. Das ist nicht immer möglich, denn wenn im Programmablauf erst eine Unbekannte bekann wird, kann vorher keine Tabelle mit Inhalten gefüllt sein. Es kommt also auf den Anwendungsfall an.]]></description>
			<content:encoded><![CDATA[Aus gegebenem Anlass wollte ich wissen, ob ich aus einer Tabelle oder einem JOIN-Statement Tabellenzeilen in einer neuen oder bestehenden Tabelle einfügen kann.<br />
<br />
Ergebnis: ja, das geht.<br />
<br />
Das war mein erster Versuch, um dieses Thema zu lösen (recht naiv, aber wer nicht wagt, der nicht gewinnt):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT id, anz_datei INTO result FROM anzahlen WHERE anz_datei &gt; 100;</code></div></div><br />
Es kommt dabei zu einer Fehlermeldung seitens MySQL:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>#1327 - Nicht deklarierte Variable: result</blockquote>
<br />
Das kann so nicht funktionieren, denn die aufnehmende Tabelle ist nicht vorhanden. Also muss die Tabelle erstellt werden, zur Laufzeit, um eben Daten aufnehmen zu können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CREATE TABLE result SELECT id, anz_datei FROM anzahlen WHERE anz_datei &gt; 100;</code></div></div><br />
Das hat funktioniert, denn die Tabelle wird angelegt, bevor die SELECT-Anweisung startet. Die neue Tabelle wurde mit Daten gefüllt. Das AUTO_INCREMENT aus dem Feld id wurde jedoch nicht mitgenommen. Solche Tabellen würde ich auch nur dann einsetzen, wenn ich sie temporär brauche (vielleicht versus Views?).<br />
Ob die Attribute der Felder, die erstellt werden müssen, mitgeschleppt werden, muss ich noch recherchieren.<br />
<br />
Nun sollen weitere Daten in die Tabelle aufgenommen werden. Dies erfolgt dann auf diese Art und Weise:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>INSERT INTO result (id, anz_datei) SELECT id, anz_datei FROM anzahlen WHERE anz_datei = 5094;</code></div></div><br />
Hierbei ist zu beachten, dass die aufnehmende Tabelle bereits existiert. Und schon sind die Daten erfasst und stehen zur Verfügung.<br />
<br />
Warum kam ich auf diese Thematik?<br />
<br />
Wenn ich ein Programm laufen lassen, dass sich Daten aus Tabellen mit JOIN-Statements holt, dann macht es vielleicht Sinn, die Abfragen vorab zu gestalten (und auch auszuführen), um später im Programmablauf nur noch auf Tabelle zugreifen zu können, ohne das die aufwendigen JOIN-Anweisung abzuarbeiten sind. Das ist nicht immer möglich, denn wenn im Programmablauf erst eine Unbekannte bekann wird, kann vorher keine Tabelle mit Inhalten gefüllt sein. Es kommt also auf den Anwendungsfall an.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Eine leere Textdatei erstellen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1330</link>
			<pubDate>Sat, 16 Nov 2024 21:29:28 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1330</guid>
			<description><![CDATA[Wie wird in Perl eine leere Textdatei erstellt?<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "leere_datei.txt";<br />
<br />
# Datei im Schreibmodus öffnen<br />
open(my &#36;fh, '&gt;', &#36;datei) or die "Kann die Datei nicht erstellen: &#36;!";<br />
<br />
# Datei schließen<br />
close(&#36;fh);<br />
<br />
print "Die Datei '&#36;datei' wurde erstellt.&#92;n";</code></div></div><br />
Erklärung:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>open(my &#36;fh, '&gt;', &#36;datei):</code></div></div><br />
Öffnet die Datei &#36;datei im Schreibmodus (>).<br />
Wenn die Datei nicht existiert, wird sie erstellt.<br />
Wenn die Datei existiert, wird ihr Inhalt gelöscht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>close(&#36;fh):</code></div></div><br />
Schließt den Datei-Handle, um sicherzustellen, dass die Datei korrekt gespeichert wird.<br />
or die "...":<br />
<br />
Gibt eine Fehlermeldung aus und beendet das Skript, falls das Öffnen der Datei fehlschlägt (z. B. aufgrund von fehlenden Schreibrechten).<br />
<br />
<hr class="mycode_hr" />
<br />
Alternative Methode: <span style="font-weight: bold;" class="mycode_b">Mit touch</span><br />
Falls du das Modul File::Touch verwenden möchtest, kannst du eine leere Datei ähnlich wie mit dem Linux-Befehl touch erstellen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>use File::Touch;<br />
<br />
my &#36;datei = "leere_datei.txt";<br />
touch(&#36;datei);<br />
<br />
print "Die Datei '&#36;datei' wurde erstellt.&#92;n";</code></div></div><br />
Installation von <span style="font-weight: bold;" class="mycode_b">File::Touch:</span><br />
Falls das Modul noch nicht installiert ist, kannst du es über CPAN installieren:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cpan File::Touch</code></div></div>]]></description>
			<content:encoded><![CDATA[Wie wird in Perl eine leere Textdatei erstellt?<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "leere_datei.txt";<br />
<br />
# Datei im Schreibmodus öffnen<br />
open(my &#36;fh, '&gt;', &#36;datei) or die "Kann die Datei nicht erstellen: &#36;!";<br />
<br />
# Datei schließen<br />
close(&#36;fh);<br />
<br />
print "Die Datei '&#36;datei' wurde erstellt.&#92;n";</code></div></div><br />
Erklärung:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>open(my &#36;fh, '&gt;', &#36;datei):</code></div></div><br />
Öffnet die Datei &#36;datei im Schreibmodus (>).<br />
Wenn die Datei nicht existiert, wird sie erstellt.<br />
Wenn die Datei existiert, wird ihr Inhalt gelöscht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>close(&#36;fh):</code></div></div><br />
Schließt den Datei-Handle, um sicherzustellen, dass die Datei korrekt gespeichert wird.<br />
or die "...":<br />
<br />
Gibt eine Fehlermeldung aus und beendet das Skript, falls das Öffnen der Datei fehlschlägt (z. B. aufgrund von fehlenden Schreibrechten).<br />
<br />
<hr class="mycode_hr" />
<br />
Alternative Methode: <span style="font-weight: bold;" class="mycode_b">Mit touch</span><br />
Falls du das Modul File::Touch verwenden möchtest, kannst du eine leere Datei ähnlich wie mit dem Linux-Befehl touch erstellen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>use File::Touch;<br />
<br />
my &#36;datei = "leere_datei.txt";<br />
touch(&#36;datei);<br />
<br />
print "Die Datei '&#36;datei' wurde erstellt.&#92;n";</code></div></div><br />
Installation von <span style="font-weight: bold;" class="mycode_b">File::Touch:</span><br />
Falls das Modul noch nicht installiert ist, kannst du es über CPAN installieren:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cpan File::Touch</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[File Test Operator für Dateien und Ordner]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1328</link>
			<pubDate>Sat, 16 Nov 2024 21:23:22 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1328</guid>
			<description><![CDATA[Einfache Prüfung, ob eine Datei existiert.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "beispiel.txt";<br />
if (-e &#36;datei) {<br />
    print "Die Datei '&#36;datei' existiert.&#92;n";<br />
} else {<br />
    print "Die Datei '&#36;datei' existiert nicht.&#92;n";<br />
}</code></div></div><br />
<br />
Zusätzliche Datei-Prüfungen<br />
Perl bietet viele weitere <span style="font-weight: bold;" class="mycode_b">File Test Operators</span>, um Dateien und Verzeichnisse zu überprüfen. Hier sind einige nützliche Operatoren:<br />
Operator<br />
Beschreibung<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-e</code></div></div>Existiert die Datei?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-f</code></div></div>Ist es eine reguläre Datei?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-d</code></div></div>Ist es ein Verzeichnis?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-r</code></div></div>Ist die Datei lesbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-w</code></div></div>Ist die Datei schreibbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-x</code></div></div>Ist die Datei ausführbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-z</code></div></div>Ist die Datei leer?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-s</code></div></div>Gibt die Größe der Datei zurück.<br />
<br />
<hr class="mycode_hr" />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "beispiel.txt";<br />
<br />
if (-e &#36;datei) {<br />
    print "Die Datei '&#36;datei' existiert.&#92;n";<br />
<br />
    if (-f &#36;datei) {<br />
        print "Es ist eine reguläre Datei.&#92;n";<br />
    } elsif (-d &#36;datei) {<br />
        print "Es ist ein Verzeichnis.&#92;n";<br />
    }<br />
<br />
    print "Die Datei ist " . (-s &#36;datei) . " Bytes groß.&#92;n" if -s &#36;datei;<br />
    print "Die Datei ist lesbar.&#92;n" if -r &#36;datei;<br />
    print "Die Datei ist schreibbar.&#92;n" if -w &#36;datei;<br />
    print "Die Datei ist ausführbar.&#92;n" if -x &#36;datei;<br />
} else {<br />
    print "Die Datei '&#36;datei' existiert nicht.&#92;n";<br />
}</code></div></div>]]></description>
			<content:encoded><![CDATA[Einfache Prüfung, ob eine Datei existiert.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "beispiel.txt";<br />
if (-e &#36;datei) {<br />
    print "Die Datei '&#36;datei' existiert.&#92;n";<br />
} else {<br />
    print "Die Datei '&#36;datei' existiert nicht.&#92;n";<br />
}</code></div></div><br />
<br />
Zusätzliche Datei-Prüfungen<br />
Perl bietet viele weitere <span style="font-weight: bold;" class="mycode_b">File Test Operators</span>, um Dateien und Verzeichnisse zu überprüfen. Hier sind einige nützliche Operatoren:<br />
Operator<br />
Beschreibung<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-e</code></div></div>Existiert die Datei?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-f</code></div></div>Ist es eine reguläre Datei?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-d</code></div></div>Ist es ein Verzeichnis?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-r</code></div></div>Ist die Datei lesbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-w</code></div></div>Ist die Datei schreibbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-x</code></div></div>Ist die Datei ausführbar?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-z</code></div></div>Ist die Datei leer?<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>-s</code></div></div>Gibt die Größe der Datei zurück.<br />
<br />
<hr class="mycode_hr" />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my &#36;datei = "beispiel.txt";<br />
<br />
if (-e &#36;datei) {<br />
    print "Die Datei '&#36;datei' existiert.&#92;n";<br />
<br />
    if (-f &#36;datei) {<br />
        print "Es ist eine reguläre Datei.&#92;n";<br />
    } elsif (-d &#36;datei) {<br />
        print "Es ist ein Verzeichnis.&#92;n";<br />
    }<br />
<br />
    print "Die Datei ist " . (-s &#36;datei) . " Bytes groß.&#92;n" if -s &#36;datei;<br />
    print "Die Datei ist lesbar.&#92;n" if -r &#36;datei;<br />
    print "Die Datei ist schreibbar.&#92;n" if -w &#36;datei;<br />
    print "Die Datei ist ausführbar.&#92;n" if -x &#36;datei;<br />
} else {<br />
    print "Die Datei '&#36;datei' existiert nicht.&#92;n";<br />
}</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Bestimmte Anzahl Dateien verschieben/kopieren]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1264</link>
			<pubDate>Mon, 04 Nov 2024 13:43:29 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1264</guid>
			<description><![CDATA[Das Kopieren und Verschieben einer gewissen Anzahl an Dateien, die unbestimmt ist, kann wie folgt in der Bash erledigt werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>anzahl=30000<br />
find /quellordner -type f | head -n &#36;anzahl | xargs -I {} mv {} /zielordner<br />
find /quellordner -type f | head -n &#36;anzahl | xargs -I {} cp {} /zielordner</code></div></div>]]></description>
			<content:encoded><![CDATA[Das Kopieren und Verschieben einer gewissen Anzahl an Dateien, die unbestimmt ist, kann wie folgt in der Bash erledigt werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>anzahl=30000<br />
find /quellordner -type f | head -n &#36;anzahl | xargs -I {} mv {} /zielordner<br />
find /quellordner -type f | head -n &#36;anzahl | xargs -I {} cp {} /zielordner</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Dateien von Ordner A nach Ordner B verschieben]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1158</link>
			<pubDate>Sat, 05 Oct 2024 19:06:44 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1158</guid>
			<description><![CDATA[Ein einfaches Skript zum Verschieben von Dateien mit der Extension ".mp4" von einem Ordner in den anderen Ordner.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python3<br />
# *********************************************************************************************<br />
# python3 move_video.py<br />
# *********************************************************************************************<br />
#<br />
import os<br />
import shutil<br />
<br />
quellordner = "/OrdnerA/"<br />
zielordner = "/OrdnerB/"<br />
<br />
# Alle Dateien im Ordner A durchgehen<br />
for datei in os.listdir(quellordner):<br />
    if datei.endswith(".mp4"):<br />
        # Vollständigen Pfad der Datei in Ordner A und B erstellen<br />
        quell_datei = os.path.join(quellordner, datei)<br />
        ziel_datei = os.path.join(zielordner, datei)<br />
<br />
        # Datei verschieben<br />
        shutil.move(quell_datei, ziel_datei)<br />
        print(f"{datei} wurde nach {zielordner} verschoben.&#92;n")</code></div></div>]]></description>
			<content:encoded><![CDATA[Ein einfaches Skript zum Verschieben von Dateien mit der Extension ".mp4" von einem Ordner in den anderen Ordner.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python3<br />
# *********************************************************************************************<br />
# python3 move_video.py<br />
# *********************************************************************************************<br />
#<br />
import os<br />
import shutil<br />
<br />
quellordner = "/OrdnerA/"<br />
zielordner = "/OrdnerB/"<br />
<br />
# Alle Dateien im Ordner A durchgehen<br />
for datei in os.listdir(quellordner):<br />
    if datei.endswith(".mp4"):<br />
        # Vollständigen Pfad der Datei in Ordner A und B erstellen<br />
        quell_datei = os.path.join(quellordner, datei)<br />
        ziel_datei = os.path.join(zielordner, datei)<br />
<br />
        # Datei verschieben<br />
        shutil.move(quell_datei, ziel_datei)<br />
        print(f"{datei} wurde nach {zielordner} verschoben.&#92;n")</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Dateien regelmäßig löschen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=579</link>
			<pubDate>Wed, 22 May 2024 15:44:19 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=579</guid>
			<description><![CDATA[In einem Ordner sammeln sich ständig Dateien mit bestimmten Extensions an, die ich dort nicht haben möchte. Das manuelle Löschen geht mir mittlerweile auf die Nerven, also habe ich mich mal wieder an ein Shell-Skript begeben und lasse die unerwünschten Dateien nun regelmäßig über einen Cronjob löschen.<br />
<br />
Die Lösung war zunächst einfach, denn ein bisschen Erfahrung konnte ich im Laufe der Zeit sammeln, um ein Shell-Skript auf die virtuellen Beine zu stellen.<br />
<br />
Die einfache Variante.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Angabe des Ordner, in dem die unerwünschten Dateien liegen<br />
ordner="/ordnername/"<br />
#<br />
# Dateien mit den unerwünschten Extensions durch Option -o (OR) angegeben<br />
find "&#36;ordner" -type f &#92;( -name "*.jpg" -o -name "*.pdf" -o -name "*.png" &#92;) -delete</code></div></div><br />
Die etwas feinere, aber auch für mich kompliziertere Variante mit Schleife.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Angabe des Ordner, in dem die unerwünschte Dateien liegen<br />
ordner="/ordnername/"<br />
#<br />
# Array mit den unerwünschten Extensions erstellen<br />
extensions=("jpg" "pdf" "png")<br />
#<br />
# Dateien mit den unerwünschten Extensions löschen<br />
for ext in "&#36;{extensions[@]}"; do<br />
    find "&#36;ordner" -type f -name "*.&#36;ext" -delete<br />
done</code></div></div><br />
Den Cronjob habe ich auf 30 Minuten eingestellt, so dass die lästigen Dateien kaum noch meine andere Arbeit behindern.<br />
<br />
Das Shell-Skript muss natürlich ausführbar sein. Und das wird mit folgendem Befehl in der Konsole bewerkstelligt.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chmod +x delete_files.sh</code></div></div><br />
Unabhängig von der Wahl der Skriptsprache hätte dieses Skript auch in Python oder PHP oder sonstwas umgesetzt werden können. Ich fand die Umsetzung über ein normales Shell-Skripts ideal.]]></description>
			<content:encoded><![CDATA[In einem Ordner sammeln sich ständig Dateien mit bestimmten Extensions an, die ich dort nicht haben möchte. Das manuelle Löschen geht mir mittlerweile auf die Nerven, also habe ich mich mal wieder an ein Shell-Skript begeben und lasse die unerwünschten Dateien nun regelmäßig über einen Cronjob löschen.<br />
<br />
Die Lösung war zunächst einfach, denn ein bisschen Erfahrung konnte ich im Laufe der Zeit sammeln, um ein Shell-Skript auf die virtuellen Beine zu stellen.<br />
<br />
Die einfache Variante.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Angabe des Ordner, in dem die unerwünschten Dateien liegen<br />
ordner="/ordnername/"<br />
#<br />
# Dateien mit den unerwünschten Extensions durch Option -o (OR) angegeben<br />
find "&#36;ordner" -type f &#92;( -name "*.jpg" -o -name "*.pdf" -o -name "*.png" &#92;) -delete</code></div></div><br />
Die etwas feinere, aber auch für mich kompliziertere Variante mit Schleife.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Angabe des Ordner, in dem die unerwünschte Dateien liegen<br />
ordner="/ordnername/"<br />
#<br />
# Array mit den unerwünschten Extensions erstellen<br />
extensions=("jpg" "pdf" "png")<br />
#<br />
# Dateien mit den unerwünschten Extensions löschen<br />
for ext in "&#36;{extensions[@]}"; do<br />
    find "&#36;ordner" -type f -name "*.&#36;ext" -delete<br />
done</code></div></div><br />
Den Cronjob habe ich auf 30 Minuten eingestellt, so dass die lästigen Dateien kaum noch meine andere Arbeit behindern.<br />
<br />
Das Shell-Skript muss natürlich ausführbar sein. Und das wird mit folgendem Befehl in der Konsole bewerkstelligt.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chmod +x delete_files.sh</code></div></div><br />
Unabhängig von der Wahl der Skriptsprache hätte dieses Skript auch in Python oder PHP oder sonstwas umgesetzt werden können. Ich fand die Umsetzung über ein normales Shell-Skripts ideal.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Array in Perl verstehen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=445</link>
			<pubDate>Sat, 06 Apr 2024 18:29:16 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=445</guid>
			<description><![CDATA[In einem Perl-Skript ist @ING eine Array-Variable. Diese Variable kann mehrere Werte aufnehmen und speichern. Arrays werden in Perl durch ein vorangestelltes '@'-Zeichen gekennzeichnet.<br />
<br />
Deklaration eines leeren Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING;</code></div></div><br />
Zuweisen von Werten zu einem Array:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>@ING = (1, 2, 3, 4, 5);</code></div></div><br />
Zugriff auf Elemente eines Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;ING[0];  # Gibt das erste Element des Arrays aus<br />
print &#36;ING[1];  # Gibt das zweite Element des Arrays aus</code></div></div><br />
Hinzufügen eines Elements zu einem Array:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>push @ING, 6;  # Fügt das Element 6 am Ende des Arrays hinzu</code></div></div><br />
Iteration über die Elemente eines Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>foreach my &#36;element (@ING) {<br />
    print "&#36;element&#92;n";<br />
}</code></div></div><br />
In diesem Fall ist @ING einfach eine Variable, die als Array verwendet wird. Der Name @ING könnte beliebig sein und wurde in Ihrem Skript wahrscheinlich entsprechend verwendet, um bestimmte Daten zu speichern oder zu verarbeiten.<br />
<br />
<hr class="mycode_hr" />
<br />
Um ein bestimmtes Element aus einem Array in Perl anzusprechen, verwenden Sie den Index dieses Elements in eckigen Klammern nach dem Arraynamen. Hier sind einige Beispiele:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @array = ('a', 'b', 'c', 'd', 'e');</code></div></div><br />
Das erste Element des Arrays (Index 0) ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[0];  # Ausgabe: 'a'</code></div></div><br />
Das dritte Element des Arrays (Index 2) ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[2];  # Ausgabe: 'c'</code></div></div><br />
Das letzte Element des Arrays ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[-1]; # Ausgabe: 'e'</code></div></div><br />
Sie können auf ein Element in einem Array zugreifen, indem Sie den Index des Elements in eckigen Klammern nach dem Arraynamen angeben. Beachten Sie, dass die Indizierung in Perl bei 0 beginnt, sodass das erste Element des Arrays den Index 0 hat, das zweite den Index 1 usw. Sie können auch negative Indizes verwenden, um von hinten zu zählen, wobei -1 das letzte Element des Arrays ist, -2 das vorletzte usw.<br />
<br />
<hr class="mycode_hr" />
<br />
Um das dritte Element aus dem Array @ING zu entfernen, können Sie die splice-Funktion verwenden. Hier ist, wie Sie das machen können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = (1, 2, 3, 4, 5);<br />
<br />
# Das dritte Element entfernen<br />
splice(@ING, 2, 1);<br />
<br />
# Ausgabe des Arrays nach Entfernen des dritten Elements<br />
print "Array nach Entfernen des dritten Elements: @ING&#92;n";</code></div></div><br />
Die splice-Funktion wird verwendet, um Elemente aus einem Array zu entfernen und/oder neue Elemente einzufügen. In diesem Fall entfernen wir 1 Element aus dem Array @ING ab dem Index 2 (0-basiert, das dritte Element) mit splice(@ING, 2, 1).<br />
<br />
<hr class="mycode_hr" />
<br />
Um den Namen 'Detlef' aus dem Array @ING zu entfernen, können Sie die grep-Funktion verwenden, um alle Elemente außer 'Detlef' zu behalten. Hier ist, wie Sie das machen können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = ('Herbert', 'Werner', 'Detlef', 'Hans');<br />
my &#36;zu_entfernender_name = 'Detlef';<br />
<br />
# Nur die Namen behalten, die nicht 'Detlef' sind<br />
@ING = grep { &#36;_ ne &#36;zu_entfernender_name } @ING;<br />
<br />
# Ausgabe des Arrays nach Entfernen des Namens 'Detlef'<br />
print "Array nach Entfernen des Namens 'Detlef': @ING&#92;n";</code></div></div><br />
In diesem Beispiel verwenden wir grep, um alle Elemente des Arrays @ING beizubehalten, die nicht 'Detlef' sind. Das Ergebnis wird dann zurück in das Array @ING gespeichert. Nach diesem Vorgang wird 'Detlef' aus dem Array entfernt sein.<br />
<br />
<hr class="mycode_hr" />
<br />
Hier ist die Verwendung der splice-Funktion, um den Namen 'Detlef' aus dem Array @ING zu entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = ('Herbert', 'Werner', 'Detlef', 'Hans');<br />
my &#36;zu_entfernender_name = 'Detlef';<br />
<br />
# Index des zu entfernenden Namens ermitteln<br />
my &#36;index = -1;<br />
for my &#36;i (0 .. &#36;#ING) {<br />
    if (&#36;ING[&#36;i] eq &#36;zu_entfernender_name) {<br />
        &#36;index = &#36;i;<br />
        last;<br />
    }<br />
}<br />
<br />
# Element aus dem Array entfernen, falls es gefunden wurde<br />
if (&#36;index &gt;= 0) {<br />
    splice(@ING, &#36;index, 1);<br />
}<br />
<br />
# Ausgabe des Arrays nach Entfernen des Namens 'Detlef'<br />
print "Array nach Entfernen des Namens 'Detlef': @ING&#92;n";</code></div></div><br />
In diesem Beispiel wird der Index des Namens 'Detlef' im Array @ING ermittelt, und dann wird die splice-Funktion verwendet, um das Element an diesem Index zu entfernen. Wenn der Name nicht im Array gefunden wird, wird nichts entfernt. Dieser Ansatz ermöglicht es Ihnen, gezielt ein bestimmtes Element aus dem Array zu entfernen.<br />
<br />
In der splice-Funktion gibt der dritte Parameter die Anzahl der Elemente an, die ab dem angegebenen Index aus dem Array entfernt werden sollen.<br />
<br />
Also bedeutet splice(@ING, &#36;index, 1);, dass ab dem Index &#36;index im Array @ING genau ein Element entfernt wird.<br />
<br />
In diesem Fall, wo wir den Namen 'Detlef' entfernen wollen, setzen wir den dritten Parameter auf 1, da wir nur ein Element entfernen wollen, das genau dem zu entfernenden Namen entspricht. Wenn Sie mehrere Elemente an dieser Position entfernen möchten, können Sie den dritten Parameter entsprechend anpassen.<br />
<br />
<hr class="mycode_hr" />
<br />
Sie können dies mit Perl relativ einfach erreichen, indem Sie die Datei öffnen, die letzte Zeile lesen und prüfen, ob sie leer ist. Wenn die letzte Zeile nicht leer ist, fügen Sie eine leere Zeile hinzu.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Dateiname<br />
my &#36;dateiname = "pfad/zur/datei.txt";<br />
<br />
# Datei öffnen (nur zum Lesen)<br />
open(my &#36;datei, '&lt;', &#36;dateiname) or die "Kann Datei nicht öffnen: &#36;!";<br />
<br />
# Alle Zeilen in ein Array einlesen<br />
my @zeilen = &lt;&#36;datei&gt;;<br />
<br />
# Schließen der Datei<br />
close(&#36;datei);<br />
<br />
# Prüfen, ob die letzte Zeile leer ist<br />
if (&#36;zeilen[-1] !~ /&#92;S/) {  # Wenn die letzte Zeile leer ist (keine nicht-Whitespace-Zeichen)<br />
    print "Die letzte Zeile ist leer.&#92;n";<br />
} else {<br />
    # Fügen Sie eine leere Zeile am Ende hinzu<br />
    push @zeilen, "&#92;n";<br />
    print "Eine leere Zeile wurde hinzugefügt.&#92;n";<br />
}<br />
<br />
# Datei zum Schreiben öffnen<br />
open(&#36;datei, '&gt;', &#36;dateiname) or die "Kann Datei nicht öffnen: &#36;!";<br />
<br />
# Schreiben Sie die aktualisierten Zeilen zurück in die Datei<br />
print &#36;datei @zeilen;<br />
<br />
# Schließen der Datei<br />
close(&#36;datei);</code></div></div><br />
In diesem Skript lesen wir die Datei Zeile für Zeile ein und speichern sie in einem Array @zeilen. Dann überprüfen wir, ob die letzte Zeile leer ist, und fügen eine leere Zeile hinzu, wenn dies nicht der Fall ist. Schließlich schreiben wir die aktualisierten Zeilen zurück in die Datei.]]></description>
			<content:encoded><![CDATA[In einem Perl-Skript ist @ING eine Array-Variable. Diese Variable kann mehrere Werte aufnehmen und speichern. Arrays werden in Perl durch ein vorangestelltes '@'-Zeichen gekennzeichnet.<br />
<br />
Deklaration eines leeren Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING;</code></div></div><br />
Zuweisen von Werten zu einem Array:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>@ING = (1, 2, 3, 4, 5);</code></div></div><br />
Zugriff auf Elemente eines Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;ING[0];  # Gibt das erste Element des Arrays aus<br />
print &#36;ING[1];  # Gibt das zweite Element des Arrays aus</code></div></div><br />
Hinzufügen eines Elements zu einem Array:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>push @ING, 6;  # Fügt das Element 6 am Ende des Arrays hinzu</code></div></div><br />
Iteration über die Elemente eines Arrays:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>foreach my &#36;element (@ING) {<br />
    print "&#36;element&#92;n";<br />
}</code></div></div><br />
In diesem Fall ist @ING einfach eine Variable, die als Array verwendet wird. Der Name @ING könnte beliebig sein und wurde in Ihrem Skript wahrscheinlich entsprechend verwendet, um bestimmte Daten zu speichern oder zu verarbeiten.<br />
<br />
<hr class="mycode_hr" />
<br />
Um ein bestimmtes Element aus einem Array in Perl anzusprechen, verwenden Sie den Index dieses Elements in eckigen Klammern nach dem Arraynamen. Hier sind einige Beispiele:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @array = ('a', 'b', 'c', 'd', 'e');</code></div></div><br />
Das erste Element des Arrays (Index 0) ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[0];  # Ausgabe: 'a'</code></div></div><br />
Das dritte Element des Arrays (Index 2) ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[2];  # Ausgabe: 'c'</code></div></div><br />
Das letzte Element des Arrays ansprechen und ausgeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>print &#36;array[-1]; # Ausgabe: 'e'</code></div></div><br />
Sie können auf ein Element in einem Array zugreifen, indem Sie den Index des Elements in eckigen Klammern nach dem Arraynamen angeben. Beachten Sie, dass die Indizierung in Perl bei 0 beginnt, sodass das erste Element des Arrays den Index 0 hat, das zweite den Index 1 usw. Sie können auch negative Indizes verwenden, um von hinten zu zählen, wobei -1 das letzte Element des Arrays ist, -2 das vorletzte usw.<br />
<br />
<hr class="mycode_hr" />
<br />
Um das dritte Element aus dem Array @ING zu entfernen, können Sie die splice-Funktion verwenden. Hier ist, wie Sie das machen können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = (1, 2, 3, 4, 5);<br />
<br />
# Das dritte Element entfernen<br />
splice(@ING, 2, 1);<br />
<br />
# Ausgabe des Arrays nach Entfernen des dritten Elements<br />
print "Array nach Entfernen des dritten Elements: @ING&#92;n";</code></div></div><br />
Die splice-Funktion wird verwendet, um Elemente aus einem Array zu entfernen und/oder neue Elemente einzufügen. In diesem Fall entfernen wir 1 Element aus dem Array @ING ab dem Index 2 (0-basiert, das dritte Element) mit splice(@ING, 2, 1).<br />
<br />
<hr class="mycode_hr" />
<br />
Um den Namen 'Detlef' aus dem Array @ING zu entfernen, können Sie die grep-Funktion verwenden, um alle Elemente außer 'Detlef' zu behalten. Hier ist, wie Sie das machen können:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = ('Herbert', 'Werner', 'Detlef', 'Hans');<br />
my &#36;zu_entfernender_name = 'Detlef';<br />
<br />
# Nur die Namen behalten, die nicht 'Detlef' sind<br />
@ING = grep { &#36;_ ne &#36;zu_entfernender_name } @ING;<br />
<br />
# Ausgabe des Arrays nach Entfernen des Namens 'Detlef'<br />
print "Array nach Entfernen des Namens 'Detlef': @ING&#92;n";</code></div></div><br />
In diesem Beispiel verwenden wir grep, um alle Elemente des Arrays @ING beizubehalten, die nicht 'Detlef' sind. Das Ergebnis wird dann zurück in das Array @ING gespeichert. Nach diesem Vorgang wird 'Detlef' aus dem Array entfernt sein.<br />
<br />
<hr class="mycode_hr" />
<br />
Hier ist die Verwendung der splice-Funktion, um den Namen 'Detlef' aus dem Array @ING zu entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>my @ING = ('Herbert', 'Werner', 'Detlef', 'Hans');<br />
my &#36;zu_entfernender_name = 'Detlef';<br />
<br />
# Index des zu entfernenden Namens ermitteln<br />
my &#36;index = -1;<br />
for my &#36;i (0 .. &#36;#ING) {<br />
    if (&#36;ING[&#36;i] eq &#36;zu_entfernender_name) {<br />
        &#36;index = &#36;i;<br />
        last;<br />
    }<br />
}<br />
<br />
# Element aus dem Array entfernen, falls es gefunden wurde<br />
if (&#36;index &gt;= 0) {<br />
    splice(@ING, &#36;index, 1);<br />
}<br />
<br />
# Ausgabe des Arrays nach Entfernen des Namens 'Detlef'<br />
print "Array nach Entfernen des Namens 'Detlef': @ING&#92;n";</code></div></div><br />
In diesem Beispiel wird der Index des Namens 'Detlef' im Array @ING ermittelt, und dann wird die splice-Funktion verwendet, um das Element an diesem Index zu entfernen. Wenn der Name nicht im Array gefunden wird, wird nichts entfernt. Dieser Ansatz ermöglicht es Ihnen, gezielt ein bestimmtes Element aus dem Array zu entfernen.<br />
<br />
In der splice-Funktion gibt der dritte Parameter die Anzahl der Elemente an, die ab dem angegebenen Index aus dem Array entfernt werden sollen.<br />
<br />
Also bedeutet splice(@ING, &#36;index, 1);, dass ab dem Index &#36;index im Array @ING genau ein Element entfernt wird.<br />
<br />
In diesem Fall, wo wir den Namen 'Detlef' entfernen wollen, setzen wir den dritten Parameter auf 1, da wir nur ein Element entfernen wollen, das genau dem zu entfernenden Namen entspricht. Wenn Sie mehrere Elemente an dieser Position entfernen möchten, können Sie den dritten Parameter entsprechend anpassen.<br />
<br />
<hr class="mycode_hr" />
<br />
Sie können dies mit Perl relativ einfach erreichen, indem Sie die Datei öffnen, die letzte Zeile lesen und prüfen, ob sie leer ist. Wenn die letzte Zeile nicht leer ist, fügen Sie eine leere Zeile hinzu.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Dateiname<br />
my &#36;dateiname = "pfad/zur/datei.txt";<br />
<br />
# Datei öffnen (nur zum Lesen)<br />
open(my &#36;datei, '&lt;', &#36;dateiname) or die "Kann Datei nicht öffnen: &#36;!";<br />
<br />
# Alle Zeilen in ein Array einlesen<br />
my @zeilen = &lt;&#36;datei&gt;;<br />
<br />
# Schließen der Datei<br />
close(&#36;datei);<br />
<br />
# Prüfen, ob die letzte Zeile leer ist<br />
if (&#36;zeilen[-1] !~ /&#92;S/) {  # Wenn die letzte Zeile leer ist (keine nicht-Whitespace-Zeichen)<br />
    print "Die letzte Zeile ist leer.&#92;n";<br />
} else {<br />
    # Fügen Sie eine leere Zeile am Ende hinzu<br />
    push @zeilen, "&#92;n";<br />
    print "Eine leere Zeile wurde hinzugefügt.&#92;n";<br />
}<br />
<br />
# Datei zum Schreiben öffnen<br />
open(&#36;datei, '&gt;', &#36;dateiname) or die "Kann Datei nicht öffnen: &#36;!";<br />
<br />
# Schreiben Sie die aktualisierten Zeilen zurück in die Datei<br />
print &#36;datei @zeilen;<br />
<br />
# Schließen der Datei<br />
close(&#36;datei);</code></div></div><br />
In diesem Skript lesen wir die Datei Zeile für Zeile ein und speichern sie in einem Array @zeilen. Dann überprüfen wir, ob die letzte Zeile leer ist, und fügen eine leere Zeile hinzu, wenn dies nicht der Fall ist. Schließlich schreiben wir die aktualisierten Zeilen zurück in die Datei.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[eMail analysieren und zerlegen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=410</link>
			<pubDate>Sun, 07 Jan 2024 20:30:15 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=410</guid>
			<description><![CDATA[Jeder von uns bekommt wahrscheinlich jeden Tag Mails. Die einen bekommen mehr, die anderen bekommen weniger.<br />
<br />
Die wenigsten User machen sich heutzutage darüber Gedanken, wie eine Mail entsteht bzw. aus welchen Bestandteilen diese zusammen gesetzt ist.<br />
<br />
In einer anderen Sache habe ich mich genau damit beschäftigt, was eine Mail ausmacht und was sie alles enthalten kann sowie wie diese in unserem Mailclient bzw. online beim Mailanbieter für uns zu lesen ist.<br />
<br />
Meine Aufzeichnungen sind nicht abschließend, sondern spiegeln mein Wissen wider und zeigen das, was ich bislang erreicht habe.<br />
<br />
Generell kann man sagen, dass eine Mail 2 Hauptbestandteile (Mailheader und Mailbody) mit 3 Sektionen hat:<br />
<ul class="mycode_list"><li>Mailheader<br />
</li>
<li>Mailbody mit Mailtext Plain/HTML<br />
</li>
<li>Mailbody mit Anlagen<br />
</li>
</ul>
<br />
Der Mailheader beinhaltet alle technsichen Informationen, die die einzelnen Stellen, die die Mail ausliefern bzw. weiterleiten mitgegeben haben.<br />
<br />
Die Mailtext kann in zwei Formaten vorliegen (entweder oder / beides zusammen):<br />
<ul class="mycode_list"><li>Plaintext (also Klartext)<br />
</li>
<li>HTML-Text (HTML-Rohdaten)<br />
</li>
</ul>
<br />
Sobald eine Mail Plaintext und HTML-Text enthält, bekommt sie das Attribut: multipart (dazu später mehr)<br />
<br />
Eine Mail kann im Klartext oder kodiert ausgeliefert werden. Wird sie kodiert ausgeliefert, so ist dies die base64-Kodierung.<br />
<br />
Wichtig bei der Darstellung des Mailtextes ist es zu wissen, mit welchem Zeichensatz (charset) die Mail verfasst wurde. Generell nutzen die westlichen Ländern mittlerweile den Zeichensatz utf-8, aber besonders aus dem kyrillisch-sprachigen Raum kommen oftmals andere Zeichensätze mit. Das liegt oftmals daran, die der Mailclient es Mailverfassers eingerichtet ist.<br />
<br />
Mailtexte im Klartext haben folgenden Eintrag: Content-Transfer-Encoding: quoted-printable<br />
<br />
Mailtexte können aber auch eine Kodierung haben: Content-Transfer-Encoding: base64<br />
<br />
Damit sind die Mailtexte als Rohdaten der Mail nicht lesbar und müssen dekodiert werden.<br />
<br />
Alle Anlagen werden für gewöhnlich base64-kodiert: Content-Transfer-Encoding: base64<br />
<br />
Die derzeit für mich wichtigsten Zeichensätze sind neben utf-8 die folgenden:<br />
<ul class="mycode_list"><li>iso-8859-1<br />
</li>
<li>iso-8859-2<br />
</li>
<li>iso-8859-15<br />
</li>
<li>windows-1250<br />
</li>
<li>windows-1251<br />
</li>
<li>us-ascii<br />
</li>
<li>koi8-r<br />
</li>
</ul>
<br />
Es ist wirklich nicht einfach für den Hobbyprogrammierer, eine Mail zu analysieren und die Mailtext lesbar ohne Sonderzeichen zu machen und die Anlage abzuspeichern.<br />
<br />
Je nach dem, welcher Zeichensatz genutzt wird, gibt es immer wieder andere Vorgehensweisen, um die Mail analysieren zu können.<br />
<br />
In den folgenden Antworten auf diesen Eröffnungsthread möchte ich meine Erkenntnisse dokumentieren, da sie mittlerweile ein PHP-Skript umfassen, dass aus dem Ruder läuft.  <img src="https://forum.hermann-splitthoff.de/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
Die in dem primären Beispiel verwendete Mail ist eine Phantasiemail mit Phantasiedaten soweit es die Identität der beteiligten Personen angeht.<br />
<br />
Die Mail wird eine Multipart-Mail sein, mit dem Zeichensatz utf-8, mit Plain- und HTML-Text sowie mit Anlagen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MIME 1.0</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "MIME-Version: 1.0" in einem Mailheader gibt an, dass die E-Mail gemäß dem MIME-Standard (Multipurpose Internet Mail Extensions) verfasst ist und welcher Version dieses Standards entspricht.<br />
<br />
Die Bedeutung dieses Eintrags ist:<br />
<br />
MIME-Version: Dieses Feld gibt die Version des MIME-Standards an, der für die Formatierung und den Austausch von Multimedia-Inhalten über das Internet verwendet wird.<br />
<br />
1.0: Die Zahl "1.0" ist die Versionsnummer des MIME-Standards, die in diesem Fall angibt, dass die E-Mail nach den Spezifikationen von MIME-Version 1.0 formatiert ist.<br />
<br />
MIME wird verwendet, um unterschiedliche Arten von Inhalten in E-Mails zu unterstützen, darunter Text, HTML, Bilder, Audiodateien und andere multimediale Inhalte. Durch die Angabe der MIME-Version in der E-Mail-Headerzeile wird sichergestellt, dass der E-Mail-Client den MIME-Standard korrekt interpretieren kann, um die verschiedenen Arten von Inhalten ordnungsgemäß darzustellen.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">multipart/mixed</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Type: multipart/mixed;" in einem Mailheader gibt an, dass die E-Mail mehrere Teile (Parts) enthält, von denen mindestens einer ein binärer Anhang (zum Beispiel eine Datei) sein kann. Das "multipart/mixed"-MIME-Typ wird verwendet, um verschiedene Inhaltsarten in einer E-Mail zu kombinieren, wobei jeder Teil unterschiedliche Inhaltsmerkmale haben kann.<br />
<br />
Die Bedeutung der Teile in einer "multipart/mixed"-E-Mail könnte sein:<br />
<br />
Textteile: Zum Beispiel der eigentliche Text der E-Mail im Klartextformat (text/plain).<br />
<br />
Anhang: Zum Beispiel Bilddateien, Dokumente oder andere Binärdateien (application/octet-stream oder der spezifische Typ der Datei).<br />
<br />
Die E-Mail-Clients interpretieren diese Teile entsprechend ihrem MIME-Typ und stellen den Inhalt entsprechend dar. Dies ermöglicht es, sowohl Text als auch Anhänge in einer einzigen E-Mail zu versenden.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">multipart/alternative</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Type: multipart/alternative;" in einem Mailheader gibt an, dass die E-Mail mehrere alternative Versionen des Inhalts enthält. Jede alternative Version ist in einem separaten Teil (Teil) der E-Mail enthalten, und der E-Mail-Client kann die am besten geeignete Version für die Anzeige auswählen.<br />
<br />
Die "multipart/alternative"-Struktur wird häufig für Textformatierungen verwendet, um sicherzustellen, dass der Empfänger die E-Mail in dem von seinem E-Mail-Client am besten unterstützten Format sieht. Die verschiedenen Versionen können unterschiedliche MIME-Typen für den Text enthalten, z. B.:<br />
<br />
text/plain: Klartextversion der E-Mail.<br />
text/html: HTML-Version der E-Mail mit möglicherweise formatiertem Text und Bildern.<br />
Die Idee hinter "multipart/alternative" ist, dass der E-Mail-Client die am besten geeignete Version für die Anzeige auswählt. Wenn der Empfänger einen E-Mail-Client verwendet, der HTML unterstützt, kann er die HTML-Version sehen. Andernfalls wird die einfache Textversion angezeigt. Dies ermöglicht eine flexiblere Anpassung an verschiedene E-Mail-Clients und Präferenzen der Benutzer.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">attachments</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Disposition: attachment;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Attachment) der E-Mail als Anhang behandelt werden soll. Das bedeutet, dass der Teil nicht inline im Text angezeigt wird, sondern als Dateianhang heruntergeladen oder geöffnet werden kann.<br />
<br />
Die Bedeutung von "Content-Disposition: attachment;" liegt darin, dass der Empfänger der E-Mail den Anhang separat speichern oder öffnen kann, anstatt dass der Inhalt direkt im E-Mail-Text angezeigt wird. Dies ist typisch für Dateianhänge wie Dokumente, Bilder oder andere Dateitypen, die nicht im direkten Fließtext der E-Mail angezeigt werden sollen.<br />
<br />
Zusätzlich zur Information darüber, dass es sich um einen Anhang handelt, kann "Content-Disposition" auch weitere Attribute enthalten, wie z. B. der Dateiname des Anhangs.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">image/jpeg</span><br />
<br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
Die Zeile "Content-Type: image/jpeg;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Content) der E-Mail ein JPEG-Bild ist. Der MIME-Typ "image/jpeg" gibt an, dass es sich um eine JPEG-Bilddatei handelt.<br />
<br />
Content-Type: Dieser Header gibt den Medientyp des Inhalts an, und "image/jpeg" spezifiziert den Typ des Bildinhalts als JPEG.<br />
JPEG (Joint Photographic Experts Group) ist ein weit verbreitetes Dateiformat für komprimierte Bilddateien, das bei der Speicherung von Fotos und anderen Grafiken verwendet wird. Der MIME-Typ hilft dem E-Mail-Client, den Inhalt korrekt zu interpretieren und entsprechend anzuzeigen.<br />
<br />
Diese Information ist wichtig, damit der E-Mail-Client weiß, wie er den Inhalt verarbeiten und darstellen soll.<br />
<br />
</div>
		</div>]]></description>
			<content:encoded><![CDATA[Jeder von uns bekommt wahrscheinlich jeden Tag Mails. Die einen bekommen mehr, die anderen bekommen weniger.<br />
<br />
Die wenigsten User machen sich heutzutage darüber Gedanken, wie eine Mail entsteht bzw. aus welchen Bestandteilen diese zusammen gesetzt ist.<br />
<br />
In einer anderen Sache habe ich mich genau damit beschäftigt, was eine Mail ausmacht und was sie alles enthalten kann sowie wie diese in unserem Mailclient bzw. online beim Mailanbieter für uns zu lesen ist.<br />
<br />
Meine Aufzeichnungen sind nicht abschließend, sondern spiegeln mein Wissen wider und zeigen das, was ich bislang erreicht habe.<br />
<br />
Generell kann man sagen, dass eine Mail 2 Hauptbestandteile (Mailheader und Mailbody) mit 3 Sektionen hat:<br />
<ul class="mycode_list"><li>Mailheader<br />
</li>
<li>Mailbody mit Mailtext Plain/HTML<br />
</li>
<li>Mailbody mit Anlagen<br />
</li>
</ul>
<br />
Der Mailheader beinhaltet alle technsichen Informationen, die die einzelnen Stellen, die die Mail ausliefern bzw. weiterleiten mitgegeben haben.<br />
<br />
Die Mailtext kann in zwei Formaten vorliegen (entweder oder / beides zusammen):<br />
<ul class="mycode_list"><li>Plaintext (also Klartext)<br />
</li>
<li>HTML-Text (HTML-Rohdaten)<br />
</li>
</ul>
<br />
Sobald eine Mail Plaintext und HTML-Text enthält, bekommt sie das Attribut: multipart (dazu später mehr)<br />
<br />
Eine Mail kann im Klartext oder kodiert ausgeliefert werden. Wird sie kodiert ausgeliefert, so ist dies die base64-Kodierung.<br />
<br />
Wichtig bei der Darstellung des Mailtextes ist es zu wissen, mit welchem Zeichensatz (charset) die Mail verfasst wurde. Generell nutzen die westlichen Ländern mittlerweile den Zeichensatz utf-8, aber besonders aus dem kyrillisch-sprachigen Raum kommen oftmals andere Zeichensätze mit. Das liegt oftmals daran, die der Mailclient es Mailverfassers eingerichtet ist.<br />
<br />
Mailtexte im Klartext haben folgenden Eintrag: Content-Transfer-Encoding: quoted-printable<br />
<br />
Mailtexte können aber auch eine Kodierung haben: Content-Transfer-Encoding: base64<br />
<br />
Damit sind die Mailtexte als Rohdaten der Mail nicht lesbar und müssen dekodiert werden.<br />
<br />
Alle Anlagen werden für gewöhnlich base64-kodiert: Content-Transfer-Encoding: base64<br />
<br />
Die derzeit für mich wichtigsten Zeichensätze sind neben utf-8 die folgenden:<br />
<ul class="mycode_list"><li>iso-8859-1<br />
</li>
<li>iso-8859-2<br />
</li>
<li>iso-8859-15<br />
</li>
<li>windows-1250<br />
</li>
<li>windows-1251<br />
</li>
<li>us-ascii<br />
</li>
<li>koi8-r<br />
</li>
</ul>
<br />
Es ist wirklich nicht einfach für den Hobbyprogrammierer, eine Mail zu analysieren und die Mailtext lesbar ohne Sonderzeichen zu machen und die Anlage abzuspeichern.<br />
<br />
Je nach dem, welcher Zeichensatz genutzt wird, gibt es immer wieder andere Vorgehensweisen, um die Mail analysieren zu können.<br />
<br />
In den folgenden Antworten auf diesen Eröffnungsthread möchte ich meine Erkenntnisse dokumentieren, da sie mittlerweile ein PHP-Skript umfassen, dass aus dem Ruder läuft.  <img src="https://forum.hermann-splitthoff.de/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
Die in dem primären Beispiel verwendete Mail ist eine Phantasiemail mit Phantasiedaten soweit es die Identität der beteiligten Personen angeht.<br />
<br />
Die Mail wird eine Multipart-Mail sein, mit dem Zeichensatz utf-8, mit Plain- und HTML-Text sowie mit Anlagen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">MIME 1.0</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "MIME-Version: 1.0" in einem Mailheader gibt an, dass die E-Mail gemäß dem MIME-Standard (Multipurpose Internet Mail Extensions) verfasst ist und welcher Version dieses Standards entspricht.<br />
<br />
Die Bedeutung dieses Eintrags ist:<br />
<br />
MIME-Version: Dieses Feld gibt die Version des MIME-Standards an, der für die Formatierung und den Austausch von Multimedia-Inhalten über das Internet verwendet wird.<br />
<br />
1.0: Die Zahl "1.0" ist die Versionsnummer des MIME-Standards, die in diesem Fall angibt, dass die E-Mail nach den Spezifikationen von MIME-Version 1.0 formatiert ist.<br />
<br />
MIME wird verwendet, um unterschiedliche Arten von Inhalten in E-Mails zu unterstützen, darunter Text, HTML, Bilder, Audiodateien und andere multimediale Inhalte. Durch die Angabe der MIME-Version in der E-Mail-Headerzeile wird sichergestellt, dass der E-Mail-Client den MIME-Standard korrekt interpretieren kann, um die verschiedenen Arten von Inhalten ordnungsgemäß darzustellen.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">multipart/mixed</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Type: multipart/mixed;" in einem Mailheader gibt an, dass die E-Mail mehrere Teile (Parts) enthält, von denen mindestens einer ein binärer Anhang (zum Beispiel eine Datei) sein kann. Das "multipart/mixed"-MIME-Typ wird verwendet, um verschiedene Inhaltsarten in einer E-Mail zu kombinieren, wobei jeder Teil unterschiedliche Inhaltsmerkmale haben kann.<br />
<br />
Die Bedeutung der Teile in einer "multipart/mixed"-E-Mail könnte sein:<br />
<br />
Textteile: Zum Beispiel der eigentliche Text der E-Mail im Klartextformat (text/plain).<br />
<br />
Anhang: Zum Beispiel Bilddateien, Dokumente oder andere Binärdateien (application/octet-stream oder der spezifische Typ der Datei).<br />
<br />
Die E-Mail-Clients interpretieren diese Teile entsprechend ihrem MIME-Typ und stellen den Inhalt entsprechend dar. Dies ermöglicht es, sowohl Text als auch Anhänge in einer einzigen E-Mail zu versenden.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">multipart/alternative</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Type: multipart/alternative;" in einem Mailheader gibt an, dass die E-Mail mehrere alternative Versionen des Inhalts enthält. Jede alternative Version ist in einem separaten Teil (Teil) der E-Mail enthalten, und der E-Mail-Client kann die am besten geeignete Version für die Anzeige auswählen.<br />
<br />
Die "multipart/alternative"-Struktur wird häufig für Textformatierungen verwendet, um sicherzustellen, dass der Empfänger die E-Mail in dem von seinem E-Mail-Client am besten unterstützten Format sieht. Die verschiedenen Versionen können unterschiedliche MIME-Typen für den Text enthalten, z. B.:<br />
<br />
text/plain: Klartextversion der E-Mail.<br />
text/html: HTML-Version der E-Mail mit möglicherweise formatiertem Text und Bildern.<br />
Die Idee hinter "multipart/alternative" ist, dass der E-Mail-Client die am besten geeignete Version für die Anzeige auswählt. Wenn der Empfänger einen E-Mail-Client verwendet, der HTML unterstützt, kann er die HTML-Version sehen. Andernfalls wird die einfache Textversion angezeigt. Dies ermöglicht eine flexiblere Anpassung an verschiedene E-Mail-Clients und Präferenzen der Benutzer.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">attachments</span><br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
Die Zeile "Content-Disposition: attachment;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Attachment) der E-Mail als Anhang behandelt werden soll. Das bedeutet, dass der Teil nicht inline im Text angezeigt wird, sondern als Dateianhang heruntergeladen oder geöffnet werden kann.<br />
<br />
Die Bedeutung von "Content-Disposition: attachment;" liegt darin, dass der Empfänger der E-Mail den Anhang separat speichern oder öffnen kann, anstatt dass der Inhalt direkt im E-Mail-Text angezeigt wird. Dies ist typisch für Dateianhänge wie Dokumente, Bilder oder andere Dateitypen, die nicht im direkten Fließtext der E-Mail angezeigt werden sollen.<br />
<br />
Zusätzlich zur Information darüber, dass es sich um einen Anhang handelt, kann "Content-Disposition" auch weitere Attribute enthalten, wie z. B. der Dateiname des Anhangs.<br />
<br />
<br />
</div>
		</div>
<br />
<span style="font-weight: bold;" class="mycode_b">image/jpeg</span><br />
<br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
Die Zeile "Content-Type: image/jpeg;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Content) der E-Mail ein JPEG-Bild ist. Der MIME-Typ "image/jpeg" gibt an, dass es sich um eine JPEG-Bilddatei handelt.<br />
<br />
Content-Type: Dieser Header gibt den Medientyp des Inhalts an, und "image/jpeg" spezifiziert den Typ des Bildinhalts als JPEG.<br />
JPEG (Joint Photographic Experts Group) ist ein weit verbreitetes Dateiformat für komprimierte Bilddateien, das bei der Speicherung von Fotos und anderen Grafiken verwendet wird. Der MIME-Typ hilft dem E-Mail-Client, den Inhalt korrekt zu interpretieren und entsprechend anzuzeigen.<br />
<br />
Diese Information ist wichtig, damit der E-Mail-Client weiß, wie er den Inhalt verarbeiten und darstellen soll.<br />
<br />
</div>
		</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HTML-Tags decodieren]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=408</link>
			<pubDate>Sun, 07 Jan 2024 19:31:04 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=408</guid>
			<description><![CDATA[In der letzten Zeit kommt es immer häufiger vor, dass ich HTML-Texte als Rohdaten in eine MySQL-Datenbank erfasse. Der Umgang mit HTML-Tags sind insgesamt nicht immer einfach, aber wenn man weiß, was man will, dann kann man sich sehr gut helfen.<br />
<br />
Wenn HTML-Rohdaten nicht in einem Browser ausgeführt werden, dann gibt es unschöne Leseansichten bzw. die Daten sind nicht in einer MySQL-Datenbank erfassbar.<br />
<br />
Wer einen HTML-Text außerhalb eines Browsers lesen will, der sollte tunlichst die HTML-Tags ausblenden.<br />
Wer einen HTML-Text in eine Datenbank, z.B. MySQL, erfassen will, der muss diverse Sonderzeichen masieren, die sonst bei der Erfassung zu einem Fehler führen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 1</span></span><br />
Ein HTML-Rohtext wird in der Konsole ausgegeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
echo "Text 1 " . &#36;text . "&#92;n";</code></div></div>Ergebnis<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Text 1 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p></blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 2</span></span><br />
Die HTML-Rohdaten werden gestript, um den Text lesbar zu machen<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text2 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text2 = strip_tags(&#36;text2);<br />
echo "Text 2 " . &#36;text2 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 2 Das ist mein Text, der ausgegeben werden soll.</code></div></div><br />
Fall 3 entfällt<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><br />
Fall 4</span></span><br />
Die HTML-Rohdaten werden als Entities umgewandelt<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text4 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text4 = htmlentities(&#36;text4);<br />
echo "Text 4 " . &#36;text4 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 4 &amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;</code></div></div><span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><br />
Fall 5</span></span><br />
Insbesondere bei der Erfassung von HTML-Rohdaten in einer MySQL-Datenbank ist der folgende Befehl zu nutzen.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text5 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text5 = htmlspecialchars(&#36;text5);<br />
echo "Text 5 " . &#36;text5 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 5 &amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;</code></div></div><br />
Fall 6 entfällt<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 7</span></span><br />
Die HTML-Entitäten werden wieder zurückgewandelt.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text7 = "&amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;";<br />
&#36;text7 = htmlspecialchars_decode(&#36;text7);<br />
echo "Text 7 " . &#36;text7 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 7 &lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;</code></div></div><br />
Wie wohl zu erkennen ist, kann man die HMTL-Tags bzw. die Zeichen, die nicht einfach so in eine MySQL-Datenbank erfasst werden können, ohne sie zu maskieren, so umwandeln, dass man damit arbeiten kann.<br />
<br />
Der Fall 2 zeigt, dass die HTML-Rohdaten in einen gut lesbaren Fließtext umgewandelt werden können.<br />
Die Entities können in die eine, aber auch wieder in die andere Richtung zurückgewandelt werden.<br />
<br />
Ich nutze diese Erkenntnisse derzeit so, dass ich Mailheader aus eMails in eine MySQL-Datenbank speichere, aber auch die entsprechenden Mailtext. Die Mailtexte können in Plaintext und als HTML-Rohdaten vorliegen. Auch dann sind die obigen Erkenntnisse absolut wichtig, um die Datenbankerfassung zu ermöglichen.]]></description>
			<content:encoded><![CDATA[In der letzten Zeit kommt es immer häufiger vor, dass ich HTML-Texte als Rohdaten in eine MySQL-Datenbank erfasse. Der Umgang mit HTML-Tags sind insgesamt nicht immer einfach, aber wenn man weiß, was man will, dann kann man sich sehr gut helfen.<br />
<br />
Wenn HTML-Rohdaten nicht in einem Browser ausgeführt werden, dann gibt es unschöne Leseansichten bzw. die Daten sind nicht in einer MySQL-Datenbank erfassbar.<br />
<br />
Wer einen HTML-Text außerhalb eines Browsers lesen will, der sollte tunlichst die HTML-Tags ausblenden.<br />
Wer einen HTML-Text in eine Datenbank, z.B. MySQL, erfassen will, der muss diverse Sonderzeichen masieren, die sonst bei der Erfassung zu einem Fehler führen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 1</span></span><br />
Ein HTML-Rohtext wird in der Konsole ausgegeben<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
echo "Text 1 " . &#36;text . "&#92;n";</code></div></div>Ergebnis<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Text 1 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p></blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 2</span></span><br />
Die HTML-Rohdaten werden gestript, um den Text lesbar zu machen<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text2 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text2 = strip_tags(&#36;text2);<br />
echo "Text 2 " . &#36;text2 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 2 Das ist mein Text, der ausgegeben werden soll.</code></div></div><br />
Fall 3 entfällt<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><br />
Fall 4</span></span><br />
Die HTML-Rohdaten werden als Entities umgewandelt<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text4 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text4 = htmlentities(&#36;text4);<br />
echo "Text 4 " . &#36;text4 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 4 &amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;</code></div></div><span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><br />
Fall 5</span></span><br />
Insbesondere bei der Erfassung von HTML-Rohdaten in einer MySQL-Datenbank ist der folgende Befehl zu nutzen.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text5 = "&lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;";<br />
&#36;text5 = htmlspecialchars(&#36;text5);<br />
echo "Text 5 " . &#36;text5 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 5 &amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;</code></div></div><br />
Fall 6 entfällt<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color">Fall 7</span></span><br />
Die HTML-Entitäten werden wieder zurückgewandelt.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36;text7 = "&amp;lt;p&amp;gt;Das ist mein Text, der &amp;lt;strong&amp;gt;ausgegeben&amp;lt;/strong&amp;gt; werden soll.&amp;lt;/p&amp;gt;";<br />
&#36;text7 = htmlspecialchars_decode(&#36;text7);<br />
echo "Text 7 " . &#36;text7 . "&#92;n";</code></div></div>Ergebnis<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Text 7 &lt;p&gt;Das ist mein Text, der &lt;strong&gt;ausgegeben&lt;/strong&gt; werden soll.&lt;/p&gt;</code></div></div><br />
Wie wohl zu erkennen ist, kann man die HMTL-Tags bzw. die Zeichen, die nicht einfach so in eine MySQL-Datenbank erfasst werden können, ohne sie zu maskieren, so umwandeln, dass man damit arbeiten kann.<br />
<br />
Der Fall 2 zeigt, dass die HTML-Rohdaten in einen gut lesbaren Fließtext umgewandelt werden können.<br />
Die Entities können in die eine, aber auch wieder in die andere Richtung zurückgewandelt werden.<br />
<br />
Ich nutze diese Erkenntnisse derzeit so, dass ich Mailheader aus eMails in eine MySQL-Datenbank speichere, aber auch die entsprechenden Mailtext. Die Mailtexte können in Plaintext und als HTML-Rohdaten vorliegen. Auch dann sind die obigen Erkenntnisse absolut wichtig, um die Datenbankerfassung zu ermöglichen.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Linkliste]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=406</link>
			<pubDate>Sun, 07 Jan 2024 17:45:58 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=406</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Links, die wichtig sein können</span><br />
<br />
<a href="https://perl-begin.org/" target="_blank" rel="noopener" class="mycode_url">Eine ältere Beginner-Seite</a><br />
<a href="https://www.cpan.org/" target="_blank" rel="noopener" class="mycode_url">CPAN - Comprehensive Perl Archive Network</a><br />
<a href="https://www.cpan.org/modules/INSTALL.html" target="_blank" rel="noopener" class="mycode_url">CPAN - How to install CPAN moduls</a><br />
<a href="https://metacpan.org/" target="_blank" rel="noopener" class="mycode_url">meta::cpan - Suchmaschine für CPAN</a><br />
<a href="http://www.hidemail.de/blog/datei-zeilenweise-einlesen.shtml" target="_blank" rel="noopener" class="mycode_url">Datei zeilenweise einlesen</a><br />
<a href="https://www.perlmonks.org/" target="_blank" rel="noopener" class="mycode_url">PerlMonks</a><br />
<a href="https://www.perl.com/" target="_blank" rel="noopener" class="mycode_url">Perl.com</a><br />
<a href="https://www.perltutorial.org/" target="_blank" rel="noopener" class="mycode_url">Perl Tutorial</a><br />
<a href="https://squareperl.com/de" target="_blank" rel="noopener" class="mycode_url">SquarePerl.com</a><br />
<a href="http://modernperlbooks.com/books/modern_perl_2014/" target="_blank" rel="noopener" class="mycode_url">Modern Perl 2014</a><br />
<a href="https://perlmaven.com/" target="_blank" rel="noopener" class="mycode_url">Perl Maven</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Links, die wichtig sein können</span><br />
<br />
<a href="https://perl-begin.org/" target="_blank" rel="noopener" class="mycode_url">Eine ältere Beginner-Seite</a><br />
<a href="https://www.cpan.org/" target="_blank" rel="noopener" class="mycode_url">CPAN - Comprehensive Perl Archive Network</a><br />
<a href="https://www.cpan.org/modules/INSTALL.html" target="_blank" rel="noopener" class="mycode_url">CPAN - How to install CPAN moduls</a><br />
<a href="https://metacpan.org/" target="_blank" rel="noopener" class="mycode_url">meta::cpan - Suchmaschine für CPAN</a><br />
<a href="http://www.hidemail.de/blog/datei-zeilenweise-einlesen.shtml" target="_blank" rel="noopener" class="mycode_url">Datei zeilenweise einlesen</a><br />
<a href="https://www.perlmonks.org/" target="_blank" rel="noopener" class="mycode_url">PerlMonks</a><br />
<a href="https://www.perl.com/" target="_blank" rel="noopener" class="mycode_url">Perl.com</a><br />
<a href="https://www.perltutorial.org/" target="_blank" rel="noopener" class="mycode_url">Perl Tutorial</a><br />
<a href="https://squareperl.com/de" target="_blank" rel="noopener" class="mycode_url">SquarePerl.com</a><br />
<a href="http://modernperlbooks.com/books/modern_perl_2014/" target="_blank" rel="noopener" class="mycode_url">Modern Perl 2014</a><br />
<a href="https://perlmaven.com/" target="_blank" rel="noopener" class="mycode_url">Perl Maven</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[CGI auf Webserver ausführbar machen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=405</link>
			<pubDate>Sun, 07 Jan 2024 17:37:13 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=405</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">CGI auf Webserver ausführbar machen</span><br />
<br />
Heute, am 22.07.2021, habe ich es endlich geschafft, im Browser ein cgi-Script aufzurufen.<br />
<br />
Geholfen hat mir diese Webseite:<br />
<br />
<a href="https://www.server-world.info/en/note?os=Debian_10" target="_blank" rel="noopener" class="mycode_url">https://www.server-world.info/en/note?os=Debian_10</a>&p=httpd&f=2<br />
<br />
Ich bin mir nicht sicher, ob ich alles richtig verstanden habe. Eigentlich kenne ich das so, dass es auf dem Webserver (/var/www/html) einen Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-bin</span> gibt.<br />
<br />
Die Webseite arbeitet aber mit dem Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-enabled</span>.<br />
<br />
Alle meine Versuche hier auf dem Desktop-Rechner als auch auf dem Notebook haben ergeben, dass ich diesen Ordner /cgi-enabled nutzen muss. Der Ordner /cgi-bin funktioniert nicht.<br />
<br />
Auch kann ich nicht meinen normalen User zur Anlage von Ordner und z.B. index.cgi nutzen. Die Ordner als auch die Dateien werden mit dem <span style="font-weight: bold;" class="mycode_b">root</span> erstellt und dann über chmod 705 entsprechen berechtigt.<br />
<br />
Nur das funktioniert.<br />
<br />
Wenn ich den Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-bin</span> so in die Abläufe einbaue, wird später im Browser gezeigt, dass die URL nicht vorhanden ist.<br />
<br />
Mit dem Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-enabled</span> wird die Testseite angezeigt:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=47" target="_blank" title="">Pasted image 20210722181624.png</a> (Größe: 15,79 KB / Downloads: 89)
<!-- end: postbit_attachments_attachment --><br />
<br />
Ich werde noch weitersuchen und mal prüfen, ob ich das anders hätte hinbekommen können.<br />
<br />
---<br />
<br />
Das ist die Historie der BASH, aus der ich die wichtigen Befehlszeilen herausfiltern werde, um eine Dokumentation zu schreiben:<br />
<br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
>  480  cat > /usr/lib/cgi-bin/test_script <<'EOF' <br />
 481  #!/usr/bin/perl <br />
 482  print "Content-type: text/html\n\n"; <br />
 483  print "Hello CGI\n"; <br />
 484  EOF <br />
 485  ls -l <br />
 486  chmod 705 /usr/lib/cgi-bin/test_script <br />
 487  curl <a href="http://localhost/cgi-bin/test_script" target="_blank" rel="noopener" class="mycode_url">http://localhost/cgi-bin/test_script</a> <br />
 488  a2enmod cgid <br />
 489  sudo a2enmod cgid <br />
 490  systemctl restart apache2 <br />
 491  curl <a href="http://localhost/cgi-bin/test_script" target="_blank" rel="noopener" class="mycode_url">http://localhost/cgi-bin/test_script</a> <br />
 492  nano vi /etc/apache2/conf-available/cgi-enabled.conf <br />
 493  nano /etc/apache2/conf-available/cgi-enabled.conf <br />
 494  sudo a2enconf cgi-bin <br />
 495  sudo a2enconf cgi-enabled <br />
 496  systemctl restart apache2 <br />
 497  exit <br />
 498  cd .. <br />
 499  mkdir /media/django/webserver/cgi-enabled <br />
 500  a2enconf cgi-enabled <br />
 501  sudo a2enconf cgi-enabled <br />
 502  sudo a2disconf cgi-enabled <br />
 503  systemctl restart apache2 <br />
 504  sudo a2enconf cgi-enabled <br />
 505  systemctl restart apache2 <br />
 506  nano /media/django/webserver/cgi-enabled/index.cgi <br />
 507  chmod 705 /media/django/webserver/cgi-enabled/index.cgi <br />
 508  ls -l <br />
 509  cd cgi-enabled/ <br />
 510  ls -l <br />
 511  sudo a2disconf cgi-enabled <br />
 512  systemctl restart apache2 <br />
 513  cd .. <br />
 514  mkdir cgi-bin <br />
 515  sudo a2enconf cgi-bin <br />
 516  systemctl restart apache2 <br />
 517  cd cgi-bin/ <br />
 518  nano index.cgi <br />
 519  ls -l <br />
 520  chmod 705 index.cgi <br />
 521  ls -l <br />
 522  sudo a2enconf cgi-bin <br />
 523  systemctl restart apache2 <br />
 524  sudo a2disconf cgi-bin <br />
 525  systemctl restart apache2 <br />
 526  sudo a2enconf cgi-bin <br />
 527  systemctl restart apache2 <br />
 528  sudo a2disconf cgi-bin <br />
 529  systemctl restart apache2 <br />
 530  cd .. <br />
 531  ls -l <br />
 532  mkdir cgi-enabled <br />
 533  ls -l <br />
 534  sudo a2enconf cgi-enabled <br />
 535  systemctl restart apache2 <br />
 536  cd cgi-enabled/ <br />
 537  nano index.cgi <br />
 538  chmod 705 index.cgi <br />
 539  ls -l <br />
 540  cp index.cgi index.pl <br />
 541  nano index.pl <br />
 542  cp index.pl index.py <br />
 543  nano index.py <br />
 544  ls  -l <br />
 545  sudo a2disconf cgi-enabled <br />
 546  systemctl restart apache2 <br />
 547  sudo a2enconf cgi-enabled <br />
 548  systemctl restart apache2<br />
<br />
<br />
</div>
		</div>
<br />
Das eine ist nämlich die Verfügbarkeit von CGI auf dem System, das andere ist die Möglichkeit, um CGI auch auf dem Webserver ausführen zu können. Das sind zwei verschiedene Dinge.<br />
<br />
In der Datei <span style="font-weight: bold;" class="mycode_b">cgi-enabled.conf</span> habe ich neben <span style="font-weight: bold;" class="mycode_b">cgi</span> und <span style="font-weight: bold;" class="mycode_b">pl</span> nun auch <span style="font-weight: bold;" class="mycode_b">py</span> eingetragen, um auch Pythonscripte im Browser möglich zu machen. Das funktioniert auch:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=48" target="_blank" title="">Pasted image 20210722183547.png</a> (Größe: 27,82 KB / Downloads: 83)
<!-- end: postbit_attachments_attachment --><br />
<br />
Damit CGI überhaupt machbar ist, ist dieser Ablauf wohl wichtig:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=49" target="_blank" title="">Pasted image 20210722183708.png</a> (Größe: 80,96 KB / Downloads: 71)
<!-- end: postbit_attachments_attachment --><br />
<br />
Warum und wieso das alles <span style="font-weight: bold;" class="mycode_b">root-Rechten</span> geschehen muss, habe ich noch nicht verstanden.<br />
<br />
Die Sache mit dem Webserver kann dann aus dem folgenden Screener abgelesen werden:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=50" target="_blank" title="">Pasted image 20210722183832.png</a> (Größe: 142,19 KB / Downloads: 73)
<!-- end: postbit_attachments_attachment --><br />
<br />
So hat es auf dem Desktop-Rechner und auf dem Linux-Notebook funktioniert. Zumindest in Sachen CGI und Perl.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">CGI auf Webserver ausführbar machen</span><br />
<br />
Heute, am 22.07.2021, habe ich es endlich geschafft, im Browser ein cgi-Script aufzurufen.<br />
<br />
Geholfen hat mir diese Webseite:<br />
<br />
<a href="https://www.server-world.info/en/note?os=Debian_10" target="_blank" rel="noopener" class="mycode_url">https://www.server-world.info/en/note?os=Debian_10</a>&p=httpd&f=2<br />
<br />
Ich bin mir nicht sicher, ob ich alles richtig verstanden habe. Eigentlich kenne ich das so, dass es auf dem Webserver (/var/www/html) einen Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-bin</span> gibt.<br />
<br />
Die Webseite arbeitet aber mit dem Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-enabled</span>.<br />
<br />
Alle meine Versuche hier auf dem Desktop-Rechner als auch auf dem Notebook haben ergeben, dass ich diesen Ordner /cgi-enabled nutzen muss. Der Ordner /cgi-bin funktioniert nicht.<br />
<br />
Auch kann ich nicht meinen normalen User zur Anlage von Ordner und z.B. index.cgi nutzen. Die Ordner als auch die Dateien werden mit dem <span style="font-weight: bold;" class="mycode_b">root</span> erstellt und dann über chmod 705 entsprechen berechtigt.<br />
<br />
Nur das funktioniert.<br />
<br />
Wenn ich den Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-bin</span> so in die Abläufe einbaue, wird später im Browser gezeigt, dass die URL nicht vorhanden ist.<br />
<br />
Mit dem Ordner <span style="font-weight: bold;" class="mycode_b">/cgi-enabled</span> wird die Testseite angezeigt:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=47" target="_blank" title="">Pasted image 20210722181624.png</a> (Größe: 15,79 KB / Downloads: 89)
<!-- end: postbit_attachments_attachment --><br />
<br />
Ich werde noch weitersuchen und mal prüfen, ob ich das anders hätte hinbekommen können.<br />
<br />
---<br />
<br />
Das ist die Historie der BASH, aus der ich die wichtigen Befehlszeilen herausfiltern werde, um eine Dokumentation zu schreiben:<br />
<br />
<div class="spoiler">
			<div class="spoiler_title"><span class="spoiler_button" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span></div>
			<div class="spoiler_content" style="display: none;"><span class="spoiler_content_title">Spoiler</span><br />
<br />
<br />
>  480  cat > /usr/lib/cgi-bin/test_script <<'EOF' <br />
 481  #!/usr/bin/perl <br />
 482  print "Content-type: text/html\n\n"; <br />
 483  print "Hello CGI\n"; <br />
 484  EOF <br />
 485  ls -l <br />
 486  chmod 705 /usr/lib/cgi-bin/test_script <br />
 487  curl <a href="http://localhost/cgi-bin/test_script" target="_blank" rel="noopener" class="mycode_url">http://localhost/cgi-bin/test_script</a> <br />
 488  a2enmod cgid <br />
 489  sudo a2enmod cgid <br />
 490  systemctl restart apache2 <br />
 491  curl <a href="http://localhost/cgi-bin/test_script" target="_blank" rel="noopener" class="mycode_url">http://localhost/cgi-bin/test_script</a> <br />
 492  nano vi /etc/apache2/conf-available/cgi-enabled.conf <br />
 493  nano /etc/apache2/conf-available/cgi-enabled.conf <br />
 494  sudo a2enconf cgi-bin <br />
 495  sudo a2enconf cgi-enabled <br />
 496  systemctl restart apache2 <br />
 497  exit <br />
 498  cd .. <br />
 499  mkdir /media/django/webserver/cgi-enabled <br />
 500  a2enconf cgi-enabled <br />
 501  sudo a2enconf cgi-enabled <br />
 502  sudo a2disconf cgi-enabled <br />
 503  systemctl restart apache2 <br />
 504  sudo a2enconf cgi-enabled <br />
 505  systemctl restart apache2 <br />
 506  nano /media/django/webserver/cgi-enabled/index.cgi <br />
 507  chmod 705 /media/django/webserver/cgi-enabled/index.cgi <br />
 508  ls -l <br />
 509  cd cgi-enabled/ <br />
 510  ls -l <br />
 511  sudo a2disconf cgi-enabled <br />
 512  systemctl restart apache2 <br />
 513  cd .. <br />
 514  mkdir cgi-bin <br />
 515  sudo a2enconf cgi-bin <br />
 516  systemctl restart apache2 <br />
 517  cd cgi-bin/ <br />
 518  nano index.cgi <br />
 519  ls -l <br />
 520  chmod 705 index.cgi <br />
 521  ls -l <br />
 522  sudo a2enconf cgi-bin <br />
 523  systemctl restart apache2 <br />
 524  sudo a2disconf cgi-bin <br />
 525  systemctl restart apache2 <br />
 526  sudo a2enconf cgi-bin <br />
 527  systemctl restart apache2 <br />
 528  sudo a2disconf cgi-bin <br />
 529  systemctl restart apache2 <br />
 530  cd .. <br />
 531  ls -l <br />
 532  mkdir cgi-enabled <br />
 533  ls -l <br />
 534  sudo a2enconf cgi-enabled <br />
 535  systemctl restart apache2 <br />
 536  cd cgi-enabled/ <br />
 537  nano index.cgi <br />
 538  chmod 705 index.cgi <br />
 539  ls -l <br />
 540  cp index.cgi index.pl <br />
 541  nano index.pl <br />
 542  cp index.pl index.py <br />
 543  nano index.py <br />
 544  ls  -l <br />
 545  sudo a2disconf cgi-enabled <br />
 546  systemctl restart apache2 <br />
 547  sudo a2enconf cgi-enabled <br />
 548  systemctl restart apache2<br />
<br />
<br />
</div>
		</div>
<br />
Das eine ist nämlich die Verfügbarkeit von CGI auf dem System, das andere ist die Möglichkeit, um CGI auch auf dem Webserver ausführen zu können. Das sind zwei verschiedene Dinge.<br />
<br />
In der Datei <span style="font-weight: bold;" class="mycode_b">cgi-enabled.conf</span> habe ich neben <span style="font-weight: bold;" class="mycode_b">cgi</span> und <span style="font-weight: bold;" class="mycode_b">pl</span> nun auch <span style="font-weight: bold;" class="mycode_b">py</span> eingetragen, um auch Pythonscripte im Browser möglich zu machen. Das funktioniert auch:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=48" target="_blank" title="">Pasted image 20210722183547.png</a> (Größe: 27,82 KB / Downloads: 83)
<!-- end: postbit_attachments_attachment --><br />
<br />
Damit CGI überhaupt machbar ist, ist dieser Ablauf wohl wichtig:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=49" target="_blank" title="">Pasted image 20210722183708.png</a> (Größe: 80,96 KB / Downloads: 71)
<!-- end: postbit_attachments_attachment --><br />
<br />
Warum und wieso das alles <span style="font-weight: bold;" class="mycode_b">root-Rechten</span> geschehen muss, habe ich noch nicht verstanden.<br />
<br />
Die Sache mit dem Webserver kann dann aus dem folgenden Screener abgelesen werden:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=50" target="_blank" title="">Pasted image 20210722183832.png</a> (Größe: 142,19 KB / Downloads: 73)
<!-- end: postbit_attachments_attachment --><br />
<br />
So hat es auf dem Desktop-Rechner und auf dem Linux-Notebook funktioniert. Zumindest in Sachen CGI und Perl.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Module installieren mit CPAN]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=404</link>
			<pubDate>Sun, 07 Jan 2024 17:18:42 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=404</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Module für Perl installieren mit cpan</span><br />
<br />
Die einfachste Art und Weise zusätzliche Module für Perl zu installieren ist mittels <span style="font-weight: bold;" class="mycode_b">cpan</span> möglich.<br />
<br />
Das Paket <span style="font-weight: bold;" class="mycode_b">cpanminus</span> ist mit root-Rechten zu installieren.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt-get install cpanminus</code></div></div><br />
Bevor man nun Module für Perl installieren kann, ist auf der Konsole, ich habe es mit root-Rechten gemacht, folgendes abzusetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cpan App::cpanminus</code></div></div><br />
Danach kann dann ein Modul, dessen Name man natürlich wissen muss, installieren. In meinem Falle war es das Modul **File::Random**:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cpanm File::Random</code></div></div><br />
Danach steht das Modul zur Verfügung. In einem Perlscript ist das Modul wie folgt zu verwenden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>use File::Random qw/:all/;</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">cpanminus</span> habe ich deswegen installiert, weil es auf dem normalen Wege nicht möglich war, Module zu installieren, da eben Abhängigkeit innerhalb der Module zu geben scheint.<br />
<br />
Mit<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make -f Makefile.PL</code></div></div><br />
bzw. <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make -f Makefile.PL</code></div></div><br />
bekam ich Fehlermeldungen beim Ausführen von:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make test</code></div></div><br />
Die Ausgabe dazu war:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root@asus:/home/django/perl/neue_module/File-Random-0.21# make test <br />
PERL_DL_NONLAZY=1 "/usr/bin/perl" "-Iblib/lib" "-Iblib/arch" test.pl  <br />
1..284  <br />
Can't locate Want.pm in @INC (you may need to install the Want module) (@INC contains: blib/lib blib/arc  <br />
h /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/x86_64-lin  <br />
ux-gnu/perl5/5.28 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.28 /usr/share/perl/5.28 /usr/local/l  <br />
ib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at blib/lib/File/Random.pm line 9.  <br />
BEGIN failed--compilation aborted at blib/lib/File/Random.pm line 9.  <br />
Compilation failed in require at test.pl line 10.  <br />
BEGIN failed--compilation aborted at test.pl line 10.  <br />
# Looks like your test exited with 2 before it could output anything.  <br />
make: *** [Makefile:842: test_dynamic] Fehler 2  <br />
root@asus:/home/django/perl/neue_module/File-Random-0.21# make manifest  <br />
"/usr/bin/perl" "-MExtUtils::Manifest=mkmanifest" -e mkmanifest</code></div></div></blockquote>
<br />
Die erste Meldung:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&gt; Can't locate Want.pm in @INC ...</code></div></div></blockquote>
<br />
Betrifft ein weitere Modul, welches noch nicht installiert war. Also musste erst das installiert werden, was aber wieder Fehlermeldungen nach sich zog. Daher war die Installation von **cpanminus** eine gute Entscheidung.<br />
<br />
---<br />
<br />
Bevor ich zur obigen Lösung kam, hatte ich noch folgendes Paket installiert:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt-get install libmodule-install-perl</code></div></div><br />
Ob dieses Paket notwendig ist, oder bei der Installation von cpanminus mitinstalliert worden wäre, kann ich derzeit nicht sagen.<br />
<br />
---]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Module für Perl installieren mit cpan</span><br />
<br />
Die einfachste Art und Weise zusätzliche Module für Perl zu installieren ist mittels <span style="font-weight: bold;" class="mycode_b">cpan</span> möglich.<br />
<br />
Das Paket <span style="font-weight: bold;" class="mycode_b">cpanminus</span> ist mit root-Rechten zu installieren.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt-get install cpanminus</code></div></div><br />
Bevor man nun Module für Perl installieren kann, ist auf der Konsole, ich habe es mit root-Rechten gemacht, folgendes abzusetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cpan App::cpanminus</code></div></div><br />
Danach kann dann ein Modul, dessen Name man natürlich wissen muss, installieren. In meinem Falle war es das Modul **File::Random**:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cpanm File::Random</code></div></div><br />
Danach steht das Modul zur Verfügung. In einem Perlscript ist das Modul wie folgt zu verwenden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>use File::Random qw/:all/;</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">cpanminus</span> habe ich deswegen installiert, weil es auf dem normalen Wege nicht möglich war, Module zu installieren, da eben Abhängigkeit innerhalb der Module zu geben scheint.<br />
<br />
Mit<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make -f Makefile.PL</code></div></div><br />
bzw. <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make -f Makefile.PL</code></div></div><br />
bekam ich Fehlermeldungen beim Ausführen von:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>make test</code></div></div><br />
Die Ausgabe dazu war:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root@asus:/home/django/perl/neue_module/File-Random-0.21# make test <br />
PERL_DL_NONLAZY=1 "/usr/bin/perl" "-Iblib/lib" "-Iblib/arch" test.pl  <br />
1..284  <br />
Can't locate Want.pm in @INC (you may need to install the Want module) (@INC contains: blib/lib blib/arc  <br />
h /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/x86_64-lin  <br />
ux-gnu/perl5/5.28 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.28 /usr/share/perl/5.28 /usr/local/l  <br />
ib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at blib/lib/File/Random.pm line 9.  <br />
BEGIN failed--compilation aborted at blib/lib/File/Random.pm line 9.  <br />
Compilation failed in require at test.pl line 10.  <br />
BEGIN failed--compilation aborted at test.pl line 10.  <br />
# Looks like your test exited with 2 before it could output anything.  <br />
make: *** [Makefile:842: test_dynamic] Fehler 2  <br />
root@asus:/home/django/perl/neue_module/File-Random-0.21# make manifest  <br />
"/usr/bin/perl" "-MExtUtils::Manifest=mkmanifest" -e mkmanifest</code></div></div></blockquote>
<br />
Die erste Meldung:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&gt; Can't locate Want.pm in @INC ...</code></div></div></blockquote>
<br />
Betrifft ein weitere Modul, welches noch nicht installiert war. Also musste erst das installiert werden, was aber wieder Fehlermeldungen nach sich zog. Daher war die Installation von **cpanminus** eine gute Entscheidung.<br />
<br />
---<br />
<br />
Bevor ich zur obigen Lösung kam, hatte ich noch folgendes Paket installiert:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt-get install libmodule-install-perl</code></div></div><br />
Ob dieses Paket notwendig ist, oder bei der Installation von cpanminus mitinstalliert worden wäre, kann ich derzeit nicht sagen.<br />
<br />
---]]></content:encoded>
		</item>
	</channel>
</rss>