Suchproblem per Select

  • Hallo,

    ich grübel schon die ganze Zeit und habe mal ne Frage bezüglich einen Suchscriptes an dem ich gerade arbeite.

    Ich versuche es mal zu schildern.

    Also ich habe 4 Variablen, die ich per $_Post übergebe um in der Datenbank die Treffen zu finden.

    A, B, C, D
    (Diese werden per Drobdown aus dem Formular ausgewählt, ursprung ist die DB selbst)

    Der Aufbau sieht dann so aus:

    PHP
    $abfrage = "SELECT * FROM objekte where A like '$A' AND B like '$B' AND C like '$C' AND D like '$D' LIMIT $start, $eintraege_pro_seite";

    Nun verhält es sich ja so, dass alle Variablen angegeben werden müssen, damit die Bedingung erfüllt ist und ein Ergebnis erscheint.

    Nun möchte ich aber erreichen, dass auch nur 1, oder, 2, oder 3 Variablen abgefragt werden können und mir dennoch ein Ergebniss angezeigt wird.

    Mit OR bringt es mir nix, da er dann bei 2 Variablen nicht mehr das gewünschte Ergebniss anzeigt, da die Variablen ja interdependent bleiben sollen.

    Nun könnte ich ja per Ausschlußverfahren mit if(!empty($B.... alle Möglichkeiten aufheben, doch das lässt das Script doch nur ins uferlose aufblähen.

    Hat jemand für mich mal ein schlanke Lösung parat, komme nicht so recht weiter?

    Dank.

  • Die Dropdowns im Formular deklarierst du als array, mit einem numerischen Key dem du auf der Verarbeitungsseite über ein entsprechendes Array die passenden Spaltennamen zuweist.

    Beispiel:

    HTML
    [...]
    <form method="post" action="my_search.php">
    <select name="search_values[1]"><!-- options --></select>
    <select name="search_values[2]"><!-- options --></select>
    [...]
    </form>

    Verarbeiten kannst du das dann ganz simpel:

    Wenn jetzt mal Felder hinzukommen oder wegfallen brauchst du nur den Array $mySearchFields und dein Formular entsprechend anpassen. Der Rest läuft automatisch.

    Hier übrigens noch ein Link für dich:
    http://www.php-faq.de/q-sql-select.html

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Danke das sieht richtig gut aus ! Leider bekommen ich einen Fehler bei

    PHP
    $v = mysqli_real_escape_string($v);
    Code
    [B]Warning[/B]:  mysqli_real_escape_string() expects exactly 2 parameters, 1 given in [B]C:\xampp\htdocs\angebote_suche.php[/B] on line [B]345[/B]

    So in etwas habe ich die Funktion des Scripts verstanden, finde aber den Fehler nicht. Welchen Parameter fehlt den da, der MSQL Connect?

    Danke.

  • Achso, bei mysqli prozedural muss man ja immer noch den Verbindungslink mit übergeben. Ich nutz das nur immer objektorientiert.
    Nutzt du denn mysql, mysqli prozedural oder mysqli objektorientiert?
    Bei mysql ist es mysql_real_escape_string(string $escapestr)
    http://de2.php.net/manual/de/func…cape-string.php
    Bei mysqli prozedural ist es mysqli_real_escape_string(mysqli $link , string $escapestr)
    Bei mysqli objektorientiert ist es mysqli::real_escape_string(string $escapestr)
    http://php.net/manual/de/mysqli.real-escape-string.php

    Weil du da nachfragst, du kennst die Funktion aber und weißt welchen Zweck die hat? Die schützt vor SQL-Injection und muss unbedingt auf SÄMTLICHE Daten angewendet werden, die vom User kommen und in SQL-Statements benutzt werden. Also z.B. alles aus $_GET, $_POST, $_COOKIE

    Ansonsten, wenn dir etwas an dem Code noch nichtganz klar ist frag gerne nach.
    Es macht ja mehr Sinn wenn du auch verstehst was da passiert. :)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • OK, super hab ich völlig übersehen, mit msql funktioniert das Script.

    Nun habe ich es mal getestet und nach 2 Optionen suchen lassen. A und B. Das Problem ist nun immer noch folgendes. Er liefert alle Ergebnisse mit der Option A und alle Ergebnisse mit der Option B.
    Mein Ziel ist aber, dass er bei der Option B -> A mit implementiert. Also hierarisch vorgeht, das Suchergebnis also immer mehr einschränkt mit jeder neuen Variabel.

    Vielleichth habe das in meinem ersten Statement falsch rübergebracht.


  • Ahja, in dem implode() steht ein " OR ".
    Da gehört natürlich ein " AND " hin. ;)
    Vorletzte Zeile.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ja, hab ich geändert. Ebenso haben offensichtlich die voreingestellten optionen wie --Bitte wählen-- das ergebniss beeinflusst. Sind mit der Variabel $v mitgeschickt worden, so ein blödsinn, lach.

    Ok ich danke dir, so funktioniert es jetzt einwandfrei und ich kann auch Optionen überspringen.

    Jetzt fehlt nur noch die Variabel nach Preis bis... , aber daran werde ich mich jeztzt mal selbst versuchen.

    Danke nochmals vielmals.

    Gruß

    P.S In einem anderen Forum konnte man sich für die Hilfe bedanken und die Helfer haben dort Punkte bekommen. Wäre auch was für hier.

    Einmal editiert, zuletzt von Hauer (9. Dezember 2010 um 21:06)

  • Gerne, wenn noch Fragen auftauchen sollten einfach wieder melden.

    Übrigens, als Tipp wenn du längerfristig mit PHP entwickeln möchtest: Schau dir mal mysqli an, am Besten gleich in der objektorientierten Version.
    mysql_* ist zwar nicht Deprecated, man braucht also keine alten Projekte umschreiben. Aber für neue Projekte ist es schon sinnvoll direkt die aktuelle Variante zu nutzen. Gerade in der oo-Variante bietet das schon nützliche Features, z.B. mit den prepared statements, oder multi_query.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hm, bei mir ist es einfach Gewohnheit. Gegenfrage, welchen Vorteil bietet PDO wenn man sicher ist, dass das Projekt nicht mit anderen DBs als MySQL laufen muss? ^^
    Ich habe kürzlich auch einen umfassenden Vergleich von mysql_*, mysqli_* und pdo gelesen, bei dem mysqli im gesamten am Besten abgeschnitten hat (Performance-Fragen). Das hing damit zusammen, dass mysqli_* eben auf ein DBMS (mysql) beschränkt und optimiert ist. Ich schau mal ob ich den Bericht nochmal finde.
    Ich wollte mir aber für mein nächstes anstehendes Projekt mal Doctrine2 anschauen, das basiert auch auf PDO, und ich habe davon bisher nur Lob in den höchsten Tönen gehört.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hallo, ich muss leider noch mal an dieses Thema anknüpfen.

    Ich versuche nun schon seit Stunden dem Script beizubringen, dass wenn er keine Treffer findet, soll es mir mittels Text einen Hinweis ausgeben. Eigentlich ja recht sipmle dachte ich, doch versuche ich nun die betreffende Variable, bzw. Variablen zu finden, die mir eine eindeutiges oder zumindest greifbares Ergebnis bringt. Leider finde ich sie nicht. Irgendwie ist es immer true, aber niemals false oder auch nie null.

    Ware nett, wenn jemand noch mal einen Tipp geben könnte.

    Hier noch mal das Script der Seite 1:

    Nachtrag: Natürlich habe ich schon erkannt, dass hier auch Array´s vorhanden sind und dass auch nur das Array selbst, bzw. auch ein String ein Ergeniss liefert, ob nun in form einer Ausgabe oder nicht. Aber dass ist ja gerade mein Problem.

    Danke.

    Einmal editiert, zuletzt von Hauer (12. Januar 2011 um 20:27)

  • Da sieht doch ganz gut aus, danke. Habe es jetzt mal einzubinden versucht, erhalte aber ein Ergebnis, da ich offenkundig den query nicht richtig bezeichne.

    Hier mal der Code:

  • Du überprüfst in deiner if-Bedingung nur ob der Query ausgeführt werden kann. Du musst aber das Ergebnis von mysql_num_rows prüfen wenn du wissen willst, ob Datensätze gefunden wurden.
    z.B.:

    PHP
    $res = mysqli_query($con,"SELECT * FROM objekte WHERE {$sqlWhere}");
    if( !mysqli_num_rows($res) ) {
        echo "Keine Einträge vorhanden.";
        mysqli_free_result($res);
    }
    else {
        // Ergebnisse verarbeiten
    }

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook