Hallo, Gast
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.

Benutzername
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 462
» Foren-Beiträge: 639

Komplettstatistiken

Benutzer Online
Momentan sind 12 Benutzer online
» 0 Mitglieder
» 8 Gäste
AhrefsBot, DotBot, Semrush, bot

Aktive Themen
Thursday - 02:00 CST: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Vor 5 Stunden
» Antworten: 0
» Ansichten: 1
Wednesday - 17:00 CST: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Heute, 03:24
» Antworten: 0
» Ansichten: 5
Stichsäge zur Bandsäge um...
Forum: Antiheimwerker
Letzter Beitrag: Joopi
Heute, 12:17
» Antworten: 0
» Ansichten: 5
Wednesday - 13:00 CST: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 11:32
» Antworten: 0
» Ansichten: 2
Ein-Zapfen-Eckverbindung
Forum: Antiheimwerker
Letzter Beitrag: Joopi
Gestern, 09:25
» Antworten: 0
» Ansichten: 2
Wednesday - 11:00 CST: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 09:24
» Antworten: 0
» Ansichten: 4
Wednesday - 07:00 CST: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 04:50
» Antworten: 0
» Ansichten: 6
Wednesday - 01:00 CST: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 11:11
» Antworten: 0
» Ansichten: 8
Tuesday - 18:00 CST: Not ...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 04:33
» Antworten: 0
» Ansichten: 7
Tuesday - 11:00 CST: Not ...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
19-11-2024, 08:39
» Antworten: 0
» Ansichten: 5

 
  Array ausgeben
Geschrieben von: Joopi - 07-01-2023, 10:31 - Forum: Programmieren - Keine Antworten

Wer sich mit der Programmierung beschäftigt, kommt über kurz oder lang mit dem Datentyp ARRAY in Berührung. Egal in welcher Programmiersprache man unterwegs ist, das Array ist ein sehr wichtiges Instrument. Und ich tue mich damit von Anbeginn an schwer - also seit Jahrzehnten.

Ich habe immer Arrays genutzt, aber nie wirklich verstanden und einfach nur aus Vorlagen abgeschrieben. Oftmals musste ich lange daran herumfummeln, um die Syntax für mich gängig zu machen und ein brauchbares sowie richtiges Ergebnis zu erzielen.

Nun habe ich in PHP ein bisschen probiert. Dieses Ausprobieren hat nicht im Browser stattgefunden, sondern ich habe kleine PHP-Scripte geschrieben und diese auf der Konsole ausführen lassen. Somit musste ich mich nicht mit der Ausgabe via PHP-/HTML-Auszeichnungen befassen, sondern konnte mich auf die reine Syntax und die selbstgestellte Aufgabe konzentrieren.

Als erstes ist es wichtig zu wissen, in welcher Schreibweise ein bereits gefülltes Array im Programmcode zu nutzen ist. Es gibt verschiedene Möglichkeiten, um ein Array zu deklarieren und mit Werten zu füllen bzw. hart programmiert zu füllen.

Da ich die Werte im Array später weiter nutzen möchte, habe ich das Array in eine Variable übernommen:

PHP-Code:
<?php
    $vornamen 
= array("Hans""Dieter""Horst");
?>

Auf dieses Array kann ich dann zugreifen, indem ich die Variable sowie ein Element aus dem Array in der Konsole ausgeben lasse:

PHP-Code:
<?php
    
echo "Das ist der Vorname im ersten Element des Arrays: " $vornamen[0] . "\n";
?>

Das ist die Ausgabe in der Konsole dazu:

Zitat:Das ist der Vorname im ersten Element des Arrays: Hans

Möchte ich alle Elemente eines Arrays verarbeiten, z.B. in der Konsole ausgeben lassen, dann komme ich nicht um eine Schleife umhin. Mit einer foreach-Schleife ist die Ausgabe in der Konsole (oder später auch in einer Datei oder Datenbank) machbar:

PHP-Code:
<?php
    
foreach($vornamen as $vorname) {
        echo $vorname ."\n";
    }
?>

Das ist die Ausgabe in der Konsole dazu:

Zitat:Hans
Dieter
Horst

Für meine Vorhaben brauche ich später die Anzahl der im Array enthaltenen Elemente. Es gibt viele Lösungsansätze. Aber der wohl einfachste geht über die count-Funktion, ohne das weitere Zählschleifen oder ähnliches programmiert werden müssen.

PHP-Code:
<?php
    
echo "Das ist die Anzahl der Elemente im Array der Vornamen: " count($vornamen) . "\n";
?>

Das ist die Ausgabe in der Konsole dazu:

Zitat:Das ist die Anzahl der Elemente im Array der Vornamen: 3

Für mich ist es sehr verwunderlich, dass ich das Prinzip des Array zwar immer verstanden habe, aber nie wirklich anwenden konnte. Wenn ich mir die obigen Programmzeilen ansehe, dann muss ich mir an den Kopf fassen. Es ist eigentlich in den Grundfunktion sehr einfach.

Die von mir angedachten Programmteile zur Nutzung von Arrays haben künftig damit zu tun, dass ich eine unbekannte Anzahl Dateien in einem Verzeichnis verarbeiten und spezielle Inhalte aus den Dateien in eine Datenbanktabelle einfügen möchte. Hier ist ein Array auf jeden Fall von Nöten. Und das natürlich kombiniert mit Schleifen. Im Gegensatz zum obigen Beispiel muss ich dann während der Programmlaufzeit das Array füllen. Auch das habe ich getestet. Dazu schreibe ich noch einen anderen Artikel. Denn das ist aufwendiger und spezieller. Hier wollte ich nur die Grundfunktion beschrieben wissen.

Ein assoziatives Array hat einen Schlüssel (Key) und einen Wert (Value). Wenn ein solches Array durchlaufen wird, wird normalerweise der Wert ausgegeben. Das könnte wie folge aussehen.

PHP-Code:
<?php
    
foreach ($imap as $detail) {
        echo $detail "\n";
    }
?>

Die Ausgabe.

Zitat:Sun, 9 Jan 2022 17:11:08 +0100 (CET)
imap
{domain.zzz:993/imap/notls/ssl/novalidate-cert/user="xxx@yyy.zzz"}INBOX
9
0

Bei dieser Art der Ausgabe weiß man aber nicht immer direkt, was mit dem Wert gemeint ist. Also macht es Sinn, den Schlüssel mitzugeben, denn dieser ist für gewöhnlich lesbar und zeigt, um was es sich bei dem Wert handelt. Das sieht dann so aus.

PHP-Code:
<?php
    
foreach ($imap as $detailkey => $detailwert) {
        echo $detailkey .": " $detailwert "\n";
    }
?>

Die Ausgabe.

Zitat:Date: Sun, 9 Jan 2022 17:17:44 +0100 (CET)
Driver: imap
Mailbox: {domain.zzz:993/imap/notls/ssl/novalidate-cert/user="xxx@yyy.zzz"}INBOX
Nmsgs: 9
Recent: 0

Nun ist ziemlich klar, dass es sich hier um Informationen zu einem IMAP-Konto handelt. Jeder fachkundige Dritte kann also mit dem Ergebnis etwas anfangen bzw. dieses interpretieren.

Oh, Schleifen!

Tja, wann wende ich *While*- und wann wende ich *For*-Schleifen an? Noch so eine Sache, die ich nie wirklich verstanden habe.

Drucke diesen Beitrag

  MySQLDump - nur neue Daten abfragen
Geschrieben von: Joopi - 07-01-2023, 10:21 - Forum: Programmieren - Keine Antworten

Ich stand vor dem Problem, dass ich eine relativ große Datenbank habe und diese vom lokalen Rechner regelmäßig auf einen externen Webspace transportiert und dort in die Datenbank eingespielt werden muss.

Realisiert habe ich bislang dieses Aufgabe mit mysqldump. Das bedeutet aber, wenn man keine Optionen mitgibt, dass mit der Dumpdatei zunächst alle Tabellen gelöscht werden (drop table), um sie anschließend wieder zu erstellen (create table). Danach werden alle Daten in die Tabelle bzw. Tabellen eingefügt (insert).

Und irgendwann kommt man an einem Punkt, an dem die Datei, auch wenn sie gezippt ist, sehr groß wird und der Import mehr als 30 Minuten dauert.

Also musste eine Lösung her, dass aus der Quelldatenbank des lokalen Rechners nur die ab einem bestimmt Zeitpunkt neu hinzugekommenen Datensätze abfragt werden sowie das Löschen und Erstellen der betroffenen Tabelle unterlassen wird. Es dürfen einfach nur die neuen Datensätze ab Zeitpunkt **X** in die bestehenden Tabellen eingefügt werden.

Und es gibt eine Lösung dazu. Ich habe mich dazu entschieden, diese Lösung mittels Erfassungsdatum, dass in allen Tabellen ein Standardfeld ist, zu versuchen.

Nach einigen Versuchen hatte ich dann die richtige Syntax gefunden, die wie folgt aussieht:

Code:
mysqldump --no-create-info --user=user --password="password" datenbank tabelle --where="erfasst>='2022-02-11 19:19:48'" > test.sql

Mit der Option --no-create-info wird sowohl das Löschen als auch das Erstellen von Tabellen verhindert. Ansonsten ist der Befehl zum normalen Befehl von mysqldump nur noch dahingehend abweichend, dass hinter dem Tabellennamen angegeben werden muss, welches Feld und welcher Wert abgefragt werden sollen - --where="erfasst>='2022-02-11 19:19:48'".

Dieser Befehl funktioniert auch mit mehreren Tabellen, die natürlich alle das entsprechend Feld erfasst haben müssen.

Code:
mysqldump --no-create-info --user=user --password="password" datenbank tabelle1 tabelle2 tabelle3  --where="erfasst>='2022-02-11 19:19:48'" > test.sql

Und nun geht das Updaten der Datenbank auf dem externen Webspace in Sekundenschnelle. Über diese Lösung habe ich mich riesig gefreut, denn sie bietet mir für andere Sachverhalte viel mehr Spielraum.

Drucke diesen Beitrag

  Zeichen ersetzen
Geschrieben von: Joopi - 07-01-2023, 10:15 - Forum: Programmieren - Keine Antworten

In MySQL ist es möglich, in den einzelnen Feldern Zeichen zu suchen und zu ersetzen. Das kann sich auf ganze Worte, Wortteile oder einzelne Buchstaben beziehen.

Im nachfolgenden Beispiel wird in der Tabelle autos im Feld baujahr das Wort alt durch das Wort neu ersetzt.

Ändern von Zeichen innerhalb der Datensätze in einer MySQL-Tabelle.

Code:
UPDATE autos SET baujahr = replace(baujahr, 'alt', 'neu');

Drucke diesen Beitrag

  Volltextsuche
Geschrieben von: Joopi - 07-01-2023, 10:13 - Forum: Programmieren - Keine Antworten

Es ist schonmal notwendig, innerhalb einer Tabelle nach Text zu suchen. Dieses ist mit ganz einfachen Mitteln möglich. Ein SQL-Statement könnte wie folgt aussehen:

Code:
SELECT mailtext FROM tabelle WHERE mailtext LIKE "%Herzliche Grüße%";

Damit habe ich ein Tabellenfeld durchforstet und mir damit sehr viel manuelles Arbeiten erspart, um zu wissen, in welchen Datensätze die obige Floskel enthalten ist.

Wichtig dabei sind die Prozentzeichen, die den Suchtext eingrenzen. Nur dieses wird dann entsprechend der Vorgaben des Statements gesucht. Hierbei scheint es keine Rolle zu spielen, ob Groß- oder Kleinschreibung vorhanden ist.

In einem HTML-Formular könnte so eine Volltextsuche ausgestaltet werden. Prima Sache!

Drucke diesen Beitrag

  unique key hinzufügen
Geschrieben von: Joopi - 07-01-2023, 10:12 - Forum: Programmieren - Keine Antworten

Um Doppelerfassung zu vermeiden, bietet es sich an, dass entsprechende Feld auf unique zu setzen. Wird es bei der Erstellung der Tabelle noch nicht erledigt, so kann das nachträglich wie folgt gemacht werden:

Code:
ALTER TABLE tabelle ADD UNIQUE ("id");

Drucke diesen Beitrag

  Tabelle kopieren
Geschrieben von: Joopi - 07-01-2023, 10:08 - Forum: Programmieren - Keine Antworten

Mit nachstehenden MySQL-Befehlen lässt sich eine Tabelle recht einfach in eine andere Datenbank kopieren. In diesem Beispiel werden die Daten von db1 in db2 kopiert.

Zunächst muss die neue Tabelle (mit gleicher Struktur) erstellt werden:

Code:
CREATE TABLE db2.newTable LIKE db1.oldTable;

Danach können die Daten in die neue Tabelle kopiert werden:

Code:
ALTER TABLE db2.newTable DISABLE KEYS;

Code:
INSERT INTO db2.newTable SELECT * FROM db1.oldTable;

Code:
ALTER TABLE db2.newTable ENABLE KEYS;

Drucke diesen Beitrag

  Tabelle create
Geschrieben von: Joopi - 07-01-2023, 10:07 - Forum: Programmieren - Keine Antworten

Sofern ich Tabellen auf der Konsole anlege, benutze ich folgenden Befehl:

Code:
CREATE TABLE tabelle (
id integer NOT NULL auto_increment,
text varchar(30) NOT NULL,
beschreibung text NOT NULL,
erfasst datetime NOT NULL,
geaendert timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
primary key(id)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Diese Darstellung ist nur exemplarisch. Wichtig sind für mich die beiden Felder mit Datumsangaben.

Drucke diesen Beitrag

Information Select verstehen und richtig anwenden
Geschrieben von: Joopi - 07-01-2023, 10:05 - Forum: Programmieren - Keine Antworten

Man lernt in der Tat nie aus und immer wieder was neues. Aus allen Lehrbüchern, die ich zu MySQL und/oder PHP gelesen habe, wurde noch nie vermittelt, dass der Befehlsteil SELECT * FROM so in der Form nie verwendet werden soll. Mit dieser Anweisung werden alle Spalten einer Tabelle in die Abfrage aufgenommen, egal, ob sie dann auch genutzt werden oder nicht.

Da selbst die Doku von MySQL diese Schreibweise nutzt, später aber aussagt, dass man es nie in echten Programmen tun soll, haben wohl viele Autoren diese Vereinfachung übernommen. Man soll tatsächlich explizit alle in der Abfrage notwendigen Spalten angeben. Warum das so sein soll, habe ich nach dem Lesen des folgenden Artikels verstanden:

Warum soll ich nicht SELECT * schreiben?

Meine Programme sind zwar klein, und die Tabellenabfragen sind eher einfach, aber ich werde in Zukunft schon darauf achten, die tatsächlich zu nutzenden Spalten in die SELECT-Anweisung aufzunehmen.

Drucke diesen Beitrag

  Letzten Datensatz ermitteln
Geschrieben von: Joopi - 07-01-2023, 10:03 - Forum: Programmieren - Keine Antworten

Dann und wann ist es notwendig, den letzten Datensatz einer Tabelle zu ermitteln. Meist ist es die ID aus einem Autowert-Feld.

Die einfachste Methode ist eine SELECT-Abfrage mit LIMIT 1 und einer Sortierung mit DESC (aufwärts).

Code:
SELECT id FROM tabelle ORDER BY id DESC LIMIT 1;

Diese Methode funktioniert natürlich in allen Scripten entsprechend, die eine Verbindung zu einer MySQL-Datenbank aufbauen können. Im vorliegenden Beispiel benötigte ich den letzten Datensatz eben in einem Shellscript.



Code:
lastid=($(mysql -u $user -h $server --password="$pw" $db -e "SELECT id FROM $tabelle1 ORDER BY id DESC LIMIT 1";))

Drucke diesen Beitrag

  Installation und Rootpasswort
Geschrieben von: Joopi - 07-01-2023, 09:57 - Forum: Programmieren - Keine Antworten

Irgendwie komme ich bei Neuinstallationen immer wieder in Konflikt mit dem Rootpasswort für MariaDB oder MySQL.

Heute, am 01.01.2022, hatte ich versucht, in einer virtuellen Maschine (VirtualBox) einen MariaDB-Server aufzusetzen. Das hat nicht funktioniert. Das Setzen des Rootpassworts wollte nicht gelingen. Dabei fiel mir erst später auf, dass MariaDB gar nicht gestartet worden war. Es gelang mir auch nicht, MariaDB zum Laufen zu bekommen.

Kurzerhand entschied ich mich das gute alte MySQL zu installieren. Das ging sehr gut.

Folgende Befehle setzte ich ab:

Code:
sudo apt-get install mysql-server mysql-client

Code:
sudo mysql_secure_installation

Bei diesem Befehl hatte MariaDB eine Fehlermeldung ausgegeben. MySQL lief schön durch und ich konnte das Rootpasswort setzen. Doch eine Anmeldung in der Konsole wollte nur gelingen, wenn ich die Anmeldung als Sudo-User vornahm. Das hatte auch den Nachteil, dass ich mich über Adminer im Browser nicht anmelden konnte.

Der Workaround hierzu ist sehr gut auf der folgenden Webseite beschrieben:

can't login as mysql user root from normal user account in ubuntu 16.04

In der Kurzform für mich sind folgende Befehl abzuarbeiten, um dem MySQL-User root wieder normal funktionsfähig zu machen.

Der Sudo-User loggt sich in die MySQL-Konsole ein:

Code:
sudo mysql -u root -h localhost -p

Sodann überprüft er, wie der MySQL-User root in der entsprechenden Tabelle der Datenbank mysql steht:

Code:
SELECT User,Host FROM mysql.user;

Der User root ist dann zu löschen:

Code:
DROP USER 'root'@'localhost';

Der User root ist dann neu anzulegen:

Code:
CREATE USER 'root'@'localhost' IDENTIFIED BY 'passwort';

Die komplette Latte an Rechten ist dem User root zu vergeben:

Code:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

Und dann sind die neuen Berechtigungen sofort auszurollen:

Code:
FLUSH PRIVILEGES;

Danach konnte ich mich auf der Konsole als normaler User und Passwort nach MySQL einloggen und in Adminer konnte ich mich auch einloggen mit dem User root und dem neuen Passwort.

Adminer kann nur genutzt werden, wenn der User root ein Passwort hat. Das nur am Rande erwähnt.

Drucke diesen Beitrag