-
27.07.11 15:00 #1
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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:
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.HTML-Code:<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>
Mit meinem letzten Versuch
funktioniert das auch, allerdings erscheint der Kommentar natürlich immer, wenn bei Auswahl1 bzw. Auswahl2 irgendeine Rubrik ausgewählt wird.PHP-Code:if (!empty ($_POST['disziplin']) == TRUE AND (!empty ($_POST['jahros']))) {
echo "Dieser Text erscheint nur, wenn Auswahl1 sowie Auswahl2 ausgewählt sind.";
}
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
-
27.07.11 15:12 #2PHP-Code:
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.";
}
Die Schweine von heute sind unsere Schnitzel von morgen!
-
27.07.11 16:55 #3
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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
-
04.11.11 17:47 #4
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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:
Aber auch insoweit blieben meine Versuche erfolglos. Falls meine Überlegung zutrifft, wie müsste der Befehl lauten? Oder gibt es einen ganz anderen Ansatz?PHP-Code:$ergebnis = mysql_query($abfrage) or die ("MySQL-Fehler: " . mysql_error());
if (mysql_num_rows ($ergebnis) == '…') { … }
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 :1 2 3 4
checkbox => Array( 0 => name1, 1 => name2 )
Einen bestimmten Wert kannst du dann mittelsprüfen.PHP-Code:if(in_array("Vergleichswert", $_POST['checkbox'])) echo "Kommentar";
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?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.Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
04.11.11 21:58 #6
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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
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.PHP-Code:if (!empty ($_POST['name']) && $_POST['name'] == 'Miller') {
echo "Kommentar";
}
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.
So grob. Wenns nicht hinhaut könntest du mal deinen gesamten Code posten.PHP-Code:if (strpos($db['name'], $_POST['name']) !== 0) echo "Kommentar";
edit: sorry, das oben wäre case-sensitive. Alternative:
PHP-Code:if(stristr($db['name'], $_POST['name']) !== 0) echo "Kommentar";
Geändert von para_noid (04.11.11 um 22:23 Uhr)
Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
05.11.11 16:36 #8
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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:
Dann wird ein Array initialisiert und das Formularfeld geprüft:HTML-Code:<td><input type="text" name="name" size="25" maxlength="35" style="width:158px;" id="name"></td>
PHP-Code:$wheres = array();
Dann folgt die Datenbankverbindung mit Abfrage und Ergebnis:PHP-Code:if($_POST['name']) $wheres[] = "name LIKE '%{$_POST['name']}%'";
PHP-Code:$abfrage = "SELECT ...
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) CodePHP-Code:$ergebnis = mysql_query($abfrage) ...
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.PHP-Code:if(stristr($db['name'], $_POST['name']) !== 0) echo "Kommentar";
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
Verzeihung.
Bevor ich mich noch weiter verhaspel, probiere es bitte mal derart:
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).PHP-Code:if(stristr($db['name'], $_POST['name']) !== false) echo "Kommentar";
Ich streu mir mal eben Asche auf's Haupt und tapezier die Wohnung mit der PHP-Dokumentation...Geändert von para_noid (05.11.11 um 17:10 Uhr)
Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
05.11.11 19:15 #10
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
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:
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.PHP-Code:echo "<td align='left' style='width:100px'>". $row->url . "</td>";
Zum Problemkreis 1 bin ich zwischenzeitlich dank deiner Hilfe auf einem guten Weg. Dazu gebe ich aber noch gesondert Feedback ...
-
Weiterer Fehler, der mir gerade aufgefallen ist: du wolltest ja exakt nach einem Namen fragen und eben nicht nach der Eingabe des Benutzers. Also statt $_POST['name'], wo laut Beispiel "ill" drin steht, muss mit "Miller" verglichen werden.
Wenn $row->url in deinem Beispiel den Namen "Miller" enthält, dann ist mein $db['name'] dein $row->url.
Demzufolge, wenn du den Kommentar in einer weiteren Spalte ausgeben möchtest, sollte die Tabellenzeile ungefähr so aussehen:
Die Prüfung lautet im Endeffekt: Gib mir den Teilstring aus $row->url (wo "Miller" oder irgendwas anderes drin steht) ab dem ersten Vorkommen von "Miller" zurück. Das Ergebnis ist entweder ein String oder false, wenn "Miller" nicht im Namen enthalten ist. Wenn nicht false, gib den Kommentar aus.PHP-Code:echo "<td align='left' style='width:100px'>".$row->url."</td>";
if(stristr($row->url, "Miller") !== false)
echo "<td>hier dein Kommentar</td>";
else
echo "<td> </td>";
Analog ist strpos zu nutzen (und ähnliche, es gibt viele Wege, das zu prüfen)
-> Gib mir die numerische Position des ersten Vorkommens von "Miller" in $row->url zurück, kommt false zurück, ist er nicht vorhanden.PHP-Code:echo "<td align='left' style='width:100px'>".$row->url."</td>";
if(strpos($row->url, "Miller") !== false)
echo "<td>hier dein Kommentar</td>";
else
echo "<td> </td>";
Beide Prüfungen klappen auch dann, wenn in $row->url HTML-Tags oder Ähnliches hinzugefügt ist - wichtig ist nur, dass der gesuchte Name exakt als "Miller" vorkommt, ohne weitere Zeichen dazwischen.
Es gibt auch bei vermeintlich perfekten Skripten immer etwas zu verbessernEine evtl. bessere Möglichkeit ist mir mit meinen bescheidenen Kenntnissen nicht eingefallen.
gibt sicher auch bei dem Punkt genügend Leute, die helfen könnten.
Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
06.11.11 16:18 #12
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
Wunderbar - es klappt. Herzlichen Dank an dieser Stelle schon mal, auch für deine hilfreichen Erläuterungen. Möglicherweise kann ich aus deiner Lösung sogar noch die eine oder andere Idee verwirklichen, die ich habe (an Ideen mangelt es mir nicht, nur mit der Umsetzung tue ich mir mitunter schwer ...).

Aber ... jetzt kommt leider das aber. Und es tut mir leid, dass ich das noch nicht erwähnt habe, weil ich dieser Tatsache insoweit bisher keine Bedeutung beigemessen habe. In vielen Fällen kommt der Name nicht nur einmal, sondern mehrfach vor. Je nach Abfrage erscheint "Miller" also z. B. dreimal. Das ist auch so gewollt. Entsprechend oft wird dann aber auch der Kommentar generiert. Und das ist nicht gewollt, denn der soll ja nur einmal erscheinen. Ich habe daher die Kommentare in einer gesonderten Datei hinterlegt, die ich mit "require" im Anschluss an die Ergebnistabelle einbinde. Der jeweils zutreffende Kommentar wird dann als Fußnote sozusagen ausgegeben.
Tja, und aus der externen Datei wird nun der Kommentar nicht eingebunden. Stattdessen kommt die Notice: Trying to get property of non-object. Vermutlich bezieht sich dies auf "$row->url". Kann es sein, dass ich jetzt eine ganz andere Lösung benötige?
Viele Grüße
hawaiian
-
Man könnte das Problem sicher auch mit deinem Ansatz lösen, aber die Ausgabe innerhalb der Tabelle war ja eigentlich präferiert, richtig? Ich würde dir also eine andere Herangehensweise empfehlen, was nicht heißt, dass sie zwingend notwendig wäre. Wenn du deinen Ansatz unbedingt weiter verfolgen möchtest beziehungsweise die Kommentare weiterhin auslagern möchtest (legitim), müsstest du mal die komplette Fehlermeldung, die externe Datei und den Code ab require (oder noch besser, den gesamten Code) herumreichen.
Es fehlt mir momentan n bisschen an der Vorstellung, auf welches Ziel du genau mit diesen Kommentaren hinarbeitest; ich bleibe deswegen einfach mal bei diesem Miller-Beispiel (womöglich ist der Ansatz für das Gesamtziel aber nicht optimal):
Du könntest den gesuchten Namen und den booleschen Wert, ob zu diesem Namen bereits ein Kommentar ausgegeben wurde, in ein Array speichern und dementsprechend abfragen:
Erklärung:PHP-Code:/* diesen Teil vor der Schleife, die dir $row->url gibt */
// befüllt das Array mit dem Suchstring als key und false als value, stellvertretend für "noch nicht kommentiert"
$searcharray = array("Miller" => false);
/* weiter unten */
echo "<td align='left' style='width:100px'>".$row->url."</td>";
if(strpos($row->url, key($searcharray)) !== false && !current($searcharray)){
echo "<td>hier dein Kommentar</td>";
$searcharray["Miller"] = true;
}else
echo "<td> </td>";
gibt den Index des Arrays $searcharray der aktuellen Position zurück (in diesem Fall immer "Miller"). Die eigentlich durchgeführte Prüfung bleibt also hier dieselbe.PHP-Code:key($searcharray)
Trifft zu, wenn current($searcharray) false ist. current gibt dir den aktuellen Wert des Arrays $searcharray, zu Beginn also grundsätzlich false.PHP-Code:!current($searcharray))
Setzt den Wert auf true, wenn der Kommentar ausgegeben wurde. Damit werden weitere Prüfungen nicht mehr positiv verlaufen.PHP-Code:$searcharray["Miller"] = true;
Wenn man davon ausgeht, dass du grundsätzlich nur einen Kommentar ausgeben willst, kann man natürlich auch auf das Array verzichten:
PHP-Code:/* diesen Teil vor der Schleife, die dir $row->url gibt */
$echoed = false;
/* weiter unten */
echo "<td align='left' style='width:100px'>".$row->url."</td>";
if(strpos($row->url, "Miller") !== false && !$echoed){
echo "<td>hier dein Kommentar</td>";
$echoed = true;
}else
echo "<td> </td>";
Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
07.11.11 20:39 #14
- Registriert seit
- May 2011
- Ort
- Kempten (Bayern)
- Beiträge
- 27
Hm, nein, der Kommentarteil sollte eigentlich nicht innerhalb der Ergebnistabelle erscheinen. In meinem Projekt (das mit rund 3.500 Datensätzen auch schon online ist) geht es um Sport, speziell hier um Leichtathletik. Die gute "Miller" war über 100 m und 200 m erfolgreich. Sie erscheint also, je nach Abfrage, einmal oder zweimal. Sie ist auch mit zwei Datensätzen in der Datenbank hinterlegt. Eine ganze Reihe von Sportlern wird, je nach Zahl der Erfolge, noch häufiger gelistet.
Das, was ich als Kommentar bezeichne, sind im Grunde genommen Zusatzinformationen zu einer Reihe der abgerufenen Datensätze. Das sind manchmal sogar eigenständige Tabellen, zum Teil auch mit Bildern. Dies lässt sich in überschaubarer Weise wohl nur über externe Dateien einbauen und klappt eigentlich auch ganz gut. Na ja, bis auf die beiden geschilderten Probleme. Für die Funktionalität der Datenbankabfrage ist diese Sache ohne Bedeutung. Es sind halt reine Zusatzinfos.
Auch wenn wir das Ziel noch nicht ganz erreicht haben, deine Bemühungen, mir zu helfen, waren nicht umsonst. Ich habe bereits dazu gelernt und bin auch schon dabei, etwas zu vereinfachen.
Hier ein Teil der Ergebnistabelle:
Code von "kommentare.php":PHP-Code:{
...
echo "<td align='left' style='width:100px'>". $row->vorname . "</td>";
echo "<td align='left' style='width:100px'>". $row->url . "</td>";
...
}
echo "</table><p>";
require "kommentare.php";
Fehlermitteilung: Notice: Trying to get property of non-object.PHP-Code:<?php
...
if(stristr($row->url, "Miller") !== false) {
echo "<div style='width: 280px;' class='kommentar'>
Inger Miller ...</div>";
}
...
?>
Der komplette Code beläuft sich momentan auf rund 600 Zeilen (ohne Kommentardateien). Das möchte ich eigentlich niemandem zumuten. Ich hoffe, die Auszüge reichen dennoch.
Viele Grüße
hawaiianGeändert von hawaiian (07.11.11 um 20:45 Uhr)
-
Ich auch, nicht dass ich wieder Murks erzähleIch hoffe, die Auszüge reichen dennoch.

Du versuchst innerhalb von kommentare.php auf $row zuzugreifen. Ich gehe mal stark davon aus, dass deinaußerhalb der Schleife erfolgt, in der du die Datensätze abfragst und ausgibst.PHP-Code:require "kommentare.php";
Dann ist $row natürlich nicht mehr das, was es innerhalb der Schleife war.
Ich hatte jetzt schon wieder die abenteuerlichsten Lösungsansätze im Kopf, versuch jetzt aber, nur so viel zu posten dass es (hoffentlich) für deinen reicht:
kommentare.php:PHP-Code:$allURL = '';
{
...
echo "<td align='left' style='width:100px'>". $row->vorname . "</td>";
echo "<td align='left' style='width:100px'>". $row->url . "</td>";
...
$allURL .= $row->url;
}
echo "</table><p>";
require "kommentare.php";
$allURL wird nach und nach mit allen Einträgen der Spalte url aus der Ergebnismenge befüllt.PHP-Code:<?php
...
if(stristr($allURL, "Miller") !== false) {
echo "<div style='width: 280px;' class='kommentar'>
Inger Miller ...</div>";
}
...
?>
Innerhalb von kommentare.php wird nun dieser gesamte String nach den speziellen Namen abgegrast und im Erfolgsfall jeweils der Kommentar ausgegeben.Für die Übereinstimmung von Niederschrift und Hirninhalt.
Ähnliche Themen
-
HTML Doku aus Kommentaren erstellen
Von mschlegel im Forum .NET CaféAntworten: 7Letzter Beitrag: 04.07.08, 11:22 -
Properties Datei mit Kommentaren schreiben
Von iNstinct im Forum JavaAntworten: 2Letzter Beitrag: 26.11.07, 07:43 -
Problem beim HInzufügen von Kommentaren
Von heimatlied im Forum PHPAntworten: 12Letzter Beitrag: 29.03.07, 15:51 -
´Spammen bei Kommentaren verhindern
Von StefanR im Forum PHPAntworten: 7Letzter Beitrag: 24.05.04, 16:16 -
Nummerierung von Kommentaren
Von Zipper02 im Forum PHPAntworten: 8Letzter Beitrag: 26.08.02, 14:05



3Danke

Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren