Hallo, Gast |
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.
|
Foren-Statistiken |
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 513
» Foren-Beiträge: 726
Komplettstatistiken
|
Benutzer Online |
Momentan sind 9 Benutzer online » 0 Mitglieder » 5 Gäste AhrefsBot, Bing, Crawl, bot
|
|
|
Vorschaumodus von Visual Studio Code verhindern |
Geschrieben von: Joopi - 15-07-2023, 10:21 - Forum: Blog
- Antworten (1)
|
 |
Je moderner eine Software daherkommt, um so mehr Murks steckt darin. Das ist zwar Ansichtssache, aber für mich ist das so. Man kann einfach nicht jede Software in- und auswendig kennen. Zumindest nicht der Hobbyist. Und viele Standardeinstellungen sind meist fragwürdig und lässt die Frage aufkommen, was sich der Programmierer (m/w/d) dabei wohl gedacht haben kann.
Wie bereits an anderer Stelle berichtet, arbeite ich vermehrt mit Visual Studio Code. Durch die vielfältigen Möglichkeiten, auch im Hinblick auf den umfangreichen Erweiterungsmarkt, verliert man schnell den Überblick. Aber man sich ja selber dabei, wenn es um die Installation von kleinen Helfern geht.
Aber eines hat mich irgendwie von Anfang an genervt. Und zwar:
Wenn aus der linken Leiste auf eine Datei geklickt wird, wird sie geöffnet. Man kann sich den Inhalt anschauen.
Wenn dann auf eine zweite Datei geklickt wird, wird die erste geschlossen. An deren Stelle wird die zweite geöffnet und kann betrachtet werden.
Und so geht es weiter bis zum Sankt-Nimmerleins-Tag.
Erst wenn in einer Datei etwas ändert wird, wird beim Klick in der linken Spalte auf eine Datei ein neues Tab aufgemacht und dort erscheint dann der Inhalt der neu angeklickten Datei.
Wenn man dann wieder auf eine Datei in der linken Leiste klickt, tritt diese an die Stelle der geraden eben geöffneten Datei.
Was ist das nur für ein Unfug?
Ich habe lange gebracht, um zu begreifen, was da eigentlich passiert. Jetzt endlich, nach wohl zwei Jahren, habe ich herausgefunden, dass dieses Verhalten wieder Mal an einer für mich nicht nachvollziehbaren Standardeinstellung liegt, die von Hause aus gesetzt ist. Das Haus, in dem dieser Unfug verzapft wird, gehört MicroSoft, wo Visual Studio Code hergestellt wird. Die Erfinder von Windows sind für alles gut, meist für nicht Gutes. Wobei VSC insgesamt gut ist, aber ...
Es ist einfach nur lästig, dass Tabs, also Dateien, einfach so ohne Nachfrage geschlossen werden. Es betrifft nämlich auch Dateien, die geöffnet, editiert und wieder neu gespeichert wurden, aber längere Zeit unberührt geöffnet blieben. Somit kann es also sein, wenn eine weitere Datei aus der linken Leiste geöffnet wird, irgendwo eine andere Datei geschlossen wird. Zack, weg! Man blickt überhaupt nicht mehr durch. Schon gar nicht dann, wenn man quasi parallel an mehreren Dateien arbeitet.
Die Dateien, die ich geöffnet habe, werden von mir auch genutzt. Nicht immer und die ganze Zeit, aber sie gehören zu meinem Projekt. Dateien, von denen ich glaube, sie nicht mehr nutzen zu müssen, die schließe ich selber.
Scheinbar habe ich endlich den Anpacker gefunden, um dieses nervige Verhalten von Visual Studio Code abzustellen. In den Einstellungen ist es dieser Abschnitt:
Der ist im Standard aktiv und bedeutet, dass ein Vorschaumodus erlaubt ist. Der Vorschaumodus bedeutet: nur gucken, nicht anfassen
Erst wenn eine Änderung vorgenommen und diese danach gespeichert wurde, ist für eine gewisse Zeit der Vorschaumodus nicht mehr aktiv.
Den Abschnitt habe ich nun deaktiviert und hoffe, dass damit die Tabs/Dateien geöffnet bleiben, die ich geöffnet haben möchte.
Es gibt noch eine weitere Einstellung, von der ich nicht so genau weiß, wie sie zu deuten ist:
Auch diese Einstellung habe ich deaktiviert, denn alles was automatisch läuft in Bezug auf das Öffnen und Schließen von Dateien, möchte ich nicht haben.
|
|
|
Mehrere Spalten modizifieren |
Geschrieben von: Joopi - 15-07-2023, 09:31 - Forum: Programmieren
- Keine Antworten
|
 |
Heute hatte ich den Umstand, dass ich zwei Spalter in mehreren Tabellen mit dem Typ string angelegt hatte. Aber ich benötigte sie als Spalten vom Typ integer. Da ich mir bei dem warmen Wetter keine Fingerübungen geben wollte, war relativ schnell ermitteln, wie ich das in einem Befehl würde machen können.
Der Befehl lautet wie folgt:
Code: ALTER TABLE zawstat_browser MODIFY jahr INTEGER, MODIFY monat INTEGER;
Dieser Befehl musste nun 28 Mal wiederholt werden. Das konnte ich mit LibreOffice auch schnell und schlank regeln.
Code: A | B | C
1 | zawstat_browser | =VERKETTEN("ALTER TABLE ";B1;" MODIFY jahr INTEGER, MODIFY monat INTEGER;")
Die 28 in dieser Form erstellen mysql-Statements konnte ich dann en bloc einfügen und ausführen lassen. Fertig!
|
|
|
Felder einer Tabelle auflisten mit Ausnahmen |
Geschrieben von: Joopi - 12-07-2023, 10:28 - Forum: Programmieren
- Keine Antworten
|
 |
Dann und wann kann es notwendig sein, in einem PHP-Skript die Felder einer MySQL-Tabelle aufzulisten, wobei aber nicht alle Felder angezeigt werden sollen.
Im Normalfall sieht der PHP-Code wie folgt aus, um alle Felder aufzulisten:
Code: $result = mysqli_query($db, "SHOW COLUMNS FROM monatstabelle;");
Will man aber bestimmte Felder nicht in der Anzeige haben, so kann man diese ausschließen, und zwar wie folgt:
Code: $result = mysqli_query($db, "SHOW COLUMNS FROM monatstabelle WHERE Field != 'id' and Field != 'monat' and Field != 'jahr';");
Das Resultat, welches angezeigt werden könnte, würde alle anderen Tabellenfelder zeigen.
|
|
|
Upload csv-Datei |
Geschrieben von: Joopi - 12-07-2023, 04:18 - Forum: Programmieren
- Keine Antworten
|
 |
Das Einfügen von Daten in eine MySQL-Tabelle mittels einer csv-Datei ist im Grunde genommen recht einfach. Es gibt aber Tücken, die man wissen und überlisten muss.
Der INSERT-Befehl erfordert immer die gleiche Anzahl einzufügender Spalten wie Spalten in der Tabelle vorhanden sind. Wird über ein Formular oder über eine sql-Downloaddatei eine Tabelle gefüllt, ist gewährleistet, dass die üblicherweise vorhandene Spalte mit dem auto_increment automatisch gefüllt wird. In der Regel handelt es sich um die Spalte id oder ähnliches.
Oftmals liegen Textdateien vor, die zumindest im csv-Format erstellt wurden und somit relativ einfach weiterverarbeitet werden könnten. Gäbe es da nicht das Hindernis, dass oftmals in dieser Art von Erfassungsgrundlage genau diese wichtige Spalte mit dem Namen id oder ähnliches fehlt. Naja, mir geht es leider oftmals so.
Bisher habe ich die csv-Datei in Excel bzw. LibreOffice Calc geladen, eine Spalte vor den Daten eingefügt, diese dann mit Autofill durchnummeriert und dann wieder als csv-Datei abgespeichert. Ein wenig umständlich, aber zielführend (meistens).
Heute habe ich gelernt, dass es auch anders geht. Die gelernte Variante spart Zeit und findet ausschließlich in PHPMyAdmin statt. Will man über PHPMyAdmin eine csv-Datei importieren, erkennt das Programm den Dateityp. Es wird danach gefragt, wie die Spalten getrennt und die Werte eingeschlossen sind.
Würde ich einfach nur auf importieren klicken, würde eine Fehlermeldung erscheinen. Diese Fehlermeldung würde berichten, dass die Anzahl der Spalten zwischen einzufügenden Werten und Tabelle nicht übereinstimme. Das wäre auch richtig so, denn die Spalte mit dem Namen id oder ähnliches fehlt in der csv-Datei.
Die Lösung ist, dass in dem Feld Spaltennamen genau die Spalten eingetragen werden, die in der csv-Datei enthalten sind (die Überschriften stehen nicht drin). Die Reihenfolge der Spalten sollte aber trotzdem stimmen und gewährleistet sein.
Das würde dann so aussehen können:
Wenn dann, Datenkonsistenz vorausgesetzt, auf importieren bzw. ok geklickt wird, werden die Daten eingelesen und die Spalte mit auto_increment automatisch gefüllt.
Diese Art des Uploads ist mir wesentlich lieber, wie das Herumgehampele in einem Tabellenkalkulationsprogramm oder eine andere Art der Programmierung, die eine fortlaufende Nummer vor den jeweiligen Datensatz stellt.
Wenn es nicht zu viele Datensätze sind, dann kann man die laufende Nummer händisch eingeben. Meine csv-Datei hatte über 230.000 Datensätze. Das ist mir dann doch ein wenig über den Kopf gewachsen.
|
|
|
eigene Tastenkombinationen in VS Code erstellen |
Geschrieben von: Joopi - 12-07-2023, 01:34 - Forum: Programmieren
- Keine Antworten
|
 |
Seit etlichen Jahren arbeite ich viel und gerne mit dem Editor bluefish. Ich mag diesen Editor, weil er relativ einfach ist. Besonders gut gefallen mir die Tastenkombinationen, mit denen schnell entsprechende TAGS in einem HTML-/PHP-Dokument gesetzt sind. Der Vorteil dieser Tastenkombinationen ist, dass der Cursor direkt zwischen den beiden TAGS steht und man sofort mit dem Schreiben fortfahren kann.
Die für mich wichtigsten sind:
- STRG+ALT+P -> <p></p> --> Absatz (Paragraph)
- STRG-ALT+M -> <li></li> --> Listeneintrag
- STRG+ALT+B -> <b></b> --> Fettschrift
Mitterweile nutze ich verstärkt Visual Studio Code. Dieser Editor ist moderner, aber für mich nicht zwingend besser. Aber bei bluefish bin ich mir nicht sicher, wie lange er noch in der Wartung ist. Also nutze ich VSC nun etwas verstärkter.
Allerdings fehlen mir in VSC die liebgewonnen Tastenkombinationen. VSC ist überfrachtet mit Tastenkombintionen, die ich nie nutzen werde. Ich bin nur Hobbyist und kein Profi, der in allen Programmiersprachen zu Hause ist und durch die Codes pflügt, als gäbe es kein Morgen.
Nun habe ich es endlich geschafft, die 3 obigen Tastenkombinationen in VSC zu integrerieren. In der keybindings.json ist dafür folgender Eintrag erforderlich (Systemtastenkombinationen werden damit überschreiben):
Code: // Geben Sie Ihre Tastenzuordnungen in dieser Datei ein, um die Standardwerte außer Kraft zu setzen.
[
{
"key": "ctrl+alt+p",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "<p>$0</p>"
}
},
{
"key": "ctrl+alt+m",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "<li>$0</li>"
}
},
{
"key": "ctrl+alt+b",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "<b>$0</b>"
}
}]
Das Wunderbare dabei ist, dass der Cursor wieder zwischen den TAGS steht und somit der Schreibfluss kaum gehindert wird.
Die Zeit, dass ich viele HTML-Dokumente geschrieben habe, ist zwar im Moment vorbei, aber dennoch werden auch in PHP-Skripten viele TAGS genutzt.
Ich bin begeistert!
|
|
|
OpenAI ist ähnlich paranoid wie alle anderen - ich wurde geblockt |
Geschrieben von: Joopi - 11-07-2023, 05:39 - Forum: Allgemeines
- Antworten (2)
|
 |
Mit einer simple Anfrage, wie ich in einem PHP-Skript über einen mysqli-Befehl etwas in eine Datenbank schreiben kann, habe ich mich geblockt bzw. wurde geblockt. Die simple Mitteilung lautet:
Mich wundert es, dass es Menschen gibt, die mittels Chat-GPT und wer weiß was für Services ganze Programme schreiben. Wenn ich eine simple Frage stelle, dann werde ich geblockt. Wie bei allen anderen us-amerikanischen Konzern, scheint auch bei OpenAI die Paranoia vorzuherrschen.
Es gibt noch nicht mal eine Anlaufstelle oder eine Mailadresse, an die man sich wenden kann. Nur das ist über einen Chatroboter erreichbar:
Jaja, alles für umme und dann meckern. Ich bin immer ohne Chat-GPT ausgekommen, darum ist es nicht so schlimm. Nur die Art und Weise, wie der Normaluser, der auch Bezahluser werden könnnte, behandelt wird, ist mal wieder unter aller Kanone.
|
|
|
Sicherheit mit mysqli_real_escape_string |
Geschrieben von: Joopi - 07-07-2023, 11:15 - Forum: Programmieren
- Keine Antworten
|
 |
Mittlerweile gewöhne ich mir meine eingefleischten Fehler ab und schreibe auch PHP-Code etwas besser - hoffentlich.
Die prepared statements habe ich bereits verstanden, nun ist es aber auch wichtig, dass ich die Erfassung von Daten in eine Datenbank gegen kriminelle Absichten schütze. Eine sql-injection ist nicht wirklich zu wünschen, daher werde ich mich auch hier vorsehen.
Ein einfache insert-Statement sieht wie folgt aus:
Code: $idvorgang = $_REQUEST['n_idvorgang'];
$telefon = $_REQUEST['n_telefon'];
$datum = $_REQUEST['n_datum'];
$sql = mysqli_query($db, "INSERT INTO $tblname042 (id_vorgang, telefon, erfasst) VALUES ('$n_idvorgang', '$n_telefon', '$n_datum')");
Aus einem Formular werden Eingabe gelesen und in eine Tabelle erfasst. Bei dieser sehr effektiven, aber auch einfachen Art und Weise der Datenerfassung kann es leicht zu sql-injections kommen. Dieses gilt es zu verhindern. Der nachfolgende Code nutzt den Schutz davor:
Code: $idvorgang = mysqli_real_escape_string($conn, $_REQUEST['n_idvorgang']);
$telefon = mysqli_real_escape_string($conn, $_REQUEST['n_telefon']);
$datum = mysqli_real_escape_string($conn, $_REQUEST['n_datum']);
$sql = "INSERT INTO $tblname042 (id_vorgang, telefon, erfasst) VALUES (?, ?, ?);";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL error";
}
else {
mysqli_stmt_bind_param($stmt, "sss", $idvorgang, $telefon, $datum);
mysqli_stmt_execute($stmt);
}
Mit diesem Code werden die variablen Daten über mysqli_real_escape_string gegen Codeeinträge geschützt. Einem Hacker wird es so wesentlich schwerer gemacht, eine Webseite über eine sql-injection zu hacken.
Auch hier ist die vermehrte Code vielleicht als Nachteil zu sehen. Aber die Sicherheit geht vor, daher werde ich künftig meinen Code immer so aufbauen und bestehende PHP-Dokumente entsprechend korrigieren.
|
|
|
Prepared Statements mit mysqli |
Geschrieben von: Joopi - 07-07-2023, 10:42 - Forum: Programmieren
- Keine Antworten
|
 |
Mittlerweile gewöhne ich mir meine eingefleischten Fehler ab und schreibe auch PHP-Code etwas besser - hoffentlich.
Eine Abfrage aus einer Datenbank ist im Grunde genommen sehr einfach und könnte so aussehen:
Code: $erg = mysqli_query($db, "SELECT mailadresse FROM " . $tblname021 . " WHERE id = " . $n_id2);
$data = mysqli_fetch_assoc($erg);
$mailaddi = $data['mailadresse'] ?? null;
Der Code zeigt, dass ich durchaus mit Variablen in der Datenbankabfrage arbeite. Da ich diesen Code auf einem Webspace benutze, könnte es sein, dass Angreifer die Gelegenheit nutzen und meine Webseite nicht nur attakieren, sondern hacken. Das möchte ich vermeiden.
Der gleiche Zweck, den ich mit dem obigen Code verfolge, nämlich eine Mailadresse aus einer Tabelle zu erhalten, ist mit folgendem Code, der mit prepared statements geschrieben ist, gleichfalls zu erreichen:
Code: $erg = "SELECT mailadresse FROM " . $tblname021 . " WHERE id = ?;";
$stmt = mysqli_stmt_init($db);
if (!mysqli_stmt_prepare($stmt, $erg)) {
echo "SQL statement failed.";
} else {
mysqli_stmt_bind_param($stmt, "s", $n_id2);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$data = mysqli_fetch_assoc($result);
$mailaddi = $data['mailadresse'] ?? null;
}
Der Vorteil von dieser Art der Programmierung ist, dass sie sicherer ist. Der Nachteil, er ist dem geneigten Leser bereits aufgefallen, ist, dass es wesentlich mehr Code zu schreiben gibt. Naja, einen Tod muss der Hobbyprogrammierer wohl riskieren, um nicht Opfer dieser blöden Internetkriminellen zu werden.
Ob das nun der Weisheit letzter Schluss ist, vermag ich nicht zu sagen. Aber die Vorgehensweise habe ich nun mehrfach im Internet recherchiert (ohne Chat-GPT) und ebenfalls in neueren YouTube-Videos sehen können. Insofern gehe ich davon aus, dass es nicht allzu verkehrt ist, meine PHP-Skripte anzupassen und in der etwas aufwendigeren Art und Weise auf den Server zu legen.
|
|
|
rsync mit ssh auf remote-server |
Geschrieben von: Joopi - 05-07-2023, 07:47 - Forum: Linux
- Keine Antworten
|
 |
Seitdem ich wieder einen vServer habe, mache ich mir Gedanken darüber, wie ich den Ordner und Dateien auf den Server bringe. Die erste Option ist immer via FTP.
Es gibt aber auch die Möglichkeit, mit rsync die Ordner und Dokumente vom lokalen Rechner auf den vServer zu transferieren.
Auf den vServer logge ich mich nur noch mit einem rsa-key ein. Die Aufgabe, die ich erledigen wollte, war:
- Stelle eine Verbindung über ssh und rsa-key her.
- Synchronisiere den lokalen Ordner mit dem entfernten Ordner
Der Befehl dazu lautet wie folgt:
Code: rsync --delete -av -e 'ssh -i ~/.ssh/rsa-key -p 2200' ~/help/help/ user@server.net:~/help/
Da ich einen abweichenden Port benutze, den ich im Beispiel mit 2200 angegeben habe, wirkt Befehl durchaus kompliziert. Wenn man ihn in Ruhe anschaut, dann löst sich die Komplexität auf:
- rsync-Befehl und Optionen (rsync --delete -av -e)
- ssh-Befehl und Optionen ('ssh -i ~/.ssh/rsa-key -p 2200')
- Quellordner (~/help/help/)
- Zielserver und Zielordner (user@server.net:~/help/)
Sobald der Befehl ausgeführt ist, muss die passphrase eingegeben werden:
Code: Enter passphrase for key '/home/user/.ssh/rsa_key':
Ist Phrase korrekt eingegeben worden, wird der Login-Vorgang ausgeführt. Anschließend werden die Ordner und Dateien synchronisiert. Ist der Transfer beendet, erfolgt der Logout-Vorgang. Fertig!
Da ich meinen lokalen Computer so gut wie nie ausschalte, würde ich gerne nachts ein Backup vom lokalen Computer auf den entfernten Server durchführen lassen (cron-Job). Dazu muss ich aber noch erfahren, wie ich die passphrase mitgeben kann, ohne dass ich einen Wecker stellen und vor dem Computer sitzen muss.
|
|
|
|