stefanw: Suchfunktion funktioniert nicht

Hallo!

Ich habe eine Suchfunktion programmiert, die eine DB auslesen soll, und kontrollieren soll, ob ein bestimmter Eintrag (über Textfeld eingegeben) in der DB existiert.
Folgendes steht in dem Suchscript:

  
$such_str = sprintf('%s', mysql_real_escape_string($_POST['suchen']));  
$abfrage = "SELECT * FROM artikel WHERE artikelname='$such_str'";  
$ergebnis = mysql_query($abfrage);  
  
while($row = mysql_fetch_object($ergebnis))  
 {  
  $row->artikelname;  
 }

Das funktioniert aber leider nicht. Es gibt keine Fehlermeldung, es wird einfach nichts ausgegeben. Ich bin sicher, dass ich in dem Formular einen Eintrag eingegeben habe, der in der DB existiert. Warum funktioniert das nicht? Ich hoffe jemand hat eine Lösung für mein Problem ;)

stefan

  1. Oh mein Gott.
    Ich habe das "echo" vor dem "$row->artikelname" vergessen.
    Es funktioniert jetzt ;)

    1. Oh mein Gott.
      Ich habe das "echo" vor dem "$row->artikelname" vergessen.
      Es funktioniert jetzt ;)

      Performanter wäre es wenn du erstmal alle Ergebisse zusammenkettest und dann ausgibst:

      $v='';

      while(){
       $v.=...
      }

      echo $v;

      1. Hi!

        Performanter wäre es wenn du erstmal alle Ergebisse zusammenkettest und dann ausgibst:

        $v='';

        while(){
        $v.=...
        }

        echo $v;

        Selbst wenn das irgendeinen Laufzeit-Unterschied ergibt, wird die Differenz dermaßen gering, dass es sich nicht lohnt, hier auf Performance zu schauen. Es würde mich sehr wundern, wenn mit der eingesparten Zeit auch nur ansatzweise ein Request mehr behandelt werden kann. Und auch wenn du viele Einsparungen zusammenfasst, wirst du damit keinen Ansturm auffangen können.

        Microoptimierungen sind fast immer nur vergeudete Entwicklungszeit ohne praktischen Nutzen.

        Lo!

        1. Microoptimierungen sind fast immer nur vergeudete Entwicklungszeit ohne praktischen Nutzen.

          Fakt ist doch es schadet nicht und wer sich performante Programmierung angewöhnt bzw. "microptimiert denkt/programmiert", der macht doch nichts Falsch und wenn 100 Skripte optimiert anstatt "langsam" vorhanden sind, dann macht das bei sehr hohen Belastungen sehr wohl was aus. Da bin ich mir sicher. Zumal es einem auch irgendwo ein sichereres Gefühl gibt und man sollte doch soviele Bottlenecks wie möglich vermeiden und ich finde da gibt es keinen Grund nicht bei den Grunddingen anzufangen.

          1. Hi!

            Microoptimierungen sind fast immer nur vergeudete Entwicklungszeit ohne praktischen Nutzen.
            Fakt ist doch es schadet nicht und wer sich performante Programmierung angewöhnt bzw. "microptimiert denkt/programmiert",

            Performant ja, aber nicht höchst performant um jeden Preis. Es ist nämlich nicht immer einfach zu sagen, X ist schneller als Y, denn es kommt auch immer auf den konkreten Fall an. Selbst wenn ein X schneller als ein Y ist, muss das noch lange nicht heißen, dass das bei einer Anzahl Wiederholungen noch genauso ist. Du müsstest also jeden Einzelfall prüfen. Oder zumindest durch viele solcher Prüfungen Erfahrungswerte angesammelt haben. Und mit jeder wesentlichen Version PHPs kannst du von vorn beginnen. Übersichtlich zu programmieren ist viel wichtiger. Und wenn es sich schnell genug anfühlt ist gut, wenn nicht bekommst du mit Microoptimierung nichts gerettet.

            der macht doch nichts Falsch und wenn 100 Skripte optimiert anstatt "langsam" vorhanden sind, dann macht das bei sehr hohen Belastungen sehr wohl was aus.

            Sehr hohe Belastungen zeichnen sich dadurch aus, dass ein Ansturm von vielen Besuchern zu verzeichnen ist. Und für diese sind jeweils vollständige Requests nach vielen Ressourcen und nicht nur nach diesem einen Script abzuarbeiten. Um mehr Requests abarbeiten zu können braucht es garantiert deutlich mehr Reserven als man mit Microoptimierung freibekommt.

            Da bin ich mir sicher. Zumal es einem auch irgendwo ein sichereres Gefühl gibt und man sollte doch soviele Bottlenecks wie möglich vermeiden und ich finde da gibt es keinen Grund nicht bei den Grunddingen anzufangen.

            Bottlenecks sind starke Verengungen. Mit Microoptimierung bekommt man die nicht wesentlich geweitet. Deswegen würde ich Microoptimierung nicht als Grundding bezeichnen.

            Lo!

            1. Performant ja, aber nicht höchst performant um jeden Preis. Es ist nämlich nicht immer einfach zu sagen, X ist schneller als Y, denn es kommt auch immer auf den konkreten Fall an. Selbst wenn ein X schneller als ein Y ist, muss das noch lange nicht heißen, dass das bei einer Anzahl Wiederholungen noch genauso ist. Du müsstest also jeden Einzelfall prüfen. Oder zumindest durch viele solcher Prüfungen Erfahrungswerte angesammelt haben. Und mit jeder wesentlichen Version PHPs kannst du von vorn beginnen. Übersichtlich zu programmieren ist viel wichtiger. Und wenn es sich schnell genug anfühlt ist gut, wenn nicht bekommst du mit Microoptimierung nichts gerettet.

              Da gebe ich dir wohl Recht.

              Sehr hohe Belastungen zeichnen sich dadurch aus, dass ein Ansturm von vielen Besuchern zu verzeichnen ist. Und für diese sind jeweils vollständige Requests nach vielen Ressourcen und nicht nur nach diesem einen Script abzuarbeiten. Um mehr Requests abarbeiten zu können braucht es garantiert deutlich mehr Reserven als man mit Microoptimierung freibekommt.

              Das ist auch klar, natürlich. Mir ging es auch nur darum das man sich trotzdem um jedes Skript Gedanken machen sollte. Das man mit Microoptimierungen keine Seiten rettet ist klar. Bottlenecks liegen da garantiert woanders.

              Deswegen würde ich Microoptimierung nicht als Grundding bezeichnen.

              Sondern als? : ) Wie Gesagt mir ging es mehr darum den Threadersteller dazu aufzufordern über seine Vorgehensweise nachzudenken ;)

              Einen schönen Sonntag noch!

      2. Ja, die eine Ausgabe war auch nur für Testzwecke ;)

        Jetzt habe ich aber noch eine Frage:
        Ich kann mit meiner Suche die Datenbank nur "genau" suchen, also wenn ich z.B. "DVD" eingebe, kommen nur Ergebnisse aus der Datenbank, die genau "DVD" heißen. Ich möchte aber auch Ergebnisse ausgeben, die z.B. "DVD-Brenner" heißen, also das Suchwort nur beinhalten. Wie kann ich das verwirklichen?

        stefan

        Ps.: Danke schonmal für die schnelle Hilfe

        1. Ich kann mit meiner Suche die Datenbank nur "genau" suchen, also wenn ich z.B. "DVD" eingebe, kommen nur Ergebnisse aus der Datenbank, die genau "DVD" heißen. Ich möchte aber auch Ergebnisse ausgeben, die z.B. "DVD-Brenner" heißen, also das Suchwort nur beinhalten. Wie kann ich das verwirklichen?

          Da gibt es viele Möglichkeiten.

          Je nach DBMS LIKE und ILIKE.
          Bei LIKE wird Groß- und Kleinschreibung beachtet, bei ILIKE nicht (So ist es bei PostgreSQL, für MySQL gibt es sowas auch).

          Von (I)LIKE ist allerdings abzuraten da es langsam ist.

          Ich gebe dir mal ein Stichwort: Volltextsuche

          Liebe Grüße,
          Philipp Zentner

          1. Hi.

            Je nach DBMS LIKE und ILIKE.

            Falls deine Datenbank klein genug ist um diese Methode zu nutzen, könntest du dich auch noch mit Wildcards (%) auseinandersetzen.

          2. Hi!

            Bei LIKE wird Groß- und Kleinschreibung beachtet, bei ILIKE nicht (So ist es bei PostgreSQL, für MySQL gibt es sowas auch).

            MySQL kennt kein ILIKE, stattdessen wird von Haus aus nicht nach Groß-/Kleinschreibung unterschieden. Wenn man das möchte, muss man entweder eine binary Collation verwenden oder den BINARY-Operator.

            Lo!

            1. Hi!

              Bei LIKE wird Groß- und Kleinschreibung beachtet, bei ILIKE nicht (So ist es bei PostgreSQL, für MySQL gibt es sowas auch).

              MySQL kennt kein ILIKE, stattdessen wird von Haus aus nicht nach Groß-/Kleinschreibung unterschieden. Wenn man das möchte, muss man entweder eine binary Collation verwenden oder den BINARY-Operator.

              Richtig, deshalb sagte ich ja das es so bei PostgreSQL ist. Bei MySQL gibt es halt eine Alternative. Habe das vielleicht zu unklar ausgedrückt mit "für MySQL gibt es sowas auch".

  2. Hi!

    $such_str = sprintf('%s', mysql_real_escape_string($_POST['suchen']));
    $abfrage = "SELECT * FROM artikel WHERE artikelname='$such_str'";

    Das ist ziemlich umständlich. sprintf() ist eine Funktion, um in einem String mit Platzhaltern selbige durch Text zu ersetzen. Wenn der String nur aus dem Platzhalter besteht, ist das Ergebnis das selbe wie der zweite sprintf()-Parameter. Eine sinnvolle Anwendung sähe so aus:

    $abfrage = sprintf("SELECT * FROM artikel WHERE artikelname='%s'", mysql_real_escape_string($_POST['suchen']));

    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
      $row->artikelname;
    Das funktioniert aber leider nicht. Es gibt keine Fehlermeldung, es wird einfach nichts ausgegeben. Ich bin sicher, dass ich in dem Formular einen Eintrag eingegeben habe, der in der DB existiert. Warum funktioniert das nicht?

    "Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Du erwartest ein Ergebnis. Also musst du übergpüfen ob das, was dir die verwendeten Funktionen zurückgeben, dem entspricht, was üblicherweise bei einem Ergebnis rauskommt. Dazu solltest du auch im PHP-Handbuch nachschauen, was die Funktionen in welchem Fall so von sich geben. Und das solltest du kontrollieren. Kontrollausgaben können am aussagekräftigsten mit var_dump() erstellt werden.

    Was also ist das Ergebnis von mysql_query()? (Was steht in $ergebnis?)
    Was ist das Ergebnis von mysql_fetch_object()? (Was steht in $row?)

    Und was bedeuten diese beiden Ergebnisse gemäß der Erläuterung im PHP-Handbuch?

    Lo!