Datenbankabfragen mit Kommentaren ergänzen

hawaiian

Mitglied
Hallo zusammen,

Nachdem zu meinen am 06.07.11 geposteten Fragen leider keine Antworten mehr erfolgten, möchte ich zumindest mein dort zuletzt geschildertes Problem nochmals gesondert aufgreifen.

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:
<tr>
      <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.

Mit meinem letzten Versuch

PHP:
if (!empty ($_POST['disziplin']) == TRUE AND (!empty ($_POST['jahros']))) {
    echo "Dieser Text erscheint nur, wenn Auswahl1 sowie Auswahl2 ausgewählt sind.";
  }

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

Frage:
Wie muss der Code lauten, damit ausschließlich bei der genannten Auswahl der Kommentar erscheint bzw. welcher Ansatz ist hier sinnvoll?

Da es eine Vielzahl von Kombinationen gibt und auch `ne Menge Kommentare, wäre es teilweise vorteilhaft, zusammenzufassen, z. B.: wenn 100 m und/oder 200 m sowie 2004 – Athen, dann Kommentar.

Auf Tipps hofft
hawaiian
 
PHP:
if (!empty ($_POST['disziplin']) && !empty ($_POST['jahros']) && $_POST['disziplin'] == '200 m' && $_POST['jahros'] == '2004 - Athen') {
    echo "Dieser Text erscheint nur, wenn Auswahl1 sowie Auswahl2 ausgewählt sind.";
  }
 
Hallo Maniac,

herzlichen Dank, klappt wunderbar. Jetzt werde ich erst einmal einige zig Kommentare unterschiedlicher Art einbauen. Wobei ich da schon wieder ein neues Problem am Horizont auftauchen sehe (Größe der Datei).

Viele Grüße nach A
hawaiian
 
Hallo zusammen,

jetzt muss ich mein eigentlich längst erledigtes Thema doch nochmals aufgreifen. Ich habe zwischenzeitlich zwei weitere Fallgestaltungen, bei denen Maniac's Lösung nicht zu funktionieren scheint. Handelt es sich nämlich bei einem Teil der Formularabfrage um Checkboxen, erscheinen auch nicht zugehörige Kommentare. Ich habe nun verschiedene Modifikationen ausprobiert (auch mit is_array), aber ohne Erfolg. Wie muss im Fall der Verwendung von Checkboxen Maniac's ansonsten bestens funktionierender Code lauten?

Zum Zweiten finde ich keine Lösung, wie ich bei Suche nach einem bestimmten Namen das gefundene Ergebnis mit einem Kommentar ergänzen kann. Das obige Beispiel scheidet dafür m. E. aus, weil es auf die Formulareingaben abstellt. Dies würde also eine Eingabe erfordern, die exakt derjenigen in der Datenbank entspricht. Den Namen kann man aber klein- oder groß schreiben. Es genügt ferner die Eingabe von mindestens drei Buchstaben. Meine Überlegung ist daher, den Kommentar nicht von der Formulareingabe, sondern vom Ergebnis abhängig zu machen. Wird also bei der Namenssuche z. B. „ill“ eingegeben, erscheinen als gefundene Namen Miller und Williams. Nur bei Miller aber soll der Kommentar eingeblendet werden.
Ich könnte mir vorstellen, dass eine Lösung ähnlich der zur Anzahl gefundener Datensätze lauten könnte, die in meinem Code so ausschaut:

PHP:
$ergebnis = mysql_query($abfrage) or die ("MySQL-Fehler: " . mysql_error());
        if (mysql_num_rows ($ergebnis) == '…')  { … }

Aber auch insoweit blieben meine Versuche erfolglos. Falls meine Überlegung zutrifft, wie müsste der Befehl lauten? Oder gibt es einen ganz anderen Ansatz?

Viele Grüße
hawaiian
 
Ich gehe mal davon aus, dass die Checkboxen nach dem Schema name="checkbox[]" benannt sind.

Dann sollte $_POST dementsprechend aussehen:

Code:
checkbox => Array(
  0 => name1,
  1 => name2
)

Einen bestimmten Wert kannst du dann mittels
PHP:
if(in_array("Vergleichswert", $_POST['checkbox'])) echo "Kommentar";

prüfen.

Wird also bei der Namenssuche z. B. „ill“ eingegeben, erscheinen als gefundene Namen Miller und Williams. Nur bei Miller aber soll der Kommentar eingeblendet werden.

Ich versteh nicht ganz, wie du unterscheiden willst, welcher Name gemeint oder gewollt ist. Warum soll in dem Beispiel ein Kommentar bei Miller stehen? Woran kann man das festmachen?
 
Hallo para_noid,

die Checkboxen entsprechen dem von dir angenommenen Schema, der Code allerdings ist anders aufgebaut. Gleichwohl scheint deine Lösung zu funktionieren, ich muss da allerdings morgen noch etwas testen. Vielen Dank schon mal.

Erst durch deine Gegenfrage habe ich bemerkt, dass ich meine Frage zum zweiten Problem falsch gestellt hatte bzw. dass die Problembeschreibung nicht ganz stimmt. Ich sollte manchmal nicht mehrere Dinge gleichzeitig tun. Sorry.

Mit dem Code

PHP:
if (!empty ($_POST['name']) && $_POST['name'] == 'Miller') {
    echo "Kommentar";
   }

erreiche ich, dass bei der Datenbankabfrage neben dem Datensatz "Miller" der dazugehörige Kommentar erscheint. Gebe ich aber z. B. miller oder nur ill oder mill usw. ein, kommt zwar der Datensatz, aber nicht mehr der Kommentar. Man muss also exakt den Namen so schreiben, wie er in der Datenbank hinterlegt ist, also Miller. Ich suche nun nach der Möglichkeit, dass der Kommentar immer dann erscheint, wenn als Ergebnis der Datenbankabfrage der Datensatz "Miller" erscheint. Dass je nach Eingabe noch andere Datensätze aufgelistet werden, ist in diesem Zusammenhang unerheblich. Deshalb meine im vorherigen Posting auch geäußerte Vermutung, dass sich der Code in diesem Falle nicht an der Eingabe, sondern am Ergebnis ausrichten müsste.

Viele Grüße
hawaiian
 
Jup, jetzt hab ichs verstanden.
Man müsste jetzt wissen, wie du die Ergebnisse aus der DB ausgibst. Wahrscheinlich auch über irgendein Array.

PHP:
if (strpos($db['name'], $_POST['name']) !== 0) echo "Kommentar";

So grob. Wenns nicht hinhaut könntest du mal deinen gesamten Code posten.

edit: sorry, das oben wäre case-sensitive. Alternative:

PHP:
if(stristr($db['name'], $_POST['name']) !== 0)  echo "Kommentar";
 
Zuletzt bearbeitet:
So, jetzt habe ich ausgiebig getestet mit dem Ergebnis, dass ich beide Probleme leider noch nicht lösen konnte. Ich bleibe zunächst beim zweiten Problem.

Also, da wäre zunächst, hier alles stark verkürzt dargestellt, der Teil der Formularabfrage:

HTML:
<td><input type="text" name="name" size="25" maxlength="35" style="width:158px;" id="name"></td>

Dann wird ein Array initialisiert und das Formularfeld geprüft:

PHP:
$wheres = array();

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

Dann folgt die Datenbankverbindung mit Abfrage und Ergebnis:

PHP:
$abfrage = "SELECT ...

PHP:
$ergebnis = mysql_query($abfrage) ...

Und jetzt beginnt eigentlich das geschilderte Problem. Wie erreiche ich, dass der Kommentar immer dann erscheint, wenn als Ergebnis der Datenbankabfrage der entsprechende Datensatz erscheint. In meinem Beispiel war das der Name "Miller". Deinen (para_noid) Code

PHP:
if(stristr($db['name'], $_POST['name']) !== 0)  echo "Kommentar";

habe ich nun versucht anzupassen. Die richtige Lösung habe ich aber nicht gefunden. Allen Versuchen gemeinsam war, dass der Kommentar, neben unterschiedlichen Fehlermitteilungen, nun immer erschien, also egal, ob ich nach dem Namen Miller oder einem anderen Namen oder auch über eine andere Rubrik der Formularabfrage gesucht habe.

Viele Grüße
hawaiian
 
Ähh... +kopfkratz+
Ich muss gestehen, ich lag mit meinem Vorschlag falsch.

!== 0 trifft hier immer zu, weil die Funktion stristr im negativen Fall false zurück gibt, und false !== 0 :rolleyes: Verzeihung.

Bevor ich mich noch weiter verhaspel, probiere es bitte mal derart:

PHP:
if(stristr($db['name'], $_POST['name']) !== false)  echo "Kommentar";

Sollte das wiederrum nicht hinhauen, bräucht ich mal den Teil des Codes, an dem du die Ergebnisse der Abfrage ausgibst (hatte was von einer Tabelle gelesen).

Ich streu mir mal eben Asche auf's Haupt und tapezier die Wohnung mit der PHP-Dokumentation...
 
Zuletzt bearbeitet:
Also ich wäre ja schon froh, wenn ich nur einen Teil deiner PHP-Kenntnisse überhaupt hätte ...

Es funktioniert noch nicht, wobei ich schon das Problem habe, dass ich mir nicht sicher bin, mit was ich in deinem Lösungsvorschlag $db und 'name' ersetzen muss.

Die Ergebnisse der Abfrage zum Namen gebe ich mit folgendem Code aus:

PHP:
echo "<td align='left' style='width:100px'>". $row->url . "</td>";

Und da liegt, wie ich erst jetzt erkenne, möglicherweise ein weiterer Teil des Problems. Abgefragt wird mit ($_POST['name']), aus der Datenbank ausgelesen wird der Name aber aus dem Feld "url". Dieses Feld enthält den Namen ein zweites Mal, ggf. aber als Link mit der Möglichkeit, weitere Infos abrufen zu können und/oder im HTML-Code, wenn Namen Sonderzeichen enthalten (kommt häufig vor z. B. bei polnischen oder tschechischen Namen). Eine evtl. bessere Möglichkeit ist mir mit meinen bescheidenen Kenntnissen nicht eingefallen.

Zum Problemkreis 1 bin ich zwischenzeitlich dank deiner Hilfe auf einem guten Weg. Dazu gebe ich aber noch gesondert Feedback ...
 
Zurück