Suchfunktion
- __blackjack__
- User
- Beiträge: 13004
- 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
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
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 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.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)
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
Hi, also unser Python Code sieht so aus:
und unser html 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()
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 :)
- __blackjack__
- User
- Beiträge: 13004
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@_verzweifelter_Tim: Na dann schreibt da nicht einfach ``{{ ergebnisse }}`` sondern schaut Euch in der Dokumentation an wie man im Template eine Schleife drüber schreibt, so dass man dann auch die HTML-Tabelle erstellen/füllen kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
Hi black jack. Wir haben die Dokumentation nun öfters angeschaut und haben es versucht. Jedoch haben wir es leider nicht hinbekommen alle Ausgaben einzeln auszugeben. Falls du weißt wie es funktioniert, wäre es möglich das du unseren Code so veränderst das es Funktion? Das wehre sehr freundlich. Danke schon mal in vor raus.
- noisefloor
- User
- Beiträge: 3843
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Jinja2, die Template Engine von Flask, kennt `for` Schleifen, womit du über etwas iterierbares - wie bei dir `ergebnisse` - Iterieren kannst. Das funktioniert genau so wie in Python. Du musst halt nur die Syntax-Regeln von Jinja2 einhalten.
Doku: http://jinja.pocoo.org/docs/2.10/templates/
Auf der Seite gibt es auch eine Sektion zu `for`, wobei im allerersten Beispiel schon gezeigt ist, wie das geht.
Gruß, noisefloor
Jinja2, die Template Engine von Flask, kennt `for` Schleifen, womit du über etwas iterierbares - wie bei dir `ergebnisse` - Iterieren kannst. Das funktioniert genau so wie in Python. Du musst halt nur die Syntax-Regeln von Jinja2 einhalten.
Doku: http://jinja.pocoo.org/docs/2.10/templates/
Auf der Seite gibt es auch eine Sektion zu `for`, wobei im allerersten Beispiel schon gezeigt ist, wie das geht.
Gruß, noisefloor
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
Wir haben es hinbekommen die Daten alle untereinander anzeigen zu lasse, wir sind leider noch zu doof um es einzeln anzeigen lassen zu können. Wir sind die Jinja Dokumentation öfters durch gegangen und haben es immer irgendwie anders versucht jedoch bekommen wir es nicht hin
Code: Alles auswählen
{% for nickname in ergebnisse %}
<li>{% block loop_nickname scoped %}{{ nickname }}{% endblock %}</li>
{% endfor %}
[code]
Des ist das was wir bisher haben
Hier bei wird es alles untereinander aufgelistet aber die Kommas und "" sind leider immer noch da.
Danke nochmals das Ihr uns versucht dabei zu helfen. Ich hätte früher in diesem Forum schreiben sollen, dann hätte ich mir über einem Monat arbeit sparen können ,:)
- noisefloor
- User
- Beiträge: 3843
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
`ergebnisse` ist eine Liste von Listen. Heißt: `nickname` ist immer noch eine Liste. Auf die Elemente kannst du per Indexzugriff zugreifen.
Gruß, noisefloor
`ergebnisse` ist eine Liste von Listen. Heißt: `nickname` ist immer noch eine Liste. Auf die Elemente kannst du per Indexzugriff zugreifen.
Gruß, noisefloor
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
Hallo noisefloor und sirius,
ich habe nach dem Indexzugriff recherchiert aber leider nichts passendes gefunden und das mit dem unpacking habe ich auch schonmal ausprobiert, habe dies aber leider auch nicht hinbekommen. Ich bin zurzeit ziemlich unter Zeitdruck weil wir schon bald mit dem programmieren fertig sein müssen und unbedingt die Suchfunktion noch richtig hinbekommen wollen. Es wäre super nett wenn einer sich die Zeit nehmen würde und unseren Code so abändern könnte, dass dies funktioniert. Uns fehlen jegliche Grundkenntnisse, welche uns das programmieren erschwert.
Danke nochmals.
ich habe nach dem Indexzugriff recherchiert aber leider nichts passendes gefunden und das mit dem unpacking habe ich auch schonmal ausprobiert, habe dies aber leider auch nicht hinbekommen. Ich bin zurzeit ziemlich unter Zeitdruck weil wir schon bald mit dem programmieren fertig sein müssen und unbedingt die Suchfunktion noch richtig hinbekommen wollen. Es wäre super nett wenn einer sich die Zeit nehmen würde und unseren Code so abändern könnte, dass dies funktioniert. Uns fehlen jegliche Grundkenntnisse, welche uns das programmieren erschwert.
Danke nochmals.
-
- User
- Beiträge: 8
- Registriert: Sonntag 27. Januar 2019, 18:12
Ich möchte versuchen das die Daten Nickname, Vorname und Name nicht in einer Liste ausgegeben werden sondern das ich alles einzeln ausgeben kann. Also im prinzip das ich die Werte aus einer Liste herausnehme und sie dann einzeln ausgeben kann. statt das ich in html {{ergebnisse}} schreibe möchte ich es so ausgeben lassen {{Nickname}}{{Vorname}}{{Name}}. Bei der Abfrage sollen trotzdem alle schüler angezeigt werden die halt einen bestimmten namen bzw. nickname oder vorname haben.
Hier sind nochmals mein Python code
und mein jetziger html code
Danke für die hilfe
Hier sind nochmals mein Python code
Code: Alles auswählen
@app.route('/Suchennn', methods = ['POST'])
def Suchennn():
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 = list(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()
Code: Alles auswählen
<div>
<h1>Suchergebnis:</h1>
<h5><font color="red">{{ ausgabe }}</font></h5>
{{ ergebnisse }}
<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>
</table>
</div>
- __blackjack__
- User
- Beiträge: 13004
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@_verzweifelter_Tim: Die Jinja-Dokumentation wurde ja bereits verlinkt. Und ``for`` wurde ja auch schon erwähnt. Und die Dokumentation hat da auch Beispiele. Und das mit dem ``for`` funktioniert in den Templates fast genau so wie in Python selbst, also insbesondere das „tuple unpacking“. Was in der Jinja2-Doku auch als Beispiel zu sehen ist. So ein bisschen mitdenken, ausprobieren, und verstehen müsst ihr schon selbst. Das kann euch keiner abnehmen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis