Einzelne Felder einer MySQL Tabelle auslesen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo Ihr Lieben,

ich habe mal eine Frage und würde mich über eine Hilfestellung freuen .

Erstmal das was ich vorhabe .

Ich möchte oder bzw ich habe ein Fenster gebaut in dem man sich einloggt und darin sollten Daten aus der Datenbank ersichtlich sein .

Ich habe in der Datenbank folgend Felder .

Einnahmen, ausgaben bugget usw .
Da es ein Finanzbuch sein soll für die ganze Familie wo jeder der sich einloggen wird seine bestimmte Daten sieht .



Beispiel wie ich das damals in php gemacht habe , ich schätze mal das es in Python vielleicht komplizierter sein wird .

Ich habe es in php mit einer Session gemacht wo der Name auf der Seite wo man ist gespeichert wird solange man online ist was wohl fast jeder kennt.

Dann habe ich ausgelesen $member = mysql select * from Tabelle where username = $Username
$row = mysql_fetch_array($member)




So habe ich die Information gehabt für jeden einzelnen User der jetzt online ist auf sein Terminal und habe dann in einer Tabelle zb dann
Budget <? Echo $row[budget]

So ähnlich will ich es auch in der jetzigen Situation machen . Habe mich schon ein wenig eingelesen in mysql und Python aber nicht nicht deb Dreh raus wie ich das umsetzen kann .


Ich hoffe Ihr nimmt mir das nicht übel wenn die Erklärung so lang war , nur so kann ich genau darauf hinweisen was ich vor habe .
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Genauso.

SQL ist die Programmiersprache egal.
Ich würde dazu raten, etwas wie SQLAlchemy zu verwenden und ein Webframework wie Django oder Flask, wenn es eine Webanwendung sein soll.

Aber grundsätzlich funktioniert SQL immer gleich.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was heißt denn genau "ich haben ein Fenster gebaut"? In...? HTML im Browser? Einem GUI Framework? ...?

Willst du dein PHP Anwendung auf Python portieren? Dann: siehe @sparrows Post.

Gruß, noisefloor
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

noisefloor hat geschrieben: Dienstag 18. Februar 2025, 19:08 Hallo,

was heißt denn genau "ich haben ein Fenster gebaut"? In...? HTML im Browser? Einem GUI Framework? ...?

Willst du dein PHP Anwendung auf Python portieren? Dann: siehe @sparrows Post.

Gruß, noisefloor
Ich habe eine GUI erstellt meinte ich sorry .

Also ich hätte so vor

In einem Label Ebend erst den Text , also dein Budget dann in einen Label den Wert aus der Tabelle das den Budget ausgibt aus der Datenbank
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Du hast da jetzt aber keine Sicherheit, denn im Gegensatz zu einer Webanwendung wo das alles auf einem Server läuft, kann hier der Benutzer ja am Programm vorbei mit seinen Zugangsdaten auf die Datenbank zugreifen und dann einfach die Informationen der anderen Benutzer abfragen. Wenn Du eine lokale GUI-Anwendung hast, verwendet man in der Regel keine Serverdatenbank, sondern lokale Dateien. Da hat jeder Benutzer seine eigene(n) Datei(en) und braucht sich auch nicht an der Anwendung anmelden, denn seine Daten werden schon durch das Rechtesystem des Betriebssystems geschützt (wenn man die Rechte entsprechend setzt). Eine Anmeldung hat man in dem Fall ja schon beim Betriebssystem.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

__blackjack__ hat geschrieben: Dienstag 18. Februar 2025, 21:55 @TorstenVoelker: Du hast da jetzt aber keine Sicherheit, denn im Gegensatz zu einer Webanwendung wo das alles auf einem Server läuft, kann hier der Benutzer ja am Programm vorbei mit seinen Zugangsdaten auf die Datenbank zugreifen und dann einfach die Informationen der anderen Benutzer abfragen. Wenn Du eine lokale GUI-Anwendung hast, verwendet man in der Regel keine Serverdatenbank, sondern lokale Dateien. Da hat jeder Benutzer seine eigene(n) Datei(en) und braucht sich auch nicht an der Anwendung anmelden, denn seine Daten werden schon durch das Rechtesystem des Betriebssystems geschützt (wenn man die Rechte entsprechend setzt). Eine Anmeldung hat man in dem Fall ja schon beim Betriebssystem.
DBke für die Antwort, die kann ich das umsetzen?
Bin noch nicht der Profi in Python.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Weiss einer wie ich eine If Abfrage in Python mache um zu wissen ob der Login Name des Entry übereinstimmt mit dem User aus der Datenbank ?

ich wollte es so machen :

Code: Alles auswählen

log = login_entry.get()


    c.execute("SELECT * FROM bank")
    result = c.fetchall()

    if(log == result('username')):
Aber er Zeigt mir schon an das es so nicht geht , weil es Rot unterstrichen wird.

Weiß einer wie ich das umsetzen kann ?
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

um das konkret zu beantworten muss du uns deine Tabellenstruktur mitteilen.

Gruß, noisefloor
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Gut Variablennamen sind wichtig für das Verständnis. Warum nennst Du einen Usernamen `log`? Was ist `c`? Einbuchstabige Namen sind außerhalb eng begrenzter Verwendung selten gut.
If ist keine Funktion, braucht also keine Klammern.
Hast Du Dir mal angeschaut, was der Typ von result ist? Ist das eine Funktion, die man aufrufen kann?

Du hast eine Datenbank, also Nutze diese auch:

Code: Alles auswählen

def test_login_data(database, username, password):
    with contextlib.closing(database.cursor()) as cursor:
        cursor.execute("SELECT hashed_password FROM accounts WHERE username = %s", [username])
        result = cursor.fetchone()
        return compare_hashed_password(result[hashed_password], password)

...
username = login_username.get()
password = login_password.get()
if test_login_data(database, username, password):
    ...
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

noisefloor hat geschrieben: Mittwoch 19. Februar 2025, 11:27 Hallo,

um das konkret zu beantworten muss du uns deine Tabellenstruktur mitteilen.

Gruß, noisefloor

Code: Alles auswählen

import tkinter as tk
import mysql.connector
from tkinter import ttk, Image, image_names, PhotoImage
from PIL import Image,ImageTk
from tkinter import messagebox

def connect():

    conn = mysql.connector.connect(
        host="127.0.0.1",
        user="root",
        password="Password@123",
        database="login",
        port="3306",
        auth_plugin="mysql_native_password")
    c=conn.cursor()

    log = login_entry.get()
    kenn = pass_entry.get()


    c.execute("SELECT * FROM bank")
    result = c.fetchall()

    user = result[username]
    kennwort = result['passwort']

    if(log == user and kennwort == kenn):
        messagebox.showinfo("Erfolgreich", "Du bist eingeloogt")
    else:
        messagebox.showerror("Fail","Fehler ")





    















window = tk.Tk()
window.title("Bank Transfer Panel")
window.geometry("900x900")
window.configure(bg="#fe0016")
bild = Image.open("pic.png")
sparkasse = ImageTk.PhotoImage(bild)

labelbild = tk.Label(image=bild)
labelbild.pack()

frame = tk.Frame(window,bg="white", padx=200,pady=200)
frame.pack(pady=100)

user_info = tk.LabelFrame(frame,text="Login Panel ",font=("arial",18), width=100)
user_info.grid(row=0,column=0)

loginname = tk.Label(user_info,text="Kontoname : ",font=("arial",12) ,padx=20,pady=20)
loginname.grid(row=0,column=0)
passname = tk.Label(user_info,text="Kennwort : ",font=("arial",12) ,padx=20,pady=20)
passname.grid(row=1,column=0)

login_entry = tk.Entry(user_info,width=25)
login_entry.grid(row=0,column=1)
pass_entry = tk.Entry(user_info,width=25)
pass_entry.grid(row=1,column=1)

btn_button = tk.Button(user_info,text="Login", font=("arial",15),width=25,height=1,command=connect)
btn_button.grid(row=2,column=1)






window.mainloop()

TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Sirius3 hat geschrieben: Mittwoch 19. Februar 2025, 11:47 Gut Variablennamen sind wichtig für das Verständnis. Warum nennst Du einen Usernamen `log`? Was ist `c`? Einbuchstabige Namen sind außerhalb eng begrenzter Verwendung selten gut.
If ist keine Funktion, braucht also keine Klammern.
Hast Du Dir mal angeschaut, was der Typ von result ist? Ist das eine Funktion, die man aufrufen kann?

Du hast eine Datenbank, also Nutze diese auch:

Code: Alles auswählen

def test_login_data(database, username, password):
    with contextlib.closing(database.cursor()) as cursor:
        cursor.execute("SELECT hashed_password FROM accounts WHERE username = %s", [username])
        result = cursor.fetchone()
        return compare_hashed_password(result[hashed_password], password)

...
username = login_username.get()
password = login_password.get()
if test_login_data(database, username, password):
    ...

Sorry ich bin neu und versuche nur ein Bisschen Hilfe zu bekommen wenn möglich ist .
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

TorstenVoelker hat geschrieben: Mittwoch 19. Februar 2025, 11:49
Sirius3 hat geschrieben: Mittwoch 19. Februar 2025, 11:47 Gut Variablennamen sind wichtig für das Verständnis. Warum nennst Du einen Usernamen `log`? Was ist `c`? Einbuchstabige Namen sind außerhalb eng begrenzter Verwendung selten gut.
If ist keine Funktion, braucht also keine Klammern.
Hast Du Dir mal angeschaut, was der Typ von result ist? Ist das eine Funktion, die man aufrufen kann?

Du hast eine Datenbank, also Nutze diese auch:

Code: Alles auswählen

def test_login_data(database, username, password):
    with contextlib.closing(database.cursor()) as cursor:
        cursor.execute("SELECT hashed_password FROM accounts WHERE username = %s", [username])
        result = cursor.fetchone()
        return compare_hashed_password(result[hashed_password], password)

...
username = login_username.get()
password = login_password.get()
if test_login_data(database, username, password):
    ...

Sorry ich bin neu und versuche nur ein Bisschen Hilfe zu bekommen wenn möglich ist .

Das Script sieht aber sehr komplex aus .
Am besten ich lese noch weiter mein Buch bevor ich was mit Datenbanken mache.

Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Noch mal: Es macht keinen Sinn in einer lokalen GUI-Anwendung eine Anmeldung zu haben. Die Anwendung kann an alle Daten in der Datenbank heran kommen, also kann das auch der Benutzer der diese Anwendung verwendet, womit diese Prüfung von Zugangsdaten unsinnig ist.

Es macht auch nicht wirklich Sinn mit einer GUI-Anwendung mit Datenbank anzufangen wenn die Grundlagen offenbar noch nicht sitzen. Datentypen, bedingten Ausführung, Schleifen, sind Sachen auf denen Funktionen aufbauen. Klassen, Methoden, objektorientierte Programmierung (OOP) sind Sachen die auf Funktionen aufbauen. GUIs und ereignisorientierte Programmierung bauen auf Klassen und OOP auf. Es macht Sinn das in der Reihenfolge nach und nach zu lernen und nicht gleich mit *allem auf einmal* anzufangen.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo nochmal , ich habe mich jetzt in den Tagen viel mit Python und MySQL beschäftigt und versucht es besser zu machen .

Aber eine Sache finde ich nicht im Buch wie ich zb in der select Abfrage oder eines Update den Wert als variable einbinde in der Abfrage .

Beispiel

Im Eingabefeld habe ich die nenne die mal User = ausgabe.Entry.get() den Wert der jetzt in der variable ist zb Thomas will ich in der MySQL Abfrage einbauen zb select * from Kontakt where Name = dann die variable aber da kommt ein Fehler bzw. funktioniert erst garnicht .

Weiß einer wie ich das umsetzen kann ?
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hat @Sirius3 doch in seinem Post viewtopic.php?p=433107#p433107 gezeigt / verwendet.

Gruß, noisefloor
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Habe es grade selber herausgefunden.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo Ihr Lieben , ich habe bis jetzt alles geschafft mir ein Kontaktbuch zu bauen aber eine Sache versuche ich jetzt hinzubekommen aber ich weiß keine Lösung . Habe schon gegoogelt und bei YouTube wurde ich auch nicht fündig .

Ich habe vor in einer select Abfrage einzelne Elemente eines Users auszugeben .

Also ungefähr so

Mysql f“select * Form Kontakt where User = {User}“
Die variable User kommt von einer entry namens User .

Dann will ich das man zb sagt Max seine Telefonnummer dann die Ausgabe ich wollte es so machen wie in php aber funzt mit Python leider nicht .
Das man
dann in der Abfrage Ebend den User seine einzelne elende anzeigen kann .

Zb Max seine Telefonnummer
Max sein Wohnort

Usw .

Kann mir da einer helfen ?
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zuerst: man formatiert _nie_ SQL-Queries mit f-Strings, weil die dann anfällig mit SQL-Injections sind. _Immer_ die Methoden für die Ersetzung der Python DB API 2.0 nutzen. Du hast danach schon gefragt, ich habe dir den Link auf den Post von Sirius3 gegeben. Warum fragst du, ignorierst die Antwort und machst es dann auch noch schlecht falsch?

Bzgl. des anderen Problems "funzt mit Python leide nicht" ist keine brauchbare Fehlerbeschreibung. Was funzt denn genau nicht? Beim selben Query sollte ja das selber Ergebnis aus der DB zurück kommen. Hast du Probleme, auf die Daten im Rückgabewert der DB zu kommen? Machst du gegen den Query ein `cursor.fetchall()` oder `cursor.fetchone()`? Zeig' doch mal den Code, der nicht funzt.

Abgesehen davon ist es ganz selten eine gute Idee, `SELECT * FROM` zu machen, weil du dann keine Garantie hast, in welcher Reihenfolge die Werte zurück kommen. Was den Zugriff auf das Ergebnis komplizierter als nötig macht. Frag' Felder im gezielt ab. Also z.B. `SELECT wohnort, telefonnummer, whatever FROM kontakt WHERE ...`.

Gruß, noisefloor
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Erstmal Danke für die Antwort.

1 ) Ich habe nichts ignoriert, nur da ich Anfänger bin und mich langsam ran Taste und es immer nach und nach besser wird , kommen trotz immer fragen die nicht alle im Buch stehen .

Programmieren ist wie Autofahren , man lernt in Büchern die Theorie und die Praxis kommt nach und nach und den Weg geht man später eh anders .

Spreche nur aus meiner Erfahrung in PHP . , ich habe auch 2 Jahre gebraucht um damit sehr gut arbeiten zu können .

Nur Python und PHP sind ja 2 verschiedene Welten .

Also zu meinem Problem.

Ich habe ein fetchall gemacht und habe es auch vorher mit select Namen Ort etc. from Kontakt where User = User

Nur wenn ich jetzt von den 3 werten die aus der Datenbank kommen ich eibe ausgeben will zb Thomas sein Wohnort —-> MySQL Ort

In php würde ich zb
Svariable = select …….
$member = mysql_fetch_array(variable)

Dann Ebend die einzelne Elemente auslesen
$menber[ort]
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

bitte den Python-Code zeigen, der nicht funzt. _Alle_ relevanten Zeilen bitte.

Bzgl. der Bücher: es gibt und gab nie wirklich brauchbare Python-Bücher auf deutsch. Die hatten und haben alle mehr oder minder große Fehler. Es gab und gibt ein paar sehr gute englischsprachige Bücher, aber in denen geht es sicher nicht um MySQL und tkinter.

Gruß, noisefloor
Antworten