Hallo, Gast |
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.
|
Foren-Statistiken |
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 382
» Foren-Beiträge: 509
Komplettstatistiken
|
Benutzer Online |
Momentan sind 6 Benutzer online » 0 Mitglieder » 3 Gäste DotBot, Semrush, bot
|
|
|
Shellscript aufrufen |
Geschrieben von: Joopi - 07-01-2023, 11:13 - Forum: Programmieren
- Keine Antworten
|
|
Innerhalb eines PHP-Codes kann ein ausführbares Shellscript ausgeführt werden. Das geht mit shell_exec.
PHP-Code: <?php $user = shell_exec("id"); echo "$user"; $berechtigung = shell_exec("ls -l mache_irgendwas.script"); //funktioniert nur so (ohne ls -l): $berechtigung = shell_exec("mache_irgendwas.script"); echo "$berechtigung"; ?>
In einem Shellscript habe ich Funktionen eingebaut, die Bilder renamen und resizen. Zwar bestehen diese Möglichkeiten auch innerhalb von PHP, aber ich benötige das Shellscript auch zu anderen Gelegenheiten. Daher wollte ich das Rad nicht neu erfinden.
Es mag sein, dass der geneigte PHP-Coder kurz vor einem Herzklabaster steht. Ich nutze das aber ausschließlich auf dem lokalen Rechner. Mir genügt es so und ich bin froh zu wissen, dass man überhaupt Shellscripte im PHP-Code integrieren kann.
|
|
|
Primäre Angaben zu Pfad und Datei |
Geschrieben von: Joopi - 07-01-2023, 11:12 - Forum: Programmieren
- Keine Antworten
|
|
Um Informationen zu einem Pfad und/oder einer Datei zu erhalten, wird in PHP die Funktion PATHINFO benutzt. In meinen Lernbeispielen habe ich bislang zwei verschiedene Arten der Anwendung gefunden. Die eine erzeugt ein Array, die andere nutzt eine Variable, die einen String auf nimmt und dann ein Array daraus macht. Oder so ähnlich. Besser kann ich es nicht erklären.
Das erste Beispiel erzeugt ein Array mit 4 Elementen:
PHP-Code: <?php $dateiteile = pathinfo("/media/work_bilder_decode/zz_temp/105b34dd5.jpg");
echo "Das ist der erste Teil der Ausgabe:\n\n";
echo "Pfad ohne Datei: " . $dateiteile['dirname'], "\n"; echo "Dateiname komplett: " . $dateiteile['basename'], "\n"; echo "Extension: " . $dateiteile['extension'], "\n"; echo "Dateiname ohne Extension: " . $dateiteile['filename'], "\n"; ?>
Die Ausgabe hier ist:
Zitat:Das ist der erste Teil der Ausgabe:
Pfad ohne Datei: /media/work_bilder_decode/zz_temp
Dateiname komplett: 105b34dd5.jpg
Extension: jpg
Dateiname ohne Extension: 105b34dd5
Das zweite Beispiel nimmt die Pfad-/Dateiangabe in eine String-Variable auf und wird erst später bei der Übernahme der 4 Bestandteile mit der **PATHINFO**-Funktion bestückt. Der Code sieht dann wie folgt aus:
PHP-Code: <?php $dateiteile2 = "/media/work_bilder_decode/zz_temp/105b34dd5.jpg";
$dir = pathinfo($dateiteile2, PATHINFO_DIRNAME); $base = pathinfo($dateiteile2, PATHINFO_BASENAME); $ext = pathinfo($dateiteile2, PATHINFO_EXTENSION); $datei = pathinfo($dateiteile2, PATHINFO_FILENAME);
echo "Das ist der zweite Teil der Ausgabe:\n\n";
echo "Pfad ohne Datei: " . $dir . "\n"; echo "Dateiname komplett: " . $base . "\n"; echo "Extension: " . $ext . "\n"; echo "Dateiname ohne Extension: " . $datei . "\n"; ?>
Die Ausgabe zu dieser Codierung sieht dann so aus (nicht anders als oben).
Zitat:Das ist der zweite Teil der Ausgabe:
Pfad ohne Datei: /media/work_bilder_decode/zz_temp
Dateiname komplett: 105b34dd5.jpg
Extension: jpg
Dateiname ohne Extension: 105b34dd5
Welche Art der Codierung später mal genutzt werden soll oder muss, hängt wohl davon ab, was man eigentlich erreichen möchte. Da beides zum gleichen Ergebnis führt, ist es vielleicht egal. Das wird sich später mal herausstellen müssen.
Im Moment bin ich froh, dass ich das endlich verstanden habe und nun auch anwenden kann. In Verbindung mit Dateilisten, die mittels Array bearbeitet werden, könnte diese neue Erkenntnis für meine Programmiervorhaben sehr von Vorteil sein.
Die einfache Anwendung von Arrays habe ich mitterweile auch einigermaßen gut verstanden.
|
|
|
mehrere Dateien löschen |
Geschrieben von: Joopi - 07-01-2023, 11:09 - Forum: Programmieren
- Keine Antworten
|
|
Das Löschen von Dateien in der Konsole kann relativ einfach mit rm erfolgen. Dieser Befehl steht für remove.
Will man mehrere Dateien löschen, die z.B. alle die Extension txt haben, so ist der Befehl rm *.txt anwendbar.
In einem PHP-Skript ist der Befehl unlink zum Löschen einer Datei aufzurufen. Allerdings kann man nicht, wie es in der Konsole möglich ist, einfach mehrere Dateien löschen, indem man so vorgeht wie beim Shellbefehl.
Um in einem Ordner mehrere Dateien zu löschen, die z.B. alle die Extension .md haben, ist folgende Codezeile im Skript notwendig:
PHP-Code: <?php array_map('unlink', glob( "/home/tuennes/*.md")); ?>
Damit werden alle Dateien in dem vorgegebenen Ordner gelöscht, die die Extension .md haben.
Zitat:glob — Findet Dateinamen, die mit einem Muster übereinstimmen
|
|
|
Formularfeld trimmen |
Geschrieben von: Joopi - 07-01-2023, 11:06 - Forum: Programmieren
- Keine Antworten
|
|
Dann und wann schleichen sich beim Eingeben von Werten gerne mal Leerzeichen am Beginn oder Ende ein. Besonders dann, wenn man diese Werte aus anderen Texten oder Webseiten kopiert und in die Zwischenablage eingügt. Die Leerzeichen werden dann mit in die Datenbank geschrieben und führen oftmals dazu, dass später diese Werte bei Suchabfragen nicht im Ergebnis auftauchen.
Hier hilft die Funktion trim.
PHP-Code: <?php trim($_REQUEST['n_ipdec_von']); ?>
PHP-Code: <?php $n_ipdec_von = trim($_REQUEST["n_ipdec_von"]); ?>
Analog zur Prüfung, ob ein Formularfeld überhaupt gefüllt ist, ist das Trimmen m.E. eine unverzichtbare Maßnahme, um eben keine falschen Werte in die Tabellen zu erfassen.
|
|
|
Error-Reporting |
Geschrieben von: Joopi - 07-01-2023, 11:03 - Forum: Programmieren
- Keine Antworten
|
|
Wenn man ein PHP-Skript erstellt, dann kommt es unweigerlich zu Problemen, weil der Programmcode nicht korrekt ist. Nach meinem Verständnis gibt es drei Kategorien von Meldungen, die PHP ausgibt:
- PHP Notice
- PHP Warning
- PHP Error
Während der Entwicklungsphase macht es Sinn, die Meldung ausgeben zu lassen, um schnell auf Fehler im Programmcode oder -logik reagieren zu können.
Aber auch während der Entwicklungsphase kann es sinnvoll sein, das Error-Reporting einzuschränken oder gar zu unterbinden. Das muss dann jeder Programmierer mit sich selber ausmachen.
Es gibt nun mehrere Möglichkeiten, die ich nutzen könnte. Will ich z.B. zu einer Codezeile verhindern, dass eine PHP-Meldung ausgegeben wird, so kann dies über das **@**-Zeichen gesteuert werden.
PHP-Code: <?php $parts = @$structure->parts; ?>
Mit dem @-Zeichen wird die Ausgabe einer möglichen Meldung verhindert, sollte z.B. in der Struktur gar kein Element *parts* enthalten und für den kompletten Programmablauf nicht hinderlich sein.
Um im gesamten Programm wirklich alle Fehlermeldungen zu unterbinden, sollte in der ersten Zeile des PHP-Skripts folgendes stehen:
PHP-Code: <?php error_reporting(0); ?>
Das ist natürlich nicht gut, denn sollte es Fehler geben, die sich wirklich, und vor allem negativ, auf den Programmablauf auswirken, ist man mit
PHP-Code: <?php error_reporting(E_ALL & ~E_NOTICE); ?>
besser bedient.
Wie gesagt, in der Entwicklung eines PHP-Skripts sind Meldungen wichtig für den Programmierer. Sobald das Tool fertig und produktiv gehen kann, sollten auf jeden Fall die Meldungen unterbunden werden. Was geht es dem gemeinen Internet-User an, welche Meldungen ein Skript aus welchen Gründen auch immer verursacht.
|
|
|
Eingebettetes Thumbnail extrahieren |
Geschrieben von: Joopi - 07-01-2023, 11:00 - Forum: Programmieren
- Keine Antworten
|
|
Durch meine Fotografie habe ich viel mit Fotos zu tun. Ich möchte gerne meine eigene Galerie programmieren und benötige dafür auch Informationen aus den EXIF-Daten der erzeugten Dateien. Nicht alle Dateien haben diese Daten, aber die, die ich mit meinen Fotokameras mache, haben sie.
In diesen Daten sind auch die Quelldaten für ein Thumbnail, also für eine Miniaturansicht, enthalten. Man kann sie auf verschiedene Art und Weise Thumbnails extrahieren, um diese auf der Webseite anzuzeigen, die dann wieder auf die echten Fotos verlinken. Das spart auf jeden Fall Ressourcen beim Laden der Webseite.
Wiederum gibt es zwei Möglichkeiten, um die eingebetteten Thumbnails zu extrahieren. Entweder man erzeugt sie zur Laufzeit und gibt sie direkt auf der Webseite aus oder man erzeugt diese Thumbnails physisch und bindet sie dann über den IMG-Tag ein.
Nachfolgend ist ein Script aufgeführt, welches ich heute mit Hilfe einiger Quellen, meist php.net, zusammengestellt habe. Für mein Vorhaben reicht das im Moment und kann durchaus durch andere genutzt werden, wenn die individuellen Parameter angepasst werden.
PHP-Code: <?php
$pfad = "/home/tuennes/help/help5/"; $bildbig = "jpg_big.jpg"; $thumbnail = "thumb_jpg_big.jpg";
// Das ist die Quelle mit dem normelen großen Bild, welches das Thumbnail beinhalten kann $picture = $pfad.$bildbig;
// Das ist das resultierende Thumbnail, sofern das normale Bild ein Thumbnail beinhaltet $output_file = $pfad.$thumbnail;
// Den Quellcode aus dem großen Foto für ein etwaig eingebettetes Thumbnail ausfindig machen $image = exif_thumbnail($picture, $width, $height, $type);
// Sofern ein Thumbnail enthalten ist, wird dieser genutzt und ein Bild erstellt. if ($image!==false) { header('Content-type: ' .image_type_to_mime_type($type));
// Die Datei wird zum Schreiben geöffnet $fp = fopen($output_file, "w+");
// write the data in image file // Wichtig ist, dass die Variable $image nur den Quellcode des Thumbnails beinhaltet. Dieser Quell wird über base64_encode zunächst in Base64 kodiert, // muss aber für die Erzeugung eines physischen Bildes dann wieder mittels base64_decode decodiert werden. fwrite($fp, base64_decode(base64_encode($image)));
// close an open file pointer fclose($fp);
// Ob das Bild erstellt wurde, wird sofort geprüft if (file_exists($output_file)) { echo "Die Datei wurde erstellt.\n"; } else { echo "Die Datei wurde nicht gefunden, daher wurde sie nicht estellt.\n"; } } // Enthielt das große Bild kein eingebettetes Thumbnail, wird eine entsprechende Meldung ausgegeben. else { // kein Miniaturbild vorhanden. Fehler wird hier verarbeitet echo "Kein Miniaturbild verfügbar\n"; }
?>
Für meine Ideen ist diese einfache Art und Weise der Thumbnailerstellung sehr gut geeigent. Meine eigenen Bilder sollten alle ein Thumbnail enthalten, da ich die EXIF-Daten auf keinen Fall lösche und für meine Galerie nutzen möchte.
Die andere Variante mit der Erstellung der Thumbnails zur Laufzeit habe ich noch nicht ausprobiert.
|
|
|
Eingabefeld prüfen |
Geschrieben von: Joopi - 07-01-2023, 10:58 - Forum: Programmieren
- Keine Antworten
|
|
Auf dem lokalen Rechner habe ich einige Webseiten mit PHP und MySQL erstellt. Über diese Seiten werden Daten mittels HTML-Formulare in Datenbanken bzw. Tabellen geschrieben. Da ich alleine mit diesen Formularen arbeite, ist eine absolute Sicherheit für eine vernünftige Erfassung nicht in meinem Fokus gewesen.
Allein meine Faulheit, leere Einträge in den Tabellen korrigieren zu müssen, haben mich veranlasst, die Formular sicherer zu machen. Nun werden die Inhalte der jeweilige Formularfelder geprüft. Wenn ein Feld leer ist, dann wird der Insert-Befehl nicht ausgeführt.
Die Prüfung sieht z.B. so aus:
PHP-Code: <?php if (empty($_REQUEST["n_mailaddi"])) {
echo "Das Feld ist leer. Bitte eine Mailadresse eingeben.";
echo "<a href=\"some_form_mailadressen.php\">"; echo "<button type=\"button\">Mail eingeben</button>"; echo "</a>"; } ?>
Nun wird es keine Tabelleneinträge mehr geben, die mit leeren Feldern für die Mailadresse aufwarten.
Ich habe jetzt natürlich dieses Prinzip auf alles meine Formulare angewendet. Eigentlich sollte es bei der Erstellung von Formularen ein Standard sein, aber ich hatte das nicht so im Fokus vor 10 Jahren.
Es noch andere, weil auch bessere Methode. Es wäre sinnvoll, ID-/Namenfelder einzufügen und darüber die Prüfung ablaufen zu lassen.
|
|
|
JSON-Datei auslesen |
Geschrieben von: Joopi - 07-01-2023, 10:54 - Forum: Programmieren
- Keine Antworten
|
|
Mit json-Dateien arbeite ich im Grunde genommen nie. Zumindest nicht im privaten Bereich. Im beruflichen Umfeld muss ich nun mit json-Datei, die als Konfigurationsdateien dienen, arbeiten.
Generell, so habe ich es verstanden, dienen json-Dateien zum Datenaustausche. Das bedeutet, dass man in der Lage sein muss, die Inhalte einer json-Datei auszulesen und zu verwerten.
Die einfachste Art, um eine json-Datei auszulesen, ist folgende:
PHP-Code: <?php $JsonParser = file_get_contents("test_json.json"); var_dump($JsonParser); ?>
Hierbei wird der komplette Inhalt der Datei ausgegeben. Man kann die Daten aber so nicht direkt verarbeiten. Es muss also anders angegangen werden.
Das Zauberwort ist mal wieder array verbunden mit json_decode.
PHP-Code: <?php $Json = file_get_contents("test_json.json"); // Converts to an array $myarray = json_decode($Json, true); var_dump($myarray); // prints array ?>
Da eine json-Datei sturkturiert aufgebaut ist, ist es auch wohl relativ simpel diese Struktur in ein Array zu übernehmen. Die Verarbeitung von Arrays finde ich immer recht spektakulär, wenn ich ehrlich bin.
Die von mir genutzte Datei hat folgenden Inhalt (die Altersangabe habe ich dazugefummelt):
Zitat:[
{
"id": "01",
"name": "Olivia Mason",
"designation": "System Architect",
"alter":
{
"jahre": 56
}
},
{
"id": "02",
"name": "Jennifer Laurence",
"designation": "Senior Programmer",
"alter":
{
"jahre": 41
}
},
{
"id": "03",
"name": "Medona Oliver",
"designation": "Office Manager",
"alter":
{
"jahre": 27
}
}
]
Eine einfache Auswertung bzw. Ausgabe könnte die zeilenweise Darstellung der 3 Datensätze sein und wird wie folgt erzeugt:
PHP-Code: <?php foreach($myarray AS $value) { echo $value["id"] . " " . $value["name"] . " " . $value["designation"] . " " . $value["alter"]["jahre"] . "\n"; } ?>
Damit werden alle drei Datensätze ausgegeben. Das Array hat quasi zwei Ebenen. Die Altersangabe ist eben auch auszugeben und muss entsprechend angepackt werden.
Will man nur bestimmte Datensätze sehen, so kann via IF-Abfrage eine Ausgabemenge zu steuern:
PHP-Code: <?php foreach($myarray AS $value) { if ($value["id"] == "02") { echo $value["id"] . " " . $value["name"] . " " . $value["designation"] . " " . $value["alter"]["jahre"] . "\n"; } } ?>
In diesem Fall wird nur der Datensatz ausgegeben, der im Feld ID den Wert 02 stehen hat.
Ob ich jemals etwas mit json-Dateien machen werde, kann ich nicht sagen. Eine Anwwendung hätte ich im Bereich der Hugo-Installationen, denn via json-Dateien kann man Datenbankanwendungen darstellen und Tabellen ausgeben.
|
|
|
Der Huddel mit den Zeichensätzen |
Geschrieben von: Joopi - 07-01-2023, 10:50 - Forum: Programmieren
- Keine Antworten
|
|
Der Huddel mit den Zeichensätzen ist nicht immer einfach zu bewerkstelligen.
Ein Datenbankeintrag in meiner lokalen Umgebung sieht wie folgt aus:
Zitat:I'm
Auf meinem Webspace sieht er aber so aus:
Zitat:I�m
Nach meiner bisherigen Recherche ist hier eine Vermischung von einem ISO-8859-1-Zeichen in einer UTF-8-Umgebung für die Darstellung verantwortlich.
Folgende Erklärung habe ich hier gefunden:
Zitat:Ein Beispiel für das Wort _Höhe_:
UTF-8-Text in ISO-8859-1/9/13-16-Umgebung
_Höhe_ → _Höhe_.
ISO-8859-1-Text in UTF-8-Umgebung
_Höhe_ → _H_�_he_ bzw. Fehlermeldung mit Abbruch. Ein Byte mit dem Hexadezimalwert _F6_ ist in UTF-8 nicht zulässig. Es ist üblich, für nicht konvertierbare Zeichen das [url=https://de.wikipedia.org/wiki/Ersetzungszeichen "Ersetzungszeichen"]Ersetzungszeiche[/url]n (U+FFFD) einzufügen.
Eine Lösung habe ich insofern gefunden, als das oftmals ein Zeichensatz falsch deklariert wird. Bedeutet, es gibt Verwechslungen zwischen windows-1252 und ISO-8859-1.
Die Lösung meines Problems war folgende Zeile im PHP-Script:
PHP-Code: <?php //$mailtext_neu = mb_convert_encoding($mailtext_neu, "UTF-8", "windows-1252"); $mailtext_neu = iconv('windows-1252', 'UTF-8', $mailtext_neu); ?>
Beide Varianten funktionieren und konvertieren den scheinbar nicht in UTF-8 vorliegenden Text korrekt um.
Gefunden habe ich die Lösung hier:
PHP: Problems converting "’" character from ISO-8859-1 to UTF-8
|
|
|
DB-Abfragen in Funktionen auslagern |
Geschrieben von: Joopi - 07-01-2023, 10:44 - Forum: Programmieren
- Keine Antworten
|
|
Endlich habe ich es nicht nur geschafft, dass ich Datenbankabfragen in externe Scripte auslagere, sondern ich habe es zudem auch endlich mal begriffen.
Bislang schreibe ich immer alles in ein PHP-Script. Nur die Zugangsdaten für die Datenbankabfrage habe ich bereits vor Jahren ausgelagert und greife über eine include-Anweisung darauf zu.
Nun habe ich zwei weitere Scripte, neben dem DB-Include, erstellt. Im ersten Script wird die Datenbankverbindung aufgebaut, im zweiten Script werden die Datenbankabfragen innerhalb von Funktionen durchgeführt.
Die Funktionsergebnisse kann ich dann im Hauptscript nutzen. Dadurch wird das Hauptscript übersichtlicher.
Mein Vorgehen kommt aus der prozdualen Ecke. Die liegt mir mehr als die objektorientierte Methode. Mir liegt es nicht an Geschwindigkeit, sondern eher am einfachen Erstellen weiterer Script in anderen Projekten.
Und ich bin mir sicher, dass ich noch mehr auslagern kann und der geneigte Fachmann mal wieder einen Schenkelklopfer loslässt. Das ist mir aber egal. Ich habe endlich das, was ich seit langer Zeit brauche. Erweiterungen und Verfeinerungen können irgendwann angeflanscht werden.
Insgesamt gibt es also 4 Scriptdateien:
Datenbankzugangsparameter
PHP-Code: <?php /* Zugangsparameter */ $host = "localhost"; $user = "user"; $pwd = "passwort"; /* Datenbanken */ $dbname001="datenbank"; /* Tabellen */ $tblname001="user"; $tblname002="userdetail"; $tblname003="session"; ?>
Datenbankverbindungsaufbau
PHP-Code: <?php include("db_connect.inc.php");
$db = mysqli_connect($host, $user, $pwd, $dbname004);
if(!$db) { exit("Verbindungsfehler: ".mysqli_connect_error()); } ?>
Datenbankfunktionen
PHP-Code: <?php // Der spätere Aufruf ist: php php_test_funktion_slave.php
$query_vg = 0;
// Definition der Funktion, wobei die DB-Verbindung ausgelagert wurde. function vorgang($db){ include("php_test_funktion_db.php"); $query_vg = mysqli_query($db, "SELECT id, mailadresse, vorname FROM $tblname021 WHERE id >= 35"); return $query_vg; } ?>
Mainscript mit Nutzung der Funktionsergebnissen
PHP-Code: <?php error_reporting(E_ALL);
include("php_test_dbfunktion.php");
// Aufnahme des Funktionsergebnisses $result_vg = vorgang($query_vg);
// Ausgabe des Funktionsergebnisses while($row_vg = mysqli_fetch_row($result_vg)) { echo "<p>Das ist die ID: " . $row_vg[0] . "</p>\n"; } ?>
Ich bin derzeit sehr zufrieden, dass ich nun endlich die Datenbeschaffung und die Datenverwendung trennen kann. Immer alles in einem Script abzuhandeln ist besonders bei umfangreichen Projekten und Scripten sehr anstrengend. Hier kann ich nun sehr viel Übersicht gewinnen und die Pflege des Programmcodes optimieren.
Diese Funktionen setze ich nur auf dem lokalen Rechner ein. Auf meinen externen Webspaces habe ich Datenbanken und damit verbundene Abfragen auf ein Minimum reduziert. Das Umschreiben dieser Script spare ich mir derzeit, bis ich mehr weiß und mehr Sicherheit im Umgang mit derartigem Vorgehen habe.
|
|
|
|