MySQL suchfunktion

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Joe-Waschl
User
Beiträge: 20
Registriert: Freitag 12. November 2010, 20:18

hi all,

habe leider ein kleines problem und komm nicht weiter. :roll:
Ich habe mir ein kleins Programm geschireben mit dem ich
die Adressen verwalten kann, klappt soweit auch alles,
nur die Such funktion klappt nicht, ich komm nicht drauf wie
ich einen Bolschen wert, also True oder False zurück bekomme.

Code: Alles auswählen

def suchen(db):
    print 'Nr./Name/Nachname/Straße/PLZ/Ort/Telefonnr./Handy/Email/Geburtstag(JJJJ-MM-TT)/'
    frage = raw_input('Nach was Suchen?: ')
    eingabe = raw_input('Bitte eingeben: ')
    cur = db.cursor()
    befehl = cur.execute("SELECT * FROM Anschrift WHERE %s = %s", (frage, eingabe))
    if befehl == True:
        print 'vorhanden'
    else:
        print 'nicht vorhanden'
        
Gruß und Dank

Joe
BlackJack

@Joe-Waschl: Zum einen bekommst Du von `execute()` keinen Wahrheitswert zurück. Du könntest mit `fetchone()` schauen ob Du ein Ergebnis vom Cursor-Objekt bekommst. Wenn ja, dann gab es mindestens diesen einen Treffer, wenn nicht, dann gab es keine Treffer.

Zum anderen kann das so nicht funktionieren, weil die Platzhalter im SQL-Ausdruck nur für *Werte* aber nicht für *Namen* oder andere SQL-Bestandteile gedacht sind. Den Namen müsstest Du also schon per Zeichenkettenformatierung in den SQL-Ausdruck formatieren. Da SQL-Ausdrücke selbst zusammen setzen potentiell gefährlich ist, muss man mindestens darauf achten, dass der Benutzer diese Teile nicht selber eingeben kann, und das sie auch sonst nicht auf unsichere Weise in das Programm gelangen. In diesem Fall dürfte man den Benutzer zum Beispiel keinen Spaltennamen angeben lassen, sondern ihn höchstens aus vorgegebenen Namen auswählen lassen.

`befehl` ist ein unpassender Name. Selbst wenn da der von Dir erwartete Wahrheitswert hinter stecken würde, passt dieser Name da überhaupt nicht zu.

Vergleiche mit literalen `True` und `False` sind in aller Regel sinnfrei. Bei dem Vergleichsausdruck kommt doch sowieso nur wieder der gleiche Wahrheitswert oder das Gegenteil davon heraus. Für die Negierung gibt es ``not`` und ansonsten reicht der ursprüngliche Wert in der Bedingung vollkommen aus.

Ich persönlich bevorzuge SQLAlchemy um mit SQL-Datenbanken zu arbeiten. Selbst wenn man den ORM-Teil von der Bibliothek nicht verwendet, lassen sich damit Anfragen schöner und sicherer programmatisch aufbauen als mit SQL-Ausdrücken in Zeichenketten.
Joe-Waschl
User
Beiträge: 20
Registriert: Freitag 12. November 2010, 20:18

Danke dir für die schnelle antwort, werds heut abend bzw morgen gleich
ausprobieren. 8)
gruß joe
Antworten