Suchfunktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
_verzweifelter_Tim
User
Beiträge: 8
Registriert: Sonntag 27. Januar 2019, 18:12

Hallo alle zusammen,

ich habe zurzeit in der Schule ein Projekt am laufen, indem ich und ein Kumpel ein Website für unsere Schule, mithilfe von Python und Html Dokumenten erstellen müssen.
Unsere Aufgabe ist es eine Suchfunktion zu erstellen in dem man nach bestimmten Schüler (nach einer Html Eingabe) in einer Datenbank suchen kann und diese dann ausgegeben werden. Wir haben es hinbekommen ein einzelnen Schüler ausgeben zu lassen, jedoch wollen wir wenn wir z.b in die html such leiste Eingeben [Lisa], sollen alle Schüler mit dem Namen Lisa angezeigt werden+ die weiteren Daten aus der Datenbank wie "Nachname", "Interesse" usw. Wir versuchen dieses Suchfunktion schon seid einigen Wochen hin zu bekommen, jedoch bekommen wir es nicht gebacken. Hätte einer von euch eine Idee wie man Dies hin bekommt oder wie der Code aussehen müsste. Wir benutzen die Programme XAMPP und JetBRains PyCharm.

So sieht unser Code im Dokument App.py aus:


@app.route('/Suchen', methods = ['POST'])
def Suchen():
try:

conn = mysql.connect()
cursor = conn.cursor()

Suchen = request.form['inputSuche']
if len(Suchen) > 0:

cursor.execute('SELECT count(*) FROM schueler WHERE Name = (%s) OR Nickname = (%s) OR Vorname = (%s);', (Suchen, Suchen, Suchen))

result = list(cursor.fetchone())

ergebnis = result[0]

if ergebnis == 0:

return render_template('suche.html', ausgabe='Es gibt keinen Schüler mit diesem Namen DU DUMMKOPF')
else:
cursor.execute('SELECT * FROM `schueler` WHERE Name = (%s) OR Nickname =(%s) OR Vorname = (%s);', (Suchen, Suchen, Suchen))
result = list(cursor.fetchone())
nickname, vorname, nachname, interessen = result[18], result[17], result[16], result[22]
email = ""

if result[19] > 0:
email = result[12]

return render_template('Suchen.html', nickname=nickname, vorname=vorname, name=nachname, email=email, interessen=interessen)
else:
return render_template('Suchen.html', nickname=nickname, vorname=vorname, name=nachname, interessen=interessen)


else:
render_template('suche.html', ausgabe='Geben Sie einen Namen ein')

finally:
cursor.close()
conn.close()

Mit freundlichen Grüßen

Tim
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Wie sieht denn die Struktur der Datenbank aus? Welche Tabellen gibt es und wie sind die aufgebaut?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was funktioniert denn nicht? Bekommt ihr nie ein Ergebnis? Bekommt ihr falsches Ergebnisse? ...?
Bekommt ihr überhaupt je die Eingabemaske für die Suche zu sehen? Dürfte nicht, weil GET auf der Route nicht zugelassen ist. Normalerweise macht man das so, dass beim GET-Request die HTML-Seite mit dem Formular zurück geliefert wird und bei POST die Suchergebnisse.

Das nächste Mal bitte den Code in eine Code-Block setzen, den bekommt man, wenn man im Editor auf die </> Schaltfläche klickt. Dann bleiben auch die Einrückung erhalten und der Code ist lesbarer.

Die Antwort bei einer nicht-erfolgreichen Suche wollt ihr nicht wirklich so lassen, oder? Die hat aktuell einen akuten Mangel an sozialverträglicher Kommunikation. Und "lustig" ist das auch nicht.

Je nach dem, wie weit das Projekt geführt werden soll, macht es IMHO Sinn, direkt ein ORM für die Datenbankanbindung zu nutzen, also SQLAlchemy oder PeeWeee. Oder direkt ein Webframework wie Django, wo alles all-in-one ist.

Last but not least: Wenn ihr die DB mit realen Schülerdaten füllt, dann müsst ihr euch mal mit der DSGVO beschäftigen. Schulprojekt hin oder her, ist heutzutage nun mal (leider?) so.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vielleicht auch an die Impressumspflicht denken, dann überlegt man es sich eventuell besser ob/wen das Programm beleidigt, wenn die Leute wissen wo sie den Verantwortlichen finden. :twisted:

Und was meinst Du mit ”heutzutage”? Durch die DSGVO hat sich eigentlich fast nichts geändert, die Rechte bezüglich Datenverarbeitung waren vorher nahezu gleich. Man ist jetzt eigentlich nur dazu gezwungen sich an Gesetze zu halten die es schon seit Jahrzehnten gibt, weil's jetzt deutlich mehr wehtut wenn man sie weiterhin ignoriert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Und was meinst Du mit ”heutzutage”?
Genau das, was du sagst:
Man ist jetzt eigentlich nur dazu gezwungen sich an Gesetze zu halten die es schon seit Jahrzehnten gibt, weil's jetzt deutlich mehr wehtut wenn man sie weiterhin ignoriert.
Wobei die Umsetzung der DSGVO bzw. das Einholen der Einwilligung zum Speichern von persönlichen Daten IMHO ja wohl Sache des Lehrers / des Schulleiters ist. Bzw. vielleicht gibt's ja schon eine gültige Regelung, weil die Schule ein FB Seite mit Schülernamen oder so wasin der Richtung hat.

Gruß, noisefloor
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

noisefloor hat geschrieben: Sonntag 27. Januar 2019, 21:39 Bzw. vielleicht gibt's ja schon eine gültige Regelung, weil die Schule ein FB Seite mit Schülernamen oder so wasin der Richtung hat.
Im Umgang mit Schülerdaten gelten i.d.R. noch mal strengere Regeln. Zumindest im Prä-Facebook Zeitalter war es dahet nach meiner Erfahrung so, dass die Schulen (gerade bei minderjährigen Kindern) beim Datenschutz sehr vorsichtig waren und für alles Mögliche, was die persönlichen Daten der Schüler betraf, die schriftliche Einverständniserklärung der Eltern eingeholt haben. Insofern würde mich das eher wundern, wenn die Datenbank mit echten Daten befüllt wird oder es eine Facebook Seite mit den Namen aller Schüler gäbe.
Zuletzt geändert von nezzcarth am Sonntag 27. Januar 2019, 22:46, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@_verzweifelter_Tim: der Code hat eindeutig zu viele Leerzeilen, als dass das noch lesbar wäre.
Bei einem Verbindungsfehler ist `cursor` nicht definiert und fliegt im finally-Block mit einem NameError auf die Nase.
Statt zweimal die Suche durchzuführen und beim ersten Mal nur die Anzahl abzufragen, würde man besser gleich die richtigen Daten holen und falls die Ergebnissmenge leer ist, weiß man ja auch, dass da kein Ergebnis war.
`fetchone` liefert übrigens ein Tuple, da ist es unnötig, das in eine Liste umzuwandeln.
Benutze niemals SELECT *, sondern gib konkret die Feldnamen an, die Du eigentlich willst, dann muß man auch nicht wissen, dass in Feldnummer 22 irgendwas steht (Eine Tabelle mit so vielen Feldern ist nicht wirklich gut).
Und wenn Du mehr als ein Ergebnis anzeigen willst, dann frag auch mehr als ein Ergebnis ab (fetchall / fetchmany) und schreib Dein Template so, dass es mit einer Liste umgehen kann.

Code: Alles auswählen

anfrage = request.form['inputSuche']
if not anfrage:
    return render_template('suche.html', ausgabe='Geben Sie einen Namen ein')
cursor.execute('SELECT nickname, vorname, nachname, interessen, email FROM `schueler` WHERE Name = (%s) OR Nickname =(%s) OR Vorname = (%s);', (anfrage, anfrage, anfrage))
ergebnisse = cursor.fetchall()
if not ergebnisse:
    return render_template('suche.html', ausgabe='Es gibt keinen Schüler mit diesem Namen')
return render_template('Suchen.html', ergebnisse=ergebnisse)
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Die Regelungen von der Schule werden sicher nicht einfach auf irgendwelche Schülerprojekte übertragbar sein, denn das ist ja nicht zwingend für den Schulbetrieb nötig.

Und ich denke mal von Seiten der Schule gibt es auch nicht die Pflicht sich eine Genehmigung von den Eltern zu holen, zumindest nicht wenn sie mit den Daten nicht irgend etwas machen wollen was über das hinaus geht was notwendig für den Schulbetrieb ist. Die werden zumindest für diesen notwendigen Grundteil wahrscheinlich einfach nur Informationspflichten haben, also die Betroffenen oder deren Vormund darüber zu informieren was, wie lange gespeichert ist, und das der Informierte Rechte auf Einsicht, Korrektur, und eventuell Löschung hat. Denn wenn man widersprechen würde, könnte man das Kind ja nicht auf diese Schule schicken. Da Schulpflicht besteht, muss man ja irgendeiner Schule die Erlaubnis geben.

Gerade bei so einem Schulprojekt würde ich bei diesem Thema nicht „leider“ sagen, denn das ist nicht nur eine Gelegenheit sich als Datenverarbeiter mit der DSGVO auseinanderzusetzen, sondern da können die Schüler auch gleich mal über ihre Rechte aufgeklärt werden, die sie gegenüber den Leuten haben, die ihre persönlichen Daten verarbeiten wollen.

Da stelle ich mir übrigens gerade die Frage welche Rechte man als nicht-volljähriger Schüler eigentlich *selbst* in dem Bereich hat‽ Kann man die Schule beispielsweise um eine Auskunft nach DSGVO ersuchen, oder müssen das die Eltern machen? Ich fand es damals beispielsweise interessant was so alles in meiner Schulakte stand, die ich mit 18 mal zu sehen verlangt habe. Da waren Bemerkungen/Notizen bis hin zur Grundschule über mich drin. Bis zu dem Zeitpunkt war mir gar nicht so wirklich bewusst das man nach einem Schulwechsel als Schüler nichts über die Lehrer weiss, die aber Informationen von Grundschullehrern über einen hatten.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@__blackjack__; ich habe ja schulpflichtige Kinder. Für beide kam für jede Schule direkt zu Anfang ein (kurzer) Fragebogen an die Eltern, ob man Bilder und Namensnennung bei FB zustimmt oder nicht. Webseiten, wo Schüler mit Bild oder Name veröffentlicht sind, haben die Schulen nicht.

Es dem Ausgangspost des TE geht nicht wirklich hervor, von wo die Webseite erreichbar ist - Intranet der Schule, Internet mit vorgeschaltetem Login, oder öffentliches Internet. Macht denke ich auch noch einen Unterschied, in welchem Umfang man eine Zustimmung braucht (oder nicht).

@_verzweifelter_Tim : das soll dich und deinen Kumpel nicht davon abhalten, das Projekt weiter zu entwickeln. Testen kann man ja mit rein fiktiven Namen. Nur bevor ihr "live" geht, sollten ihr den Punkt Datenschutz auf jeden Fall mit dem Lehrer, der euch betreut, durchsprechen. Schon alleine deswegen, damit ihr für euch Klarheit habt, wenn "eure" Datenbank Daten von anderen Schülern speichert.

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ein minimales Beispiel zur Unterscheidung GET - POST mit Suchmaske:

Code: Alles auswählen

from flask import Flask, request, render_template_string

search_form = '''<form target="/" method="POST">
<input type="text" name="search_term">
<input type="submit" value="Senden">
</form>'''

result = '<p>Der Suchbegriff ist: {{ search_term }}.<p>'

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def search():
    if request.method == 'GET':
        return render_template_string(search_form)
    else:
        search_term = request.form['search_term']
        return render_template_string(result, search_term=search_term)
Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Man braucht eigentlich immer eine Zustimmung/muss informieren, egal wo die Daten verfügbar sind.

Edit: Kann die Schule denn überhaupt für FB irgendwelche Aussagen treffen? Man muss den Leuten doch sagen was mit den Daten passiert. Was FB mit den Daten macht, weiss man doch aber gar nicht. Und wirklich löschen kann man Daten dort auch nie wieder.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@__blackjack__: es ging darum, dass die Schule Daten auf der FB Seite des Schule veröffentlichen darf (oder nicht). Was FB macht ist in der Tat außerhalb der Kontrolle der Schule. Zu der FB Seite der weiterführenden Schule, wo mein älterer Sohn hingeht, war AFAIR auch noch aufgeführt, wer (also welcher Lehrer) überhaupt Sachen auf der FB einstellen darf.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Eben weil das ausserhalb der Kontrolle der Schule ist dürfen die das grundsätzlich nicht, würde ich mal sagen. Auch nicht mit Einwilligung, denn sie sind ja verpflichtet sagen zu können was mit den Daten dann passiert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Im Schulbereich gelten wie gesagt nicht nur allgemeine Datenschutzregelungen wie die DSGVO, sondern darüber hinaus weitere Verordnungen/Dienstvorschriften, etc. die jeweils auf Länderebene verankert und verschiedenen sind. Und diese sind im Allgemeinen noch Mal strenger, als die allgemeinen Datenschutzvorgaben. Natürlich dürfen Daten, die zur Durchführung eines geordneten Schulbetriebs notwendig sind, verarbeitet werden. Bei allem, was darüber hinaus geht, wird es aber schon kritischer.

Bei Interesse hier Mal beispielhaft entsprechende Infos für BW und NRW:
https://lehrerfortbildung-bw.de/st_rech ... neu/daten/

https://www.schulministerium.nrw.de/doc ... index.html

Und was Facebook angeht, sollte man bedenken, dass WhatsApp-Gruppen ja, egal ob Schule, Kindergarten oder Sportverein, das Hauptkommunikationsmittel unter Eltern sind. Über diesen Umweg ist Facebook wohl eh nicht mehr so schnell an Schulen zu vermeiden.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: zur Thematik POST / GET: Suchanfragen ändern nichts an den Daten, so dass POST eigentlich falsch ist, also immer GET, mit und ohne Suchbegriff.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Wobei man noch überlegen müsste ob man möchte das Suchbegriffe im Browserverlauf landen und verlinkbar sind.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
_verzweifelter_Tim
User
Beiträge: 8
Registriert: Sonntag 27. Januar 2019, 18:12

Sirius3 hat geschrieben: Sonntag 27. Januar 2019, 22:21 @_verzweifelter_Tim: der Code hat eindeutig zu viele Leerzeilen, als dass das noch lesbar wäre.
Bei einem Verbindungsfehler ist `cursor` nicht definiert und fliegt im finally-Block mit einem NameError auf die Nase.
Statt zweimal die Suche durchzuführen und beim ersten Mal nur die Anzahl abzufragen, würde man besser gleich die richtigen Daten holen und falls die Ergebnissmenge leer ist, weiß man ja auch, dass da kein Ergebnis war.
`fetchone` liefert übrigens ein Tuple, da ist es unnötig, das in eine Liste umzuwandeln.
Benutze niemals SELECT *, sondern gib konkret die Feldnamen an, die Du eigentlich willst, dann muß man auch nicht wissen, dass in Feldnummer 22 irgendwas steht (Eine Tabelle mit so vielen Feldern ist nicht wirklich gut).
Und wenn Du mehr als ein Ergebnis anzeigen willst, dann frag auch mehr als ein Ergebnis ab (fetchall / fetchmany) und schreib Dein Template so, dass es mit einer Liste umgehen kann.

Code: Alles auswählen

anfrage = request.form['inputSuche']
if not anfrage:
    return render_template('suche.html', ausgabe='Geben Sie einen Namen ein')
cursor.execute('SELECT nickname, vorname, nachname, interessen, email FROM `schueler` WHERE Name = (%s) OR Nickname =(%s) OR Vorname = (%s);', (anfrage, anfrage, anfrage))
ergebnisse = cursor.fetchall()
if not ergebnisse:
    return render_template('suche.html', ausgabe='Es gibt keinen Schüler mit diesem Namen')
return render_template('Suchen.html', ergebnisse=ergebnisse)
Bin mir nicht sicher ob das hier die Antwortfunktion ist ,:). Danke dir für die Antwort, wir konnten es jetzt in unsere Code einfügen und es funktioniert :D Kann man diese Ausgabe so einstellen das man den nickname, vorname, und name einzelnt ausgeben kann. (Also das ich es in einer schönen ansicht in html zuordnen kann. Zurzeit wird es so ausgegeben. (("Name", "...", "...")) <--- also mit so paar komms die ich nicht anzeigen lassen möchte.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zeig bitte, welchen Code du hast, dann kann man dir helfen.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, indem Du im Template auf die Elemente des Tuples zugreifst. Da Du das Template aber bisher nicht geziegt hast, kann man da auch nicht mehr helfen.
_verzweifelter_Tim
User
Beiträge: 8
Registriert: Sonntag 27. Januar 2019, 18:12

Hi, also unser Python Code sieht so aus:

Code: Alles auswählen

@app.route('/Suchen', methods = ['POST'])
def Suchen():
    try:
        # My SQL Verbidnung Aufbauen
        conn = mysql.connect()
        cursor = conn.cursor()

        anfrage = request.form['inputSuche']
        if not anfrage:
            return render_template('suche.html', ausgabe='Geben Sie einen Namen ein')
            #Durch diese Abfrage kommt die Anzahl aller Nutzer mit dem eigegebenen Nickname, im besten Fall 0>
        cursor.execute(
                'SELECT nickname, vorname, name FROM `schueler` WHERE Name = (%s) OR Nickname =(%s) OR Vorname = (%s);',
                (anfrage, anfrage, anfrage))
            #Denk daran fetchone = nur ein Datensatz, fetchall = alle mit dem Nickname
        ergebnisse = cursor.fetchall()

             #hier wird überprüft ob überhaupt ein Nutzer gefunden  wurde
        if not ergebnisse:

            return render_template('suche.html', ausgabe='Es gibt keinen Schüler mit diesem Namen')
        return render_template('Suchen.html', ergebnisse=ergebnisse)



    finally:
        cursor.close()
        conn.close()
und unser html code sieht so aus

Code: Alles auswählen

 {% extends 'layout.html'%}

{% block body%}


<div>
<h1>Suchergebnis:</h1>
    <h5><font color="red">{{ ausgabe }}</font></h5>
{{ ergebnisse }}  
-----------------------------------------So wird des Ausgegeben: (('', 'Unbekannt', 'Unbeaknnt'), ('', 'Unbekannt1', 'Unbekannt_Nachnaem'))---------------
----------------------------------- Ganz gut wäre es wenn man die Einzelnen Werte so ausgeben könnte wir hier unten------------------------------------
<table>
	<tr>
		<td width="20%">Nickname:</td>
		<td>{{ nickname }}</td>
	</tr>
	<tr>
		<td>Vorname:</td>
		<td>{{ vorname }}</td>
	</tr>
	<tr>
		<td>Nachname:</td>
		<td>{{ name }}</td>
	</tr>

------------------------------Also das bei nickname, der Nickname erscheint und bei Name die Namen usw.------------------------


</table>

</div>
{% endblock %} [code]

danke nochmals das Ihr uns hilft :)
Antworten