dynamisches SELECT aus Suchanfrage

Hi @ all,
könnt ihr mir kurz auf die Sprünge helfen?
Ich habe eine Suchseite, auf der der User verschiedene Suchkriterien definieren kann oder auch nicht. Je nachdem, was er da so eingibt, betrifft das nachfolgende SELECT komplett verschiedene Tabellen. D.h. sowohl die FROM- als auch die WHERE-clause müssen dynamisch erzeugt werden.
Wie läuft das wohl prinzipiell? Man könnte wohl den Query-String in PHP irgendwie zusammenkonkatenieren, aber ob das so gut ist…?
Habe bisher alles mit prepared statements gelöst.
Thx!

freilich kannst/musst du das so machen (zusammenbauen) … die Frage bleibt nur woher die Argument stammen die du zusammen-concatenierst … insb. die betroffenen Tabellen (fuer die joins) und die Felder (Kriterien) … diese wuerde ich aus einer art repository laden - wo der benutzer auswahlen treffen kann (suche nach feld f in objekt/tabelle o) … den filter-wert wuerde ich nachwievor nicht direkt in die query einbauen, sondern stattdessen wildcards … dann erzeugst du wie gehabt ein prepared-statement - ist einfach sicherer - was SQL-injections angeht …

Ok, danke dir. Letzte Frage, gibt es irgendwie eine Art Wildcard für eine Bedinung, sodaß diese Bedingung keine Einschränkung darstellt (d.h. wegfällt)?
BSP: Der User lässt ein Dropdown auf der Sucheseite leer. Im prepared statement steht in der WHERE-clause aber eine entsprechende Bedingung für dieses Dropdown. Da es leer geblieben ist, wäre es praktisch, wenn man einen “Joker” als Parameter binden könnte, der auf alle Einträge matcht.
Das Statement könnte dann statisch bleiben…
Ansonsten mach ich’s wie von Symbiont vorgeschlagen, aber wäre gut zu wissen!

ist nur mal eine Idee

WHERE myColumn LIKE COALESCE(__? || ‘%’, myColumn)

der Vorteil: der Parameter wäre nur ein einziges mal pro Kriterium … ansonsten muesstest du

WHERE
myColumn LIKE ? || ‘%’ OR ? IS NULL

schreiben … das ist irgendwie doof

[edit] die wildcards sind aus jdbc -prepared statements … ich glaube serverseitige PS sehen etwas anders aus … also solls nur als erklärung des prinzip dienen

läuft!
Thx.

Schon wieder ich, weiterführende Frage:
Was muss ich tun, um mir ein mit PDO:: prepare vorbereitetes und mit PDO::execute ausgeführtes SQL-Statement zum debuggen angucken zu können?
Das Loggin des Posgresql-Servers schreibt scheinbar nur syntaktisch fehlerhafte Statements mit…
Nochmals danke, ihr seid klasse!

Wirf mal einen Blick in postgresql.conf - dort sind rund ein Dutzend Optionen zum Thema Debugging. Dabei kannst du dir vom Planer über Statistiken, ausgeführte Anfragen und dem Executor eigentlich alles anzeigen lassen, was das Herz begehrt.

Nähere Infos zu den einzelnen Optionen findest du in der Online-Dokumentation auf der PostgreSQL Webseite. Viele (wohl nicht alle) Optionen kannst du auch innerhalb deiner Verbindung setzen, die Einstellung gilt dann nur für deine aktuelle Verbindung und du wirst nicht mit Details aus anderen Anfragen zugemüllt.