dedlfix: Leere Felder bei Datenabfrage aussparen

Beitrag lesen

echo $begrüßung;

So wenn du mir jetzt noch erzählst wie ich in diesem SQL Query einen like-Ausdruck realisiere bin ich vollauf zufrieden.

Wenn du das "irgendwas" selbst vorgibst:

$where[] = "feld LIKE '%irgendwas'";

Falls das "irgendwas" vom Benutzer kommt, muss da natürlich auch wieder ein Escaping stattfinden. Hier gibt es nun zwei Fälle.

1. Du gibst die Positionen der Jokerzeichen fest vor.
2. Der Benutzer soll die Jokerzeichen in seiner Eingabe setzen können. (Und hier wäre es sicher auch noch hübsch, wenn er * und ? verwenden könnte statt % und _ )

Fall 1: Es müssen die vom Benutzer eingegebenen %- und _-Zeichen entschärft werden. Das muss man selbst tun, da mysql_real_escape_string() sich darum nicht kümmert.

$irgendwas = strtr($irgendwas, array('%' => '\%', '_' => '\_', '\' => '\\')); // 2 bzw. 4 \ weil der PHP-Parser bei \ ein \ "wegparst".

Einsetzen in die LIKE-Konstruktion. Da das % auch von sprintf() verwendet wird muss es doppelt geschrieben werden, wenn du es an LIKE weiterreichen willst.

$where[] = sprintf("feld LIKE '%%%s'", mysql_real_escape_string($irgendwas)); // Joker steht vor dem $irgendwas; %% steht für ein LIKE-%, %s für einen String-Platzhalter.
  $where[] = sprintf("feld LIKE '%s%%'", mysql_real_escape_string($irgendwas)); // Joker steht nach dem $irgendwas

Fall 2: Das Auflösen von * und ? nach % und _ kann man mit dem Escapen von % und _ verbinden.

$irgendwas = strtr($irgendwas, array('*' => '%', '?' => '_', '%' => '\%', '_' => '\_', '\' => '\\'));
  $where[] = sprintf("feld LIKE '%s'", mysql_real_escape_string($irgendwas));

strtr() sorgt übrigens dafür, dass schon bearbeitete Bestandteile nicht ein zweites Mal umgewandelt werden, also ein * wird nur zum % und wird danach kein %:

echo "$verabschiedung $name";