Problem mit MySQL Abfrage

  • Hallo,

    Ich habe mich aufgrund eines Tipps hier angemeldet und habe eine Frage.

    Folgendes Problem:
    Ich möchte bei einem Suchauftrag einteilen in: Text und Video oder beides (als angezeigte Ergebnise).

    Jetzt ist die bestehende Anfrage schon soweit, dass die Eingabe ($eingabe)
    in den Spalten tags,title, text und url gesucht wird, wenn es einen Treffer gibt: Wird alles ausgeben.

    Das sieht dann so aus:

    PHP
    $resp = mysql_query("SELECT * FROM ".$kategorie." WHERE text like '%".$eingabe."%' OR tags like '%".$eingabe."%' OR titel like '%".$eingabe."%' OR url like '%".$eingabe."%' ORDER BY id DESC") or die (mysql_error());

    Jetzt möchte ich aber einbauen, dass er vorher schon nach Kategorien filtert, also NUR die Einträge hergibt, die auch zur ausgewählten Kategorie (Beispiel: Text) gehören.

    Jetzt denke ich mir: Kann ich ja mit

    PHP
    WHERE typ='text' AND text like ....

    realisieren, aber es geht nicht.

    Der Code sieht nun also so aus:

    PHP
    $resp = mysql_query("SELECT * FROM ".$kategorie." WHERE typ='text' AND text like '%".$eingabe."%' OR tags like '%".$eingabe."%' OR titel like '%".$eingabe."%' OR url like '%".$eingabe."%' ORDER BY id DESC") or die (mysql_error());

    Nun gibt er mir nicht nur die Einträge aus Kategorie "text" aus, sondern alle auf die die Eingabe passt.

    Ich hoffe ich konnte das Problem verständlich beschreiben und finde jemanden der mir hilft, ich habe schon einiges rumprobiert, aber jeder Versuch endete in Lustlosigkeit. :lol:

    Schönen Sonntag noch und schönen Dank.

    2 Mal editiert, zuletzt von Verzweiflung (24. Mai 2009 um 18:40) aus folgendem Grund: Problem gelöst

  • Ich habe nicht hundertprozentig verstanden, was du willst, aber ich glaube, dein Problem lässt sich durch Klammern an der richtigen Stelle lösen.

    Zitat

    $resp = mysql_query("SELECT * FROM ".$kategorie." WHERE typ='text' AND (text like '%".$eingabe."%' OR tags like '%".$eingabe."%' OR titel like '%".$eingabe."%' OR url like '%".$eingabe."%') ORDER BY id DESC") or die (mysql_error());


    Dabei ist "typ='text'" die eine Bedingung, die zutreffen muss, und "text like...or..." die andere.
    Ich hoffe doch, du validierst $eingabe entsprechend vorher und verhinderst evtl auch, dass der Benutzer % eingibt und sich somit alle Einträge rausgeben lässt?

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Hallo,

    Vielen dank für die zügige Antwort.
    Hat alles wunderbar geklappt! :)

    Ja, ich prüfe vorher die Eingabe bzw. lass sie abändern, weil ich die Werte per GET übermittel und habe da folgendes eingebaut:

    PHP
    if($typ == "text"){ $typus = "t";}
    if($typ == "video"){ $typus = "v";}
    if($typ == "both"){ $typus = "v' OR tv='t";}
    if($typ != "text" AND $typ != "video" AND $typ != "both")
    {exit;}

    Danke für die Hilfe!
    Schönen Sonntag noch. ;)

    PS: $eingabe wird auch gefiltert!

    Einmal editiert, zuletzt von Verzweiflung (24. Mai 2009 um 18:47)

  • Hallo,

    Vielen dank für die zügige Antwort.
    Hat alles wunderbar geklappt! :)

    Ja, ich prüfe vorher die Eingabe bzw. lass sie abändern, weil ich die Werte per GET übermittel und habe da folgendes eingebaut:

    PHP
    if($typ == "text"){ $typus = "t";}
    if($typ == "video"){ $typus = "v";}
    if($typ == "both"){ $typus = "v' OR tv='t";}
    if($typ != "text" AND $typ != "video" AND $typ != "both")
    {exit;}

    Danke für die Hilfe!
    Schönen Sonntag noch. ;)

    PS: $eingabe wird auch gefiltert!

    Das könnte man doch auch wunderbar mit einem switch lösen ;)

    Gruß crAzywuLf :D

  • Hi,

    vielen Dank für die Antwort!
    Ja, als Standard werde ich dann "both" nehmen.

    Hat es einen Geschwindigkeitsvorteil wenn ich dies mit dem switch löse? Oder hat dies "nur" einen Übersichtsfaktor?

    Merci,
    Verzweiflung

  • Hat insofern einen Geschwindigkeitsvorteil, als dass der Server bei dir alle vier if-Abfragen abarbeitet, auch wenn die erste schon zutrifft. Ob ein switch schneller wäre als ein else if, kann ich nicht sagen, vermute aber stark, dass ja.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Der Geschindigkeitsunterschied ist minim und eh schlecht messbar.
    Grundsätzlich bevorzuge ich switch-case Anweisungen weil sie a) übersichtlicher sind und b) entweder einen einfacheren Codestil erlauben oder schneller sind. Beispiel:

    vs.

    PHP
    if (get_name_node($input_xml) == 'mike')
      foo();
    elseif (get_name_node($input_xml) == 'john')
      bar();
    elseif (get_name_node($input_xml) == 'cindy')
      bla();

    Nehmen wir an wir parsen ein ganzes XML und suchen darin einen bestimmten Namen. Beim switch-case wird das XML nur einmal geparst, was unter Umständen deutlich schneller ist als beim else-if, wo es 3x geparst wird. Man könnte argumentieren, dass man sowas machen könnte:

    PHP
    $xml_result = get_name_node($input_xml);
    if ($xml_result == 'mike')
      foo();
    elseif ($xml_result == 'john')
      bar();
    elseif ($xml_result == 'cindy')
      bla();

    was dann auch nur einmal ausgeführt wird. Dann hast du aber einfach eine Variable die du nicht brauchst. Ich persöhnlich code so faul wie möglich und mach es dann lieber so wie in der switch-case Anweisung.

  • Okay, vielen Dank für die ausführlichen Erläuterungen, es ist wohl besser wenn ich es wie vorgeschlagen mache- wieder etwas gelernt.

    Großen Dank, dass ihr euch so die Mühe macht, mir zu helfen! Schönen Mittwoch noch. ;)

  • Ich meine, switch ist nicht schneller, das PHP keine Switch-Table erstellt (Vermutung, ist aber auf jeden Fall nicht schneller).
    Dann eben selber Tabelle erstellen:

    PHP
    $types = array('text' => 't', 'video' => 'v')
    $default = "v' OR tv='t";
    $typus = isset($types[$typ] ? $types[$typ] : $default);

    PS:

    PPS:
    Switch scheint sogar das langsamste zu sein. Trotzdem verwende ich es ab und zu. :D
    In PHP muss man sagen:
    -elseif ist genauso übersichtlich
    -elseif nimmt beliebige boolsche Bedingungen
    -elseif spart sich das break, wann kommt es schon vor, dass man das break im case weglässt? Recht selten...
    So ein assoziatives Array hat natürlich den Vorteil, dass die Zuordnungen außerhalb des Programmcodes vorgenommen werden können.

    http://files.the-user.org/switchbench.php
    http://files.the-user.org/switchbench.phps