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.
Benutzeravatar
__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
_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: 17711
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 :)
Benutzeravatar
__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
_verzweifelter_Tim
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.
Benutzeravatar
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
_verzweifelter_Tim
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 ,:)
Benutzeravatar
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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

nickname ist kein Nickname, sondern ein Tuple mit drei Elementen. Und man kann entweder Unpacking benutzen, wie unter Python auch, oder per Index auf die Elemente zugreifen.
_verzweifelter_Tim
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@_verzweifelter_Tim: und wieder, ohne zu wissen, was Du versucht hast, ist es schwierig zu helfen.
_verzweifelter_Tim
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

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()
und mein jetziger html code

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>

Danke für die hilfe
Benutzeravatar
__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
Antworten