Datenbankabfrage (3 Fragen)

hawaiian

Mitglied
Hallo zusammen,

Meine Datenbanken und die entsprechenden Abfragen (hierzu hatte ich schon Fragen gepostet) funktionieren soweit. Es gibt aber noch ein paar für mich nicht lösbare Probleme bzw. Wünsche.

1.
Hier zunächst ein Teil des Codes der Datenbankabfrage:
PHP:
if($_POST['name']) $wheres[] = "name LIKE '%{$_POST['name']}%'"; // danke nochmals an Yaslaw

Dann folgen Datenbankverbindung und SELECT, schließlich
PHP:
array_walk_recursive($wheres, 'escapeString');

Gebe ich bei der Namensuche Prozentzeichen %%% oder Unterstriche ___ ein (es genügt die Eingabe von drei Buchstaben), werden alle Datensätze abgerufen Dies liegt daran, so viel habe ich herausfinden können, dass diese Zeichen, in Kombination mit LIKE, als Platzhalter interpretiert werden.

Frage 1:
Gibt es eine Möglichkeit, dass bei Eingabe dieser beiden Zeichen der Abruf von Datensätzen unterbunden wird?

2.
Gebe ich bei der Namensuche ein Apostroph ein (z. B. O’Sullivan), erscheint folgende Fehlermitteilung:
MySQL-Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Sull%' ORDER BY name …
Ich weiß, dazu gab’s schon wiederholt Fragen. Aber meine Tests sämtlicher ergoogelten Tipps schlugen bisher fehl. Auch der Einsatz von
PHP:
mysql_real_escape_string($_POST['name']);
oder
PHP:
$_POST['name'] = mysql_real_escape_string($_POST['name']);

führten zu keinem anderen Ergebnis. Irgendetwas mache ich also falsch.

Frage 2:
Wie muss ggf. der Code ergänzt bzw. geändert werden, damit bei der Suche der Apostroph fehlerfrei nutzbar ist?

3.
Nach
PHP:
if($_POST['name']) $wheres[] = "name LIKE '%{$_POST['name']}%'";
... (und weiteren Abfragen)

folgt die Abfrage von zwei Checkboxenbereichen mit
PHP:
if($_POST['os']) $wheres[] = "FIND_IN_SET(os,'".implode(',', $_POST['os'])."')";
if($_POST['wm']) $wheres[] = "FIND_IN_SET(wm,'".implode(',', $_POST['wm'])."')";
dann folgt
PHP:
if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
Datensätze werden aber nur gefunden, wenn nur einer der beiden Checkboxenbereiche abgefragt wird. Die Kombination beider findet dagegen keine Datensätze.

Frage 3:
Wie muss der Code geändert werden, damit auch eine Kombinationsabfrage möglich ist?

Viele Grüße
hawaiian
 
Gibt es eine Möglichkeit, dass bei Eingabe dieser beiden Zeichen der Abruf von Datensätzen unterbunden wird?
Antwort 1:

Ja, die gibt es, du kannst mit regulären Ausdrücken oder simplen str_replace() erstzen oder mit regulären Ausdrücken oder strstr() nach diesen speziellen Zeichen suchen und Fehlermeldung ausgeben, wenn gefunden.

Wie muss ggf. der Code ergänzt bzw. geändert werden, damit bei der Suche der Apostroph fehlerfrei nutzbar ist?
Antwort 2:

Es gibt mehrere Fallstricke bei der Benutzung von mysql_real_espace_string(). Einer wäre, das keine Verbindung zum DB-Server hergestellt wurde, bevor die Funktion verwendet wurde. Notfalls kann man auch hier mit regulären Ausdrücken arbeiten.

Wie muss der Code geändert werden, damit auch eine Kombinationsabfrage möglich ist?

Antwort 3:
Anstatt AND ein OR verwenden:
PHP:
if(count($wheres)>0) $wherestring = "WHERE ".implode(' OR ', $wheres);
 
Vielen Dank, saftmeister, für deine Lösungsvorschläge. Leider aber bin ich noch nicht weiter gekommen.

Zu 1. - Prozentzeichen + Unterstrich

Ich hab's vergeblich mit str_replace() probiert, zuletzt bezogen auf den Unterstrich und mit folgendem Code:
PHP:
$POST = str_replace("_"," ",($_POST['name']));

Wie muss der Code ggf. richtig lauten?

Zu 2. - Apostroph

mysql_real_espace_string() hatte ich schon nach dem Verbindungsaufbau genutzt. Daran kann's also nicht liegen. Die einzige Variante, die ich gefunden habe und die keinen MySQL-Fehler mehr produziert, ist die hier:
PHP:
$mysql->real_escape_string($_POST['name']);
Allerdings werden dann auch keine Daten mehr abgerufen.

Zu 3. - Kombinationsabfrage

Mit OR hatte ich es schon ausprobiert (aber vergessen, zu erwähnen). Dann kann ich zwar die beiden Checkboxenbereiche kombinieren, andere Suchkriterien (wie z. B. Geschlecht) werden aber ignoriert. Es werden fälschlicherweise also alle Datensätze abgerufen.

Hast du noch einen Tipp?

Viele Grüße
hawaiian
 
Zu 1. - Prozentzeichen + Unterstrich

Wie muss der Code ggf. richtig lauten?

Das kommt darauf an, wie der Code lautet, der danach kommt. Wenn $POST anschließend nicht verwendet wird, ist klar, warum es nicht wie gewünscht funktioniert.

Zu 2. - Apostroph

Die einzige Variante, die ich gefunden habe und die keinen MySQL-Fehler mehr produziert, ist die hier:
PHP:
$mysql->real_escape_string($_POST['name']);
Allerdings werden dann auch keine Daten mehr abgerufen.

Damit ist klar, warum mysql_real_escape_string() nicht funktioniert. Wenn du mysqli verwendest um eine Verbindung aufzubauen, musst du auch die mysqli-Funktionen verwenden. Warum keine Daten zurück geliefert werden, kann ich so nicht sagen. Wenn $mysql->error keine Ausgabe macht, bedeutet das wohl, das keine Ergebnisse gefunden worden, auf das Kriterium zutrifft. Bitte darauf achten, auch hier die mysqli-Funktion und nicht mysql_error() zu verwenden.


Zu 3. - Kombinationsabfrage

Mit OR hatte ich es schon ausprobiert (aber vergessen, zu erwähnen). Dann kann ich zwar die beiden Checkboxenbereiche kombinieren, andere Suchkriterien (wie z. B. Geschlecht) werden aber ignoriert. Es werden fälschlicherweise also alle Datensätze abgerufen.

Dann musst du das OR abhängig davon verwenden, ob alle beide Checkboxen gehakt sind oder nicht:

PHP:
if(count($wheres)>0) $wherestring = "WHERE ".implode( (isset($_POST['os']) && isset($_POST['wm']) ? ' OR ' : ' AND '), $wheres);

bzw. umgekehrt, wenn du das anders rum haben willst.
 
Das kommt darauf an, wie der Code lautet, der danach kommt. Wenn $POST anschließend nicht verwendet wird, ist klar, warum es nicht wie gewünscht funktioniert.

Der nachfolgende Code lautet:
PHP:
if($_POST['name']) $wheres[] = "name LIKE '%{$_POST['name']}%'";

Zum Apostrophenproblem probiere ich noch weiter. Mysqli habe ich insoweit nur mal testweise eingesetzt.

Zu 3. – Kombinationsabfrage
Schönen Dank für deinen Code, saftmeister. Er funktioniert wunderbar, solange ich nur Checkboxen auswähle. In Verbindung mit anderen Formularabfragen (also Suchkriterien wie z. B. Name oder Geschlecht) werden aber weiterhin alle Datensätze und damit auch nicht zutreffende abgerufen.

Darf ich vielleicht noch eine ganz andere Frage nachschieben? Oder sollte ich dafür besser ein neues Thema eröffnen? Ich versuch’s mal hier.

Es gibt eine ganze Reihe von Datensätzen, die ich bei Aufruf um einen Kommentar ergänzen möchte. Die Datensätze werden in einer Tabelle aufgelistet, auch mit Bildern und Links. Nun kann ich zwar z. B. eine weitere Spalte anfügen, die den Kommentar enthält. Allerdings erscheint dieser dann ggf. mehrfach. Um zu verdeutlichen, was ich meine, hier ein Teil der Formularabfrage:
HTML:
<td align="right">Auswahl1</td>
      <td><select name="disziplin" size="1" style="width:165px;">
            <option value="">--------- Auswahl ---------</option>
            <option>100 m</option>
            <option>200 m</option>
            <option>400 m</option>
	Und weitere …
          </select></td>
  </tr>
  <tr>
      <td align="right">Auswahl2</td>
      <td><select name="jahros" size="1" style="width:165px;">
            <option value="">--------- Auswahl ---------</option>
	    	<option>2008 - Peking</option>
	    	<option>2004 - Athen</option>
	    	<option>2000 - Sydney</option>
		Und weitere …
          </select></td>
  </tr>

Wird nun z. B. unter Auswahl1 „200 m“ und unter Auswahl2 „2004 – Athen“ ausgewählt, erscheinen eine Reihe von Datensätzen. Speziell diese ausgewählte Kombination möchte ich nun mit einem Kommentar versehen (außerhalb der Tabelle).
Mein Ansatz war nun, dies mit folgendem Code zu realisieren:

PHP:
if (!empty($_POST['Auswahl1'])) {
   echo "Kommentar";
 }

Dies funktioniert auch, allerdings erscheint der Kommentar natürlich immer, wenn bei Auswahl1 irgendeine Rubrik ausgewählt wird.

Frage: Wie muss der Befehl lauten, damit ausschließlich bei der genannten Auswahl der Kommentar erscheint?
Da es eine Vielzahl von Kombinationen gibt und auch `ne Menge Kommentare, wäre es teilweise sinnvoll, zusammenzufassen, z. B.: wenn 100 m und/oder 200 m sowie 2004 – Athen, dann Kommentar. Wie müsste dann der Code lauten?

Ich habe schon alles Mögliche ausprobiert, allein, es will mir nicht gelingen. Bin halt Anfänger …

Viele Grüße
hawaiian
 

Neue Beiträge

Zurück