mysql_fetch_object: Werte vor Ausgabe vergleichen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
ausgabe
ausgeben
beispiel
code
datum
durchgang
email
ergebnis
inhalt
pyramide
schleife
spalte
string
tabelle
tag
treffer
url
zeile
zufall
-
Hallo!
Gibt es wenn man mit mysql_fetch_object Werte aus einer Datenbank abfragt eine Möglichkeit, vor der tag/ausgabe">Ausgabe zu prüfen ob ein bestimmter String vorkommt und den dann hervorzuheben?
Ich hab mir das so gedacht, dass man z.B. in der While-Schleife prüfen kann
if ($row->Spalte == "Das ist der String") { $ausgabe = "<font color='red'>".$row->Spalte."</font>"; }
Aber so funktioniert es einmal nicht.. Hab auch schon ein paar andere Varianten probiert, funktioniert aber alles nicht. Und im Internet hab ich nichts dazu gefunden...
Danke im Voraus!
Beitrag zuletzt geändert: 7.6.2012 3:29:10 von yorecords -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo
doch das sollte gehen, aber ...
... Achtung, wenn du das in einer (while) Schleife machst
dann wird $ausgabe = "..."; immer wieder überschrieben
also kommt am Schluß nur das "letzte" Ergebnis raus
Du musst entweder in ein Array ablegen oder an $ausgabe String anhängen
damit jedes einzelne Ergebnis am Schluß verfügbar ist
und "nur Not" kannst Du den Objekt-Inhalt auch explizit als String umwandeln
mit (string) davor oder mit get_object_vars() aber das muss glaub garnicht sein
$sql = "SELECT ... ... "; $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) { $present = (string)$row->Spalte; ## oder: ## $present = get_object_vars($row->Spalte); $suchstr = 'Das ist der String'; $ausgabe1 = ''; // ----- Ausgabe als String vorbereiten $ausgabe2 = array(); // ----- Ausgabe als Array vorbereiten if ( $present == $suchstr ) { // ---- an String anhängen $ausgabe1 .= "<br /> <font color='red'>".$present."</font> \n"; // ---- oder in Array einfügen $ausgabe2[] = "<font color='red'>".$present."</font>"; } else { $ausgabe1 .= "<br /> <i>".$present."</i> \n"; $ausgabe2[] = "<i>".$present."</i>"; } }
also entweder mit $ausgabe1 als String oder mit $ausgabe2 als Array
(beides macht keinen Sinn, hier nur als BSP)
Dann kannst Du $ausgabe1 (als String) direkt per echo ausgeben
... und für $ausgabe2 (als Array) dann z.B. in einer foreach-Schleife:
foreach ($ausgabe2 as $item) { echo "<br />".$item."\n"; }
das Problem bei Deinem Code ist, das $ausgabe immer wieder überschrieben wird
und daruch kommt immer nur die letzte $row in $ausgabe an ...
... daher .... entweder je $row an String hinten-dran-hängen mit .= oder in ein Array ablegen
Beitrag zuletzt geändert: 7.6.2012 10:16:08 von guteseiten -
yorecords schrieb:
Wenn ich nur deinen Code anpasse:
Gibt es wenn man mit mysql_fetch_object Werte aus einer Datenbank abfragt eine Möglichkeit, vor der Ausgabe zu prüfen ob ein bestimmter String vorkommt und den dann hervorzuheben?$result = mysql_query('SELECT ...'); $ausgabe = ''; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') $ausgabe .= "<font color='red'>{$row->Spalte}</font>"; else $ausgabe .= $row->Spalte; $ausgabe .= '<br />'; } echo($ausgabe);
Dabei sollte noch erwähnt werden, dass das
-Tag schon lange veraltet ist.<font>
-
yorecords schrieb:
dazu ist eigentlich sql erdacht worden ;)
..., vor der Ausgabe zu prüfen ob ein bestimmter String vorkommt und den dann hervorzuheben?
weil ich aber dein spezielles problem nicht kenne, kann dir nur ein beispiel geben. sollte es unklar sein, einfach fragen ;)
es gibt alle datenbanknamen aus, wobei die systemtabelle(n) rot-bold gemacht werden. das ergebnis wird genau so einfach ausgegeben, wie du es willst (ochne if, weil, ... weißt der kuckuck). der wahre vorteil von 'if' innerhalb von queries ist aber der 100-1000 fache geschwindigkeit (sollte jemand daran zweifeln, im literatur nachlesen und nicht hier darüber spammen ;).
(dass mein beispiel eventuell auf lima langsam ist, basiert auf anderen dingen. mal auf localhost ausprobieren!)
Beitrag zuletzt geändert: 7.6.2012 14:55:34 von hemiolos -
Vielen Dank für eure Antworten!
Ich hab jetzt die Variante von hackyourlife verwendet (die schien am einfachsten zu sein) die bis auf einen kleinen Fehler super funktioniert!
Der Fehler war es
$ausgabe = '';
vor die While-Schleife zu schreiben. Wenn man das so macht, werden in jedem weiteren Durchgang die Daten an die der vorherigen Durchgänge angehängt und es entsteht eine Pyramide.
So funktioniert es perfekt:
$result = mysql_query('SELECT ...'); while($row = mysql_fetch_object($result)) { $ausgabe = ''; if ($row->Spalte == 'Das ist der String') { $ausgabe .= "<font color='red'>{$row->Spalte}</font>"; } else { $ausgabe .= $row->Spalte; } } echo($ausgabe);
Beitrag zuletzt geändert: 7.6.2012 19:48:48 von yorecords -
yorecords schrieb:
Du willst also nur die Zeilen hervorgehoben ausgeben wenn der String vorkommt??? Welchen Sinn hat das?
Wenn man das so macht, werden in jedem weiteren Durchgang die Daten an die der vorherigen Durchgänge angehängt und es entsteht eine Pyramide.
Das kannst du viel einfacher mit einer WHERE-Bedingung in der SQL-Abfrage machen:SELECT bla FROM tabelle WHERE Spalte = 'Das ist der String'
-
so funktioniert es perfekt ???? ... kann so doch garnicht sein .... :xD
Wenn du $ausgabe = ''; innerhalb der while() Schleife als Leerstring neu definierst,
dann wird bei jedem Durchgang der Wert von $ausgabe ja wieder auf "Leerstring" gesetzt
und dadurch kommen am Ende bei $ausgabe nur die Inhalte der letzten $row (Zeile) an
meiner Meinung nach MUSS $ausgabe = ''; vor die while() Schleife als neu definiert werden
und innerhalb der while() Schleife dann nur noch dran-hängen, mit $ausgabe .= "......";
so wie Du es im letzten Beitrag geschrieben hast,
kann es nur ein Zufalls-Treffer gewesen sein, das es funktioniert hat
und um - wie Du es nennst - "Pyramide" zu verhindern,
kannst Du ja Zeilenumbruch vor / nach jeder Einzel-Ausgabe machen: <br/> \n
hier nochmal der Code mit <span> und CSS anstatt <font> TAG
und mit Zeilenumbruch, jedes Ergebnis ausgeben, nicht nur die "roten"
(sonst wäre das else { } in der if Bedingung ja Sinnlos)
$result = mysql_query('SELECT ...'); $ausgabe = ''; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= "<br/> JAAA <span style=\"color:red;\">".$row->Spalte."</span> \n"; } else { $ausgabe .= "<br/> NEIN <span style=\"color:#000000;\">".$row->Spalte."</span> \n"; } } echo $ausgabe;
Eine Alternative wäre noch, es als Liste <ul> ausgeben
$result = mysql_query('SELECT ...'); $ausgabe = '<ul>\n'; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= " <li style=\"color:red;\">".$row->Spalte."</li>\n"; } else { $ausgabe .= " <li style=\"color:#000000;\">".$row->Spalte."</li>\n"; } } $ausgabe = '</ul>\n'; echo $ausgabe;
PS: .... style="color:#000000;" ist schwarze Schrift ... black .... :)
Beitrag zuletzt geändert: 7.6.2012 20:32:20 von guteseiten -
guteseiten schrieb:
so funktioniert es perfekt ???? ... kann so doch garnicht sein .... :xD
Wenn du $ausgabe = ''; innerhalb der while() Schleife als Leerstring neu definierst,
dann wird bei jedem Durchgang der Wert von $ausgabe ja wieder auf "Leerstring" gesetzt
und dadurch kommen am Ende bei $ausgabe nur die Inhalte der letzten $row (Zeile) an
meiner Meinung nach MUSS $ausgabe = ''; vor die while() Schleife als neu definiert werden
und innerhalb der while() Schleife dann nur noch dran-hängen, mit $ausgabe .= "......";
so wie Du es im letzten Beitrag geschrieben hast,
kann es nur ein Zufalls-Treffer gewesen sein, das es funktioniert hat
und um - wie Du es nennst - "Pyramide" zu verhindern,
kannst Du ja Zeilenumbruch vor / nach jeder Einzel-Ausgabe machen: <br/> \n
hier nochmal der Code mit <span> und CSS anstatt <font> TAG
und mit Zeilenumbruch, jedes Ergebnis ausgeben, nicht nur die "roten"
(sonst wäre das else { } in der if Bedingung ja Sinnlos)
$result = mysql_query('SELECT ...'); $ausgabe = ''; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= "<br/> JAAA <span style=\"color:red;\">".$row->Spalte."</span> \n"; } else { $ausgabe .= "<br/> NEIN <span style=\"color:#000000;\">".$row->Spalte."</span> \n"; } } echo $ausgabe;
Eine Alternative wäre noch, es als Liste <ul> ausgeben
$result = mysql_query('SELECT ...'); $ausgabe = '<ul>\n'; while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') { $ausgabe .= " <li style=\"color:red;\">".$row->Spalte."</li>\n"; } else { $ausgabe .= " <li style=\"color:#000000;\">".$row->Spalte."</li>\n"; } } $ausgabe = '</ul>\n'; echo $ausgabe;
PS: .... style="color:#000000;" ist schwarze Schrift ... black .... :)
Ne, so funktioniert es 100%ig. Hab es mehrmals versucht und sehe kein Problem. -
guteseiten schrieb:
Außer yorecords will etwas ganz anderes, ohne uns dies mitzuteilen.
Wenn du $ausgabe = ''; innerhalb der while() Schleife als Leerstring neu definierst,
dann wird bei jedem Durchgang der Wert von $ausgabe ja wieder auf "Leerstring" gesetzt
und dadurch kommen am Ende bei $ausgabe nur die Inhalte der letzten $row (Zeile) an
meiner Meinung nach MUSS $ausgabe = ''; vor die while() Schleife als neu definiert werden
und innerhalb der while() Schleife dann nur noch dran-hängen, mit $ausgabe .= "......";
so wie Du es im letzten Beitrag geschrieben hast,
kann es nur ein Zufalls-Treffer gewesen sein, das es funktioniert hat
guteseiten schrieb:
Wenn yorecords meinen Code verwendet passiert das bereits, nachdem der Code allerdings nochmals verändert wurde passiert das nicht.
und um - wie Du es nennst - "Pyramide" zu verhindern,
kannst Du ja Zeilenumbruch vor / nach jeder Einzel-Ausgabe machen: <br/> \n
Eventuell sollte yorecords nochmals beschreiben warum immer nur die letzte Zeile ausgegeben werden soll...
Auch wäre es interessant diese Pyramide zu sehen -
yorecords schrieb:
Ne, so funktioniert es 100%ig. Hab es mehrmals versucht und sehe kein Problem.
Aber Du bekommst so doch immer nur (!!!) die letzte Ausgabe / Zeile
wenn vorher in "Treffer" war, wird der wieder überschrieben .... ?!?!
ich denke immernoch das war wohl ein Zufalls-Treffer
dass zufälllig das letzte gefundene Ergebnis "gepasst" hat,
würde danach noch ein "nicht passendes" kommen, dann gehts schon nicht mehr
weil das vorher "passende" ja wieder überschrieben wird ....
Wenn Du prüfen willst, ob Spalte schonmal genau so belegt, gehts einfacher
für so ein Ergebnis bräuchtest Du gar nicht den String selber mit if in while prüfen
da geht es direkt in SQL wie hackyourlife es geschrieben hat
--- und dann "nur" prüfen, ob es überhaupt ein Ergebnis gibt.
Bsp:
Prüfen, ob die eMail-Adresse für neuer User schon von einem anderen User verwendet wird
// --- von User-Eingabe / Formular $neumail = mysql_real_escape_string($_POST['mail']); $sql = "SELECT id FROM userdata WHERE email = '".$neumail."' LIMIT 1"; $res = mysql_query($sql); if ( mysql_num_rows($res) == 1) { echo "<br />Die Email wird schon von einem anderen User verwendet ... zurück ... \n"; } else { echo "<br />OK ... die Email wird noch nicht verwendet (ist noch frei) ... weiter ... \n"; }
also nicht in if() den String prüfen, sondern ob SQL mind. 1 Ergebnis liefert
das ist einfacher (schneller) als die ganze Tabelle einzulesen und durchlaufen (while)
um zu Prüfen, ob in mind. 1er Zeile eine bestimmte Spalte einen bestimmten Wert hat.
geht also analog auch für Prüfung, ob Username schon existiert, etc.
... oder was hast Du sonst damit vor ??
hackyourlife schrieb:
Eventuell sollte yorecords nochmals beschreiben warum immer nur die letzte Zeile ausgegeben werden soll...
ich bitte auch darum :) mehr Input
und ich vermute mal, er will prüfen, ob der String schon im Feld vorhanden ist,
wie oben in meinem BSP die Email eines Users darf nur 1x in DB stehen
... dafür ist aber das mit "nur letzte Zeile" auch nicht geeignet .... !!
hackyourlife schrieb:
Auch wäre es interessant diese Pyramide zu sehen
ich vermute mal, er meint einfach die Aneinander-Reihung der Ergebnisse (Ausgaben) ohne Zeilenumbruch, zumindest passiert das wenn man bem dazu-schreiben der nächsten Ausgane keinen Zeilenumbruch einbaut. Aber scheinbar will er ja gar keine "Liste" sondern nur doe Prüfung ob String schon in DB (in Spalte), und je nacdem ob ja oder nein eine andere Ausgabe
... der Username ist noch frei ... oder .... der Username wird schon verwendet
bzw. siehe BSP mit email
Beitrag zuletzt geändert: 8.6.2012 9:05:01 von guteseiten -
Also wenn ich das mache wie hackyourlife geschrieben hat passiert folgendes:
| SPALTE 1 | SPALTE 2 | ACTION |
| Wert 1 | Wert 1 | Wert 1 |
| Wert 2 | Wert 2 | Wert 1 Wert 2 |
| Wert 3 | Wert 3 | Wert 1 Wert 2 Wert 3 |
| Wert 4 | Wert 4 | Wert 1 Wert 2 Wert 3 Wert 4 |
usw...
Also egal was passiert, es werden alle vorherigen Werte vorangesetzt.Wenn ich das aber auf meine Weise mache, wird $ausgabe in jedem Durchgang zuerst leer, und dann mit dem aktuellen Wert überschrieben.
Beitrag zuletzt geändert: 8.6.2012 16:00:05 von yorecords -
yorecords schrieb:
So wie du es hier beschreibst gibst du in der while-Schleife die Daten aus... und deshalb bekommst du für die 3. Spalte auch dieses Ergebnis.
Also wenn ich das mache wie hackyourlife geschrieben hat passiert folgendes:
| SPALTE 1 | SPALTE 2 | ACTION |
| Wert 1 | Wert 1 | Wert 1 |
| Wert 2 | Wert 2 | Wert 1 Wert 2 |
| Wert 3 | Wert 3 | Wert 1 Wert 2 Wert 3 |
| Wert 4 | Wert 4 | Wert 1 Wert 2 Wert 3 Wert 4 |
usw...
Also egal was passiert, es werden alle vorherigen Werte vorangesetzt.
Irgendwie weiß hier gerade niemand mehr (außer dir):
1) was ist der Code, der tatsächlich verwendet wird, also ungekürzt und unverändert
2) was soll erreicht werden? Zeilenweise ausgeben und bei Vorkommen des Wertes diesen hervorheben?
Wenn du z.B. meinen Code 1:1 so einsetzen würdest würde er dir alle Zeilen untereinander ausgeben, und es würde keine Pyramide entstehen. Aber nachdem du hier etwas am Code veränderst wovon wir nicht wissen müssten wir unsere Glaskugel benutzen, und meine ist gerade in Reparatur...
Wenn du das nicht sagen willst:
Nachdem du ja $ausgabe immer in der while-Schleife auf '' setzt, könntest du dir das Sparen und aus .= einfach = machen...$result = mysql_query('SELECT ...'); while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') $ausgabe = "<span style=\"color:red;\">{$row->Spalte}</span>"; else $ausgabe = $row->Spalte; echo("$ausgabe<br />"); }
-
hackyourlife schrieb:
yorecords schrieb:
So wie du es hier beschreibst gibst du in der while-Schleife die Daten aus... und deshalb bekommst du für die 3. Spalte auch dieses Ergebnis.
Also wenn ich das mache wie hackyourlife geschrieben hat passiert folgendes:
| SPALTE 1 | SPALTE 2 | ACTION |
| Wert 1 | Wert 1 | Wert 1 |
| Wert 2 | Wert 2 | Wert 1 Wert 2 |
| Wert 3 | Wert 3 | Wert 1 Wert 2 Wert 3 |
| Wert 4 | Wert 4 | Wert 1 Wert 2 Wert 3 Wert 4 |
usw...
Also egal was passiert, es werden alle vorherigen Werte vorangesetzt.
Irgendwie weiß hier gerade niemand mehr (außer dir):
1) was ist der Code, der tatsächlich verwendet wird, also ungekürzt und unverändert
2) was soll erreicht werden? Zeilenweise ausgeben und bei Vorkommen des Wertes diesen hervorheben?
Wenn du z.B. meinen Code 1:1 so einsetzen würdest würde er dir alle Zeilen untereinander ausgeben, und es würde keine Pyramide entstehen. Aber nachdem du hier etwas am Code veränderst wovon wir nicht wissen müssten wir unsere Glaskugel benutzen, und meine ist gerade in Reparatur...
Wenn du das nicht sagen willst:
Nachdem du ja $ausgabe immer in der while-Schleife auf '' setzt, könntest du dir das Sparen und aus .= einfach = machen...$result = mysql_query('SELECT ...'); while($row = mysql_fetch_object($result)) { if ($row->Spalte == 'Das ist der String') $ausgabe = "<span style=\"color:red;\">{$row->Spalte}</span>"; else $ausgabe = $row->Spalte; echo("$ausgabe<br />"); }
Wie gesagt: Die Werte sollen einfach untereinander in einer Tabelle ausgegeben werden und in einer Spalte sollen gewisse Werte hervorgehoben werden. Aber es ist jetzt eh egal, da es wie gesagt so einwandfrei funktioniert. Ich hab deinen Code anfangs 1:1 so eingesetzt, mit obigem Ergebnis. Dann hab ich es so versucht, da mir das logisch vorgekommen ist, und so funktioniert es auch.
Dennoch hier mal der ganze relevante Teil des Codes:
ob_start(); echo <<< heredoc <table border="1px" class="output-table"> <tr> <td align="center"><b>DATUM & ZEIT</b></td> <td align="center"><b>A C T I O N</b></td> <td align="center"><b>S E S S I O N</b></td> </tr> heredoc; while($row = mysql_fetch_object($get)) { $ACTION = ""; if ($row->ACTION == "ERFOLGREICHER LOGIN") { $ACTION .= "<font color='009900'>{$row->ACTION}</font>"; } elseif ($row->ACTION == "LOGOUT") { $ACTION .= "<font color='0000CC'>{$row->ACTION}</font>"; } elseif ($row->ACTION == "FALSCHE USERDATEN") { $ACTION .= "<font color='FF0000'><b>{$row->ACTION}</b></font>"; } else { $ACTION .= $row->ACTION; } echo $output = <<< heredoc <tr> <td align="center">$row->TIME</td> <td align="center">$ACTION</td> <td align="center"> $row->SESSION </td> </tr> heredoc; } echo <<< heredoc </table> <br> heredoc; $LOG_output = ob_get_contents(); ob_end_clean(); if (ob_end_clean() == false) { $errmsg = mysql_error(); $subject = "Puffer konnte nicht geleert werden"; $message = $errmsg; mail($to, $subject, $message); } echo $show_ADMIN_LOG <<< heredoc // ------ Mehr HTML und $LOG_output ----------- heredoc;
Und wie gesagt: Es funktioniert.
Danke für eure Hilfe!
Beitrag zuletzt geändert: 8.6.2012 17:24:45 von yorecords -
yorecords schrieb:
Das hast du leider erst jetzt gesagt... sag sowas bitte in Zukunft gleich am Anfang, denn das erspart allen einiges an Arbeit und Verwirrung.
Wie gesagt: Die Werte sollen einfach untereinander in einer Tabelle ausgegeben werden und in einer Spalte sollen gewisse Werte hervorgehoben werden.
BTW: das
-Tag ist noch immer veraltet, du solltest es durch<font>
und CSS ersetzen.<span>
-
hackyourlife schrieb:
yorecords schrieb:
Das hast du leider erst jetzt gesagt... sag sowas bitte in Zukunft gleich am Anfang, denn das erspart allen einiges an Arbeit und Verwirrung.
Wie gesagt: Die Werte sollen einfach untereinander in einer Tabelle ausgegeben werden und in einer Spalte sollen gewisse Werte hervorgehoben werden.
BTW: das
-Tag ist noch immer veraltet, du solltest es durch<font>
und CSS ersetzen.<span>
Ups.. Hab mir eingebildet, dass ich das gleich am Anfang geschrieben hab... Sorry.
Meißtens mach ich sowas eh mit CSS, aber in manchen Fällen ist mir das zu umständlich. Vor allem in diesem Beispiel ist es sowieso egal.. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage