Daten Eintragen in die Mysql Datenbank Scheitert.

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
__blackjack__
User
Beiträge: 14178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Die sind nicht nur einfach gelb unterstrichen, da wird auch irgendwo ein Text dazu stehen *warum* die gelb unterstrichen sind. Je nach IDE wenn man mit dem Mauszeiger über der Unterstreichung verweilt, oder wenn man den Textcursor in den Unterstrichenen Teil setzt, oder als Tooltip an einer Markierung am Rand des Textbereichs auf Höhe des unterstrichenen Textes, oder… Musst halt schauen wo das bei Deiner verwendeten IDE angezeigt wird.

Wenn ich raten müsste, verschwindet das Problem wenn die ganzen global definierten Variablen in einer Funktion verschwunden sind, wo sie ja auch hingehören.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
TorstenVoelker
User
Beiträge: 142
Registriert: Mittwoch 5. Februar 2025, 12:55

Erstmal danke für die Antwort ,
Meinst Du damit das Extra in einer Funktion reinsetzen die StringVar oder was meinst Du damit ?

Stehe grade auf dem Schlauch .
Benutzeravatar
__blackjack__
User
Beiträge: 14178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Auf Modulebene sollten nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Kein Code der Variablen definiert und kein Hauptprogramm. Also nicht nur die Definitionen der `StringVar`-Objekte, sondern alles was da ablaufen soll wenn man das Programm startet, was noch nicht in einer Funktion steckt.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Sirius3
User
Beiträge: 18307
Registriert: Sonntag 21. Oktober 2012, 17:20

@TorstenVoelker: was hast Du hiervon (viewtopic.php?p=433266#p433266) umgesetzt?
Solange Du daraus nichts lernst, hat es wenig Sinn, noch mehr Code hinzuzufügen.
TorstenVoelker
User
Beiträge: 142
Registriert: Mittwoch 5. Februar 2025, 12:55

Am besten ich besuche ein Kurs und dann sollte man es verstanden haben .
TorstenVoelker
User
Beiträge: 142
Registriert: Mittwoch 5. Februar 2025, 12:55

Sirius3 hat geschrieben: Montag 3. März 2025, 17:46 @TorstenVoelker: was hast Du hiervon (viewtopic.php?p=433266#p433266) umgesetzt?
Solange Du daraus nichts lernst, hat es wenig Sinn, noch mehr Code hinzuzufügen.
Ich habe es studiert und nach programmiert und es funzte aber ich habe letztens aber ein Script übernommen von hier wo der User es anders gemacht hat so ähnlich wie ich aber nur das es jetzt zu den besagten Problem kam .

Deswegen wie gesagt werde ich ein Kurs besuchen um das richtig zu lernen und dann sollte es besser zu verstehen sein .
TorstenVoelker
User
Beiträge: 142
Registriert: Mittwoch 5. Februar 2025, 12:55

Habe den Fehler gefunden es lan an die Einrückung unter anderem .

Das ist das was ein wenig nervt mit der Einrückung .
Benutzeravatar
__blackjack__
User
Beiträge: 14178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Nein, das lag nicht „an der Einrückung“, sondern dass das globale Variablen waren. Das ist als wenn man in PHP die geschweiften Klammern nervig finden würde. Irgendwie muss man halt kennzeichnen wo Blöcke anfangen und Enden. In PHP macht man dafür Klammern *und* rückt ein, damit Compiler unrd Mensch die Blöcke erfassen können. In Python reicht der Teil, den man für den menschlichen Leser macht, auch dem Compiler.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Benutzeravatar
noisefloor
User
Beiträge: 4219
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Das ist das was ein wenig nervt mit der Einrückung .
Wenn dich das nervt -> verabschiede dich von Python, dann ist das halt nicht deine Sprache. Einrückungen sind seit je her integraler Bestandteil des Syntax von Python und nicht nur "nice to have". Ohne korrekte Einrückung bekommst du kein korrektes Python.

Gruß, noisefloor
oldboyJR
User
Beiträge: 65
Registriert: Donnerstag 28. März 2024, 16:19

$sql = "INSERT INTO petitionmg (Anrede, Vorname, Nachname, Email, Strasse, Nummer, Ort, PLZ, Bundesland, Kommentare, Unterstuetzer )
VALUES ('" .$Anrede ."', '" .$Vorname ."','" .$Nachname ."', '" .$Email ."', '" .$Strasse ."','" .$Nummer ."', '" .$Ort ."', '" .$PLZ ."', '" .$Bundesland ."', '" .$Kommentare ."', '" .$Unterstuetzer ."' )";
Man beachte erst ein hHochkomma dann Gänsefüßchen dann der wert $Vornahme dann Gänsefüßchen und dann Hochkomma!! der Interpreter macht daraus dann Hochkomma $Anrede Hochkomma
Benutzeravatar
sparrow
User
Beiträge: 4575
Registriert: Freitag 17. April 2009, 10:28

@oldboyJR: Der dritte Thread in den du irgend etwas kippst, das mit Python nichts zu tun hat und vor all em falsch ist,
Man formatiert kan sicher _nicht_ Variablen in ein SQL-Statement. Das wurde hier im Thread bereits richtig gemacht und dein Hinweis im Zweifelsfall sogar gefährlich. Stichwort "SQL Injektion".
oldboyJR
User
Beiträge: 65
Registriert: Donnerstag 28. März 2024, 16:19

Kommt drauf an wo der Server ist. Welche Kontrollmechanismen im Programm eingebaut ist und wie der Zugriff ist oder? Wenn man einen internen Server benutzt mit einem unbekannten Port sehe ich für Probeschritte kein Risiko oder? Manchmal lohnt es sich auch mit Print die Sequenz zu überprüfen bzw. man hat zum Beispiel Spider installiert; in das Fenster Variablenmanager zu sehen was man zu übergeben versucht.
Benutzeravatar
sparrow
User
Beiträge: 4575
Registriert: Freitag 17. April 2009, 10:28

@oldboyJR: Nein. Siehe den anderen Thread in dem du den selben Kram erklärst. Es gibt keinen Grund falschen Code verwenden.

Dein Beitrag ist falsch und hat mit Python nicht zu tun.
Benutzeravatar
__blackjack__
User
Beiträge: 14178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Doch, auch bei ganz privatem Code gibt es Risiken. Mindestens das man Werte hat, die unbeabsichtigt die selbstgebastelten SQL-Zeichenketten verlassen und dann einfach nicht funktionieren. Und dann ist da das übliche Risiko, dass provisorischer Code am Ende doch recht häufig drin bleibt und einem später dann um die Ohren fliegt. Es ist *einfach* das *richtig* zu machen, also gibt es *keinen* Grund das falsch zu machen.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Benutzeravatar
noisefloor
User
Beiträge: 4219
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Wenn man einen internen Server benutzt mit einem unbekannten Port sehe ich für Probeschritte kein Risiko oder?
Was du für dich in deinem stillen Kämmerlein machst ist deine Sache. Das ist aber kein Grund, schlechten bis falschen Code unreflektiert in ein öffentlich einsehbares Forum zu kippen. Bzw. heute kann man ja fast allem was positives abgewinnen: die trägst aktiv zur Verdummung der KI-Bots bei, die auch Beiträge aus diesem Forum analysieren und zum "Lernen" benutzen.

Gruß, noisefloor
Benutzeravatar
DeaD_EyE
User
Beiträge: 1273
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

oldboyJR hat geschrieben: Montag 6. Oktober 2025, 18:31 $sql = "INSERT INTO petitionmg (Anrede, Vorname, Nachname, Email, Strasse, Nummer, Ort, PLZ, Bundesland, Kommentare, Unterstuetzer )
VALUES ('" .$Anrede ."', '" .$Vorname ."','" .$Nachname ."', '" .$Email ."', '" .$Strasse ."','" .$Nummer ."', '" .$Ort ."', '" .$PLZ ."', '" .$Bundesland ."', '" .$Kommentare ."', '" .$Unterstuetzer ."' )";
Man beachte erst ein hHochkomma dann Gänsefüßchen dann der wert $Vornahme dann Gänsefüßchen und dann Hochkomma!! der Interpreter macht daraus dann Hochkomma $Anrede Hochkomma
Das kann doch kein Mensch lesen. Dein Code sieht nach PHP aus und du machst es falsch. Dafür gibt es das hier: https://www.php.net/manual/de/pdo.prepa ... ements.php
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
oldboyJR
User
Beiträge: 65
Registriert: Donnerstag 28. März 2024, 16:19

Ja genau das scheint bei mir auch der Fall zu sein. Ich habe vorher mit PHP gearbeitet. Und mit Apache Server intern unter Xampp . Ich habe in der my.ini angepasst
# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir = "/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "/xampp/mysql/data"
#innodb_log_arch_dir = "/xampp/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

Der Treibertyp wird auch in den Datenbanken die ich damals erzeugt habe angezeigt. Ich habe diese aktiviert weil die Befehle funktionierten. In Python habe ich noch nicht herausgefunden wie ich das machen kann denn offensichlich wird eine passend für was andere Syntax? passen zu welchen Treibern? benutzt die zu passend zu welcher Python version funktioniert.

Wie sieht das den unter Python in Anaconda, spyder, aus. Angeblich soll das neue Modul mysql-connector-python alle Treiber und syntax unterstützen
oldboyJR
User
Beiträge: 65
Registriert: Donnerstag 28. März 2024, 16:19

Erst einmal TKLabel ist ein Beschreibungsfeld und kann im Fenster keine Daten generieren, Das geht nur mit text ,entry oder Listbox !!
Es ist wichtig bestimmte Syntax zu benutzen die man gerne per def tuwas_jetzt( ). wiederverwenden kann. Eingaben die man im Tinkerfenster macht müssen vom String zurück gewandelt werden.
Das generieren der SQL sequenz ist erfolgreich wenn im Variablenmanager (den finde ich in Spider wenn ich den Bereich Variablenmanager aktiviere) die type List mit den entsprechenden Werten finde. Unter Python3 mit installierten
< Modul>mysql-connector-python funktioniert folgendes

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 11 18:51:35 2025

@author: GBT B650M GamingX AX
"""
#den kontakt zu Mysql herstellen
import mysql.connector
Error = None
conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="",
    database="",
    port="3306")
print("MySQL Database connection successful") #Bewstätigt den erfolg sont kommt fehlermeldung


def tabelle_anzeigen():# Ich wiederhole gerne alle Parameter(haltbarkeit)
    db = mysql.connector.connect(
        host="localhost",
        user="root",
        password="",
        database="XXXXXX",# hier steht die Datenbank 
        port="3306")
    cursor = db.cursor()
    cursor.execute("SHOW TABLES")# zeigt alle Tabellen die schon angelegt sind
    for tbl in cursor:
        print(tbl)#listet im konsolenfenster auf

tabelle_anzeigen()#Löst die def gleichen namens aus 


def tabelle_erzeugen():# dieser schritt kann nur einmal pro Datenbank ausgefürt
#werden ansonsten bekommt man nur Fehlermeldungen
    db = mysql.connector.connect(
        host="localhost",
        user="root",
        password="",
        database="XXXXXX",
        port="3306")
    cursor = db.cursor()
    # Tabelle 'benutzer' erzeugen
    sqlStmt = "CREATE TABLE benutzer (" \
        "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY," \
        "vorname VARCHAR(30) NOT NULL," \
        "nachname VARCHAR(30) NOT NULL" \
        ")"
    cursor.execute(sqlStmt)
    for tbl in cursor:
            print(tbl)
            
Der Eintrag wird mit

Code: Alles auswählen

import mysql
def Daten_hinzu():
    db = mysql.connector.connect(
    host="localhost",
    user="root",
    password="",
    database="Boomer_obj",
    port="3306")
    cursor = db.cursor()

    users = [["Stefan", "Draeger"], [
        "Max", "Mustermann"], ["Monika", "Musterfrau"]]
    sqlStmt = "INSERT INTO benutzer (vorname, nachname) VALUES ('%s', '%s');"
    cursor = db.cursor()
    for vorname, nachname in users:
      cursor.execute(sqlStmt % (vorname, nachname))
      print(vorname, nachname, sep="|")
    cursor.execute("COMMIT;")


Daten_hinzu()

hinzugefühgt
oldboyJR
User
Beiträge: 65
Registriert: Donnerstag 28. März 2024, 16:19

Gehen wir davon aus das wir irgendwoher die Strings Anna und Holzapfel erhalten dann

Code: Alles auswählen

import mysql
wert1 = "Stefani"
wert2 = "Draegeri"
db = mysql.connector.connect(
     host="localhost",
     user="root",
     password="",
     database="Boomer_obj",
     port="3306")
cursor = db.cursor()

users = [[wert1, wert2]]
sqlStmt = "INSERT INTO benutzer (vorname, nachname) VALUES ('%s', '%s');"
cursor = db.cursor()
for vorname, nachname in users:
      cursor.execute(sqlStmt % (vorname, nachname))
      print(vorname, nachname, sep="|")
      cursor.execute("COMMIT;")
einfügen können.
PS: Kennt jemand die Syntax für das erzeugen der Datenbank sonst muß man die direkt in Mysql anlegen
Benutzeravatar
__blackjack__
User
Beiträge: 14178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Dein Motherboard schreibt Python-Quelltexte?

Im ersten Programm wird `Error` auf Modulebene an den Wert `None` gebunden und dann nirgends verwendet. Sieht auch nicht besonders sinnvoll aus, diese Definition.

Dann wird auf Modulebene eine Verbindung zur Datenbank aufgebaut. Und auch nirgends verwendet. So ein Verbindungsaufbei der alleine schon beim importieren eines Moduls passiert, sollte nicht sein. Dann kann man das Modul ja nicht mal importieren wenn die externe Ressource Datenbank nicht verfügbar ist. Die Verbindung wird auch nirgends sauber geschlossen. Wie auch alle anderen Datenbankverbindungen in dem Beispiel.

Und auch Cursor-Objekte sollte man nach der Verwendung schliessen.

Auch wenn das zufällig funktioniert: der Port ist eine Zahl und keine Zeichenkette.

``# Löst die def gleichen namens aus`` ist eine sehr komische Formulierung. Eine ``def`` gibt es nicht in Python. Was da *aufgerufen* wird, ist eine *Funktion*. Und das muss man nicht als Kommentar an Funktionsaufrufe dran schreiben.

Und auch ``# Tabelle 'benutzer' erzeugen`` ist ein komplett nutzloser Kommentar über SQL das mit "CREATE TABLE benutzer" anfängt.

Der Name `sqlStmt` hält sich nicht an die Namenskonventionen und ist auch überflüssig. Wird ja nur in der nächsten Zeile im Aufruf benutzt, wo man auch gleich den Wert hätte hinschreiben können. Und dort dann auch einfach ohne die Fehleranfälligen \ am Zeilenende.

Was soll die 6 in Klammern bei "INT(6)"? Wo denkst Du diese Information zu brauchen? An welcher Stelle entstünde welches Problem wenn man die weg lässt?

Das auslesen der Datensätze eines "CREATE TABLE" macht nicht wirklich sinn.

Die Zugangsdaten zur Datenbank wiederholt man nicht in jeder Funktion, die definiert man einmal an einer Stelle.

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing

import mysql.connector

DB_CONFIG = {
    "host": "localhost",
    "user": "root",
    "password": "",
    "database": "XXXXXX",
    "port": 3306,
}


def tabelle_anzeigen():
    with closing(mysql.connector.connect(**DB_CONFIG)) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute("SHOW TABLES")
            for row in cursor:
                print(row)


def tabelle_erzeugen():
    with closing(mysql.connector.connect(**DB_CONFIG)) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute(
                "CREATE TABLE benutzer ("
                "  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
                "  vorname VARCHAR(30) NOT NULL,"
                "  nachname VARCHAR(30) NOT NULL"
                ")"
            )


def main():
    tabelle_anzeigen()


if __name__ == "__main__":
    main()
Im nächsten Beispiel erstellst Du zwei Cursor-Objekte — nur eines davon wird verwendet.

Und dann formatierst Du schon wieder selber als Zeichenkette Werte in eine SQL-Anfrage. DAS MACHT MAN SO NICHT. DAS IST GEFÄHRLICH.

Hier böte sich zudem `executemany()` anstelle von `execute()` an.

Welche Dokumentation von dieser API hat Dich denn dazu verleitet *selber* COMMIT über ein Cursor-Objekt an die Datenbank zu übermitteln?

Code: Alles auswählen

def daten_eintragen():
    with closing(mysql.connector.connect(**DB_CONFIG)) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.executemany(
                "INSERT INTO benutzer (vorname, nachname) VALUES (%s, %s)",
                [
                    ("Stefan", "Draeger"),
                    ("Max", "Mustermann"),
                    ("Monika", "Musterfrau"),
                ],
            )
            connection.commit()
Ja, die Syntax zum erzeugen einer Datenbank in MySQL kennt jemand: Die Dokumentation von MySQL.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Antworten