Antworten auf deine Fragen:
Neues Thema erstellen

[PHP & mysql] aktuellesten Eintrag hervorheben

Zaolat

Aktives Mitglied

Moin Moin,

ich wende mich nochmal an euch zwecks Fragen zum Thema Time.

Die Suche im Forum und Google hat mir nicht so sehr geholfen.

Mein Anliegen ist, folgendes:

Ich lasse über eine .php Seite die Einträge aus der MYSQL Datenbank anzeigen. Die Einträge haben unter anderem eine Spalte mit der Bezeichnung 'time' (Typ = timestamp).

Alle Einträge in der Datenbank werden bereits erfolgreich aufgelistet. Nun möchte ich jedoch den Eintrag, der zuletzt innerhalb der letzten 1 Stunde neu angelegt, bzw. bearbeitet wurde, etwas hervorheben. Wie bekomme ich das hin?

Mein bisheriger Code sieht so aus:
Code:
$sql = "SELECT * FROM whiteboard_eintraege WHERE done = 0 ORDER BY datum";
            foreach ($pdo->query($sql) as $row) {
                if($row['time']<=time(6000)){
                echo "<p style='color:red;font-weight:bold;'>" . $row['datum']." - "; echo $row['eintrag']." </p>" . "<br />";
                    }
                else {
                    echo $row['datum']." - "; echo $row['eintrag']." <br />";
                }
               
        }

Kann mir einer von euch einen Tipp geben, was hier das Stichwort ist, um an mein Ziel zu kommen?
 

Zaolat

Aktives Mitglied

Danke für deine Info. Bisher reicht mein Verständnis dafür nicht aus. Ich muss mich noch intensiver mit dem Thema beschäftigen.
 

Curanai

Aktives Mitglied

Mein bisheriger Code sieht so aus:
Code:
$sql = "SELECT * FROM whiteboard_eintraege WHERE done = 0 ORDER BY datum";
            foreach ($pdo->query($sql) as $row) {
                if($row['time']<=time(6000)){
                echo "<p style='color:red;font-weight:bold;'>" . $row['datum']." - "; echo $row['eintrag']." </p>" . "<br />";
                    }
                else {
                    echo $row['datum']." - "; echo $row['eintrag']." <br />";
                }
            
        }


Hi, ist das noch akut? Zunächst einmal ein paar Schwächen in Deinem Query:
- SELECT * bitte nicht verwenden; Felder direkt eintragen (Performance!)
- "ticks" setzen bei allem, was Bezeichner in Spalten oder Table-Namen sind; bspw. "FROM `whiteboard_eintraege` (Performance!)
- time() hat keinen Übergabeparameter; und eine Stunde in PHP entspricht 60 * 60 (3600); aber "time(6000)" ist falsch
- ORDER BY `datum` würde mir womöglich noch ASC oder DESC wichtig sein (Du hast per se "ASC" drin, da keine Angabe)

Jetzt machen wir es etwas schwieriger, da ich das gerade aus dem Kopf runterpinne und nicht weiß, ob das stimmt - bitte nicht hauen!

Code:
$timestamp = strtotime($row ['time']);
... müsste Dir eigentlich (!!) aus Deinem MySQL-Timestamp-Format einen typischen time()-Timestamp in PHP machen. Oder ich bin gerade auf dem Holzweg (dann einfach mal bitte einen Eintrag aus der Tbl zeigen). ;)

Sollte das ein 10-stelliger Integer Wert sein (ich setze in meiner DB zu gern einen echte INT als Typ für sowas, weniger Gefrickel in der Folge), so machen wir es so ...
Code:
$timestamp = (int) $row['time']; // castet den erhaltenen Wert zu einem Integer; wenn Zeichenkette, kommt 0 raus

Soooo ... und dann könntest Du eigentlich Deine Flags setzen:
Code:
 if (($timestamp + 3600) >= time()){
    // bekommt Marker für jüngste Änderung ...
} else {
    // schon länger her ...
}
Ich mache es also genau anders herum: Letztes Änderungsdatum + Zeitfenster ist dann größer als der aktuelle Zeitstempel mittels time(), wenn er eben in der letzten Stunde modifiziert wurde. Anstatt ständig time() zu verwenden, schreibst Du das vor Deiner Schleife einfach in eine Variable (damit es nur 1x abgerufen wird).

Joar, damit müsstest Du eigentlich weiterkommen.

Viel Erfolg.
 

webcasi

Nicht mehr ganz neu hier

Hallo,
Du könntest auch schon im Select Statement an die Mysql Datenbank Dir einen Marker generieren

$sql = "SELECT spalte1, spalte2, (case when(spaltetimestamp + 3600 >= ".time().")
THEN 1 ELSE 0 END) marker from whiteboard_eintraege where done = 0 order by timestamp ASC"

Also wenn Deine Spalte + 1 Stunde größer dem aktuellen Timestamp ist, dann bist Du innerhalb Deiner Range.
Dann kriegt die Ergebniszeile den Marker 1 sonst eine 0

so kannst Du dann in der auslesenden Spalte eine if Bedingung auf die Spalte marker einfügen und wenn dieser 1 ist,
dann fügst Du den entsprechenden html Tag oder die Angabe des entsprechenden Stylesheets für Fettschrift hinzu.

Wenn jetzt timestamp und Änderungstimestamp 2 verschiedene Spalten sind (so sollte es sein, denn sonst weißt Du ja das Anlegedatum nicht mehr) dann musst Du das SQL erweitern in den Bedingungen.
 

Zaolat

Aktives Mitglied

Hi, ist das noch akut? Zunächst einmal ein paar Schwächen in Deinem Query:
- SELECT * bitte nicht verwenden; Felder direkt eintragen (Performance!)
- "ticks" setzen bei allem, was Bezeichner in Spalten oder Table-Namen sind; bspw. "FROM `whiteboard_eintraege` (Performance!)
- time() hat keinen Übergabeparameter; und eine Stunde in PHP entspricht 60 * 60 (3600); aber "time(6000)" ist falsch
- ORDER BY `datum` würde mir womöglich noch ASC oder DESC wichtig sein (Du hast per se "ASC" drin, da keine Angabe)

Jetzt machen wir es etwas schwieriger, da ich das gerade aus dem Kopf runterpinne und nicht weiß, ob das stimmt - bitte nicht hauen!

Code:
$timestamp = strtotime($row ['time']);
... müsste Dir eigentlich (!!) aus Deinem MySQL-Timestamp-Format einen typischen time()-Timestamp in PHP machen. Oder ich bin gerade auf dem Holzweg (dann einfach mal bitte einen Eintrag aus der Tbl zeigen). ;)

Sollte das ein 10-stelliger Integer Wert sein (ich setze in meiner DB zu gern einen echte INT als Typ für sowas, weniger Gefrickel in der Folge), so machen wir es so ...
Code:
$timestamp = (int) $row['time']; // castet den erhaltenen Wert zu einem Integer; wenn Zeichenkette, kommt 0 raus

Soooo ... und dann könntest Du eigentlich Deine Flags setzen:
Code:
 if (($timestamp + 3600) >= time()){
    // bekommt Marker für jüngste Änderung ...
} else {
    // schon länger her ...
}
Ich mache es also genau anders herum: Letztes Änderungsdatum + Zeitfenster ist dann größer als der aktuelle Zeitstempel mittels time(), wenn er eben in der letzten Stunde modifiziert wurde. Anstatt ständig time() zu verwenden, schreibst Du das vor Deiner Schleife einfach in eine Variable (damit es nur 1x abgerufen wird).

Joar, damit müsstest Du eigentlich weiterkommen.

Viel Erfolg.

Heute kam ich auf der Arbeit endlich dazu, bei diesem Projekt weiter zu machen. Deine Hilfestellung hat soweit gut geklappt.
Nun muss ich mir noch beibringen, wie ich in der If - Else Schleife html Code einbringen kann, um die Inhalte der dort mit Echo ausgegebenen Variablen per css ansteuern zu können.

Derzeit sieht mein Code so aus:
Code:
         <?php
       
        $sql = "SELECT * FROM whiteboard_eintraege WHERE done = 0 ORDER BY datum";
                           
        foreach ($pdo->query($sql) as $row) {
            $timestamp =  strtotime($row['time']);
            if (($timestamp + 3600) >= time()) {
                echo "<p class='aktuell'>" . $row['datum']." - "; echo $row['eintrag']."</p>" . "</ br>";
           
            } else {
               
                echo "<p class='alt'>" . $row['datum']." - "; echo $row['eintrag']."</p>" . "</br>";           
            }
                       
       
        }
        ?>

Vor meinen Änderungen, wurden die einzelnen Datensätze aus der Datenbank untereinander aufgelistet.

Nun, nach diesen Änderungen, werden die Datensätze nebeneinander angezeigt.
 
Zuletzt bearbeitet:

webcasi

Nicht mehr ganz neu hier

Hallo,

Zuerst einmal wie ist die Klasse "alt" definiert?

Du müsstest Dich doch ein bisschen mit html und css auskennen oder?
Ich habe mal auf die Schnelle was rausgesucht, was es Dir vielleicht verdeutlicht. Die CSS Klassen ausarbeiten musst Du selber.
Es sieht auch ein wenig komisch aus, Du schließt das </br> aber es taucht nirgendwo vorher auf.

Ein Beispiel sähe so aus:
Code:
<html>
  <head>
    <meta charset="utf-8">
    <title>font-weight</title>
    <style>

      dl {font: 2em/100% sans-serif;}
      dd {margin: -1em auto auto 2em;}
      .w100 {}
      .w200 {font-weight: bold;}
      .fetter {font-weight: bolder;}

    </style>
  </head>
  <body>
       <dl>
      <dt class="w100">100</dt><dd class="w100">Beispieltext</dd>
      <dt class="w200">200</dt><dd class="w200">Beispieltext</dd>
          </dl>
    <h2>Angabe von relativen Werten</h2>
    <dl>
      <dt class="w200">200</dt><dd class="w200">Beispieltext für <span class="fetter">fettere</span>Schrift</dd>
         </dl>
  </body>
</html>
 

Curanai

Aktives Mitglied

Ui, das läuft falsch - hallo in die Runde. Freut mich, dass Du, Zaolat, wieder dran bist ... anders lernt man es ja auch nicht. ;) Legen wir also mal los ...

Wie webcasi schrieb, ist Dein "break" falsch - es war in XHTML mal so, dass es als "<br />" geschrieben wurde, in HTML5 macht man (wie in HTML4.01) eigentlich nur noch "<br>". Und, webcasi, einen öffnenden "<br>" gab es noch nie. :D

Dann lass Dich bitte nicht vom Muster von webcasi verwirren - dt und dd (die Tags) sind für Definitionslisten und ihre Daten. Bitte nicht einfach so übernehmen ... das ist HTML5-Semantik und wenn Du es Dir jetzt falsch aneignest, wirst Du Dich im Pro-Bereich später wundern, warum etwas nicht klappt - bspw. mit Google. Sorry, webcasi, vergiss Du, Zaolat, das Posting mit dem CSS von webcasi. :D (gerade der Einsatz von em mit Prozent etc. ... nein, viel zu früh für unseren Zaolat)

Also ... Ausgabe ... aufgrund der verschiedenen Browser und ihren Eigenarten ist es IMMER, IMMER und IMMER notwendig, dass Du für alle Browser eine Basis schaffst. Nur als Beispiel: Dein benutztes Paragraph-Tag wird in den drei gängigen Browsern unterschiedlich dargestellt; ausgelöst durch das "margin" (Außenabstand) nach unten. Stellst Du bpsw. vier Parapraphen untereinander, gibt es immer leichte Abweichungen in verschiedenen Browsern.

Um dies zu umgehen, setzt man alle Browser-Standardwerte erstmal zurück. Hierzu bedient man sich etwas namens "normalize.css" (darüber findest Du via Google eine CSS-Datei, die diesen Job für Dich macht; ins Projekt einbinden und ab da sieht Dein Aufbau für alle Browser gleich aus; hier liegt die aktuelle Version 8.01 [originale Herausgeber-Seite]).

Sooo ... dann wirst Du irgendwo schon - was webcasi korrekt meinte - CSS im Einsatz haben, was jetzt wohl einen "float" (ähnlich Fließtext um ein Bild) hat ODER Dein Parapraph (das p-Tag) ist in seiner Breite von Dir angefasst worden ("width: 200px" bspw.); dann flanscht der Browser womöglich einen Folge-Pragraph direkt dahinter und es sieht einreihig aus. Einblick kannst Du Dir mittels Rechtsklick verschaffen - mit der sog. "Entwicklerkonsole". Hierzu klickt Du mal bitte mit der rechten Maus auf eine Deiner Ausgaben und wählst im sich öffnenden Menü "Untersuchen" (Firefox: Element untersuchen) aus. Du bekommst dann in einem weiteren Fenster exakt diese Stelle im Quellcode angezeigt - zzgl. CSS.

Vorschlag: Nimm mal die Paragraphen raus und arbeite zu anfangs nur mit "<br><br>" (zwei Mal Zeilenumbruch).

Soweit so chic ... und DANN wäre da das Problem mit Deinem Wunsch: ein "echo" im PHP an einer Stelle irgendwo in der HTML-Seite. Mmmhm ... ich mache sowas hier schon etwas länger und kenne organisch gewachsene Projekte: tue es nicht! Generiere Dir im PHP-Teil die Ausgabe und schreibe diese in eine Variable. An der Stelle, wo das ausgegeben werden soll, gibt es max ein "echo $meineVariableMitDemString;" - fertig!

Als Beispiel gaaanz rudimentär erklärt ...

PHP:
<?php 
$meinString = ""; // leer
for ($i = 0; $i < 10; $i++) {
   $meinString .= $i . " - ";
}
?>
<html>
  <body>
    <?php echo $meinString; // ergibt sowas wie: 0 - 1 - 2 - ... 9 - ?>
  </body>
</html>

Mit anderen Worten: Trenne Logik von Ausgabe! Du wirst es mir - wenn Du am Ball bleibst - irgendwann mal später danken!!! Spätestens dann, wenn Du Klassen und Funktionen für Dich entdeckst, geht's rund mit return-Werten etc.

Was Dir mein kleines Beispiel oben auch zeigt: wie Du Zeichenketten "konkatenierst" - also einfach aneinander hängst. Das regelt der "Punkt" (.). Statt also ...
PHP:
echo $a; echo $b;
... zu machen, probiere dies ...
PHP:
 echo $a . " " . $b;

Der Punkt verbindet zwei Zeichenketten - ich habe mittels " " noch ein Leerzeichen dazwischen gesetzt.

Damit ergibt sich für Dein Beispiel oben ...
PHP:
<?php
       
        $sql = "SELECT * FROM whiteboard_eintraege WHERE done = 0 ORDER BY datum";
        $ausgabe = ""; // neu!
        $aktuelleZeit = time(); // da schlug ich vor, den nur 1x abzufragen
        foreach ($pdo->query($sql) as $row) {
            $timestamp =  strtotime($row['time']);
            if (($timestamp + 3600) >= $aktuelleZeit) {
                $ausgabe .= "<p class='aktuell'>" . $row['datum'] . " - " . $row['eintrag'] . "</p><br>";
            } else {
                $ausgabe .=  "<p class='alt'>" . $row['datum'] . " - " . $row['eintrag'] . "</p><br>";
            }
        }

       echo $ausgabe; // !
?>

Eines muss ich Dir jetzt schon hoch anrechnen - Du scheinst mit der PSR (Code-und Formatierungsrichtlinien für PHP in Kontakt gekommen zu sein): foreach () { ... } ... oder if () { ... } ... (die Formatierung und eingesetzten Leerschritte) ... das ist schon goldrichtig!! Super Sache und gut gemacht!!!

Meld Dich, wenn es irgendwo knirscht oder Probleme gibt ... !
 

Zaolat

Aktives Mitglied

Vielen Dank Curanai für deine unterstützenden Antworten. Ich mach mich dann mal ran und versuche deine Tipps durch praktische Umsetzungen zu verstehen ;-)
 

webcasi

Nicht mehr ganz neu hier

doch einen öffnenden <br> gab es schon, denn dann wird der Break nur ausgeführt, wenn auch danach in der Schleife noch eine neue Zeile folgt.
Wenn man mit jeder neuen Zeile am Ende einen<br> einfügt, dann hat man nach der letzten Zeile in der Schleife auch noch einen Zeilenumbruch. Es geht darum, ob es hier gewollt ist. Wie gesagt es geht nicht um "ankreiden", sondern darum was Zaolat will.
Da wir seine CSS Klassen, nicht kennen, wissen wir nicht genau wie es dargestellt werden soll.

Außerdem sollten grundlegende CSS Definitionen schon bekannt sein, denn er/sie beschreibt von einem Projekt auf der Arbeit. Daher gehe ich von Grundkenntnissen aus, die wir in der CSS Deklarationen nicht kennen. Ich habe daher auch nur was globales aus dem Web herausgesucht. Es soll ja nur ein Anhaltspunkt sein. Ein Forum ist ja nicht dazu da, die komplette Lösung zu präsentieren.
 

webcasi

Nicht mehr ganz neu hier

vielleicht habe ich mich mit dem "öffnenden" <br> falsch ausgedrückt. Aber wie gesagt ohne das CSS zu der Klasse kann man da nicht viel zu sagen
 

webcasi

Nicht mehr ganz neu hier

ich hoffe es war ein Anhaltspunkt und Du konntest damit einen Denkanstoss für Dich generieren.
Mir zumindest geht es damit immer "gut", denn dann kann ich was lernen, was vielleicht den "Wald vor lauter Bäumen" lichtet.
Beim nächsten Mal guckt man gleich drauf.
@Curanei: vielen Dank für den Hinweis auf falsche Formulierung.
 

Curanai

Aktives Mitglied

@webcasi: Ich bin nicht nachtragend, keine Sorge ...;)

Reden wir nochmal über die Bezeichnung "öffnende Tags" (damit hier keine Verwirrungen entstehen): Es wäre mir sogar sehr neu, wenn man in einer Schleife mittels <br>-startend diesen Ausdruck nimmt. Und wenn Du in der Schleife Deine Zählervariable im Auge hast, wird auch nie an den letzten Eintrag ein "<br>" gehängt; alternativ kannste das auch mittels substr() direkt nach der Schleife wieder rausnehmen.

In meiner Welt ist ein "öffnendes Tag" bspw. <body>, <html>, <head>, <strong>, <textarea>, <div>, <span> usw. - denn all die haben noch ein schließendes Tag (das haben fast alle in ihrer Auszeichnungssprache HTML). Es gibt vielleicht knapp 20 "empty tags" - die haben allenfalls Attribute, aber niemals:
  • child nodes (andere Tags)
  • reinen Text
  • Inhalt bei Zugriff mittels JavaScript (innerText und innerHTML ist immer null)
<br> ist ein empty tag ... hat also kein "öffnendes Tag" und erfüllt die obigen Kriterien vollends. :)

Hmm, zugegeben: klingt jetzt ganz schön nach Schlaumeier-Modus - okay, das tut mir leid, aber es wirkte auf mich wie "Erklärung nötig".

Projekte: Viele Wege führen nach Rom - versprochen! :) Es gibt immer mehr Lösungen als die eine ... es gibt unterschiedliche Denk- und Herangehensweisen und auch nicht den Weg. Den geht schließlich jeder selber - aber es gibt bequeme Schuhe. ;) Je komplexer ein Projekt wird, umso wichtiger ist die Ausgangsbasis. Und wenn die in ein gutes Fundament gegossen ist, kann man alles bauen.

Ich habe zwar keinen Urlaub, aber ich wünsche euch schöne Feiertage und lasst den Computer bzw. das Handy ruhig mal aus.

@Zaolat: Weiterhin viel Erfolg.

Beste Grüße
 

webcasi

Nicht mehr ganz neu hier

@Curanei:
Ich bin auch nicht nachtragend, keine Sorge ...;) aber Du hast Recht und hast es auf den Punkt gebracht.

Ich habe mich vielleicht in dem Moment ein wenig unklar ausgedrückt, weil ich in dem Moment 2 Sachen gemacht habe.

Ich wollte nur einen Tip geben und wie schon gesagt, war das CSS und die Definition ja nicht gepostet. Wie die genaue Detaildarstellung sein sollte, war mir nicht bekannt. Ich kenne auch nur das <br> aber irgendwie war das nicht klar gepostet. Ich wollte nur kurz einen Anhaltspunkt liefern, da Zaolat ja sagte er mache das Projekt in der Firma und ich davon ausging, dass er mit den kleinen Hilfestellungen was anfangen kann. Einen Zeilenumbruch in html macht wohl heute jeder WYSIWYG Editor richtig.
Ob er <p> oder <br> nimmt ist eine Formatierungssache oder eben Layout wie es der Entwickler will oder der User es vorschreibt. Ich hoffe dass die Hinweise zu CSS Klassen oder eben html Definition in jeder einzelnen Zeile damit machbar sind.

Vielleicht ist es unter Entwicklern manchmal schwierig zu kommunizieren :) Es ist aber auch immer einfacher wenn der ganze Code inklusive von eingebundenen CSS Klassen vorliegt. Dann kann man das nehmen und genau sagen, was ggf. in der Darstellung falsch läuft. Die 100%ige Lösung wird ganz selten in Foren kommuniziert, weil meistens vom Entwickler eigene Layoutvorstellungen einfließen. Wie gesagt: Es sind immer Denkanstösse wie es laufen könnte.

Auch ich wünsche Euch allen ein frohes Weihnachtsfest.
 

Curanai

Aktives Mitglied

Ob er <p> oder <br> nimmt ist eine Formatierungssache
Mmmmhm ... nein. Hier fliegt Dir erneut die Semantik von HTML5 um die Ohren und wofür man ein <br> noch nutzen soll: in einem Paragraph im Falle von benötigten Zeilenumbrüchen (bspw. Gedichte); aber nicht mehr für Abstände (vgl. b, i, em usw.).

webcasi, ich freue mich schon auf unsere nächsten Aufeinandertreffen ... einfach nur, weil ich glaube herauszulesen, dass Du genauso einen an der Murmel hast wie ich - und Schreiben kannste auch. :D

Wir kreuzen die Klinge bestimmt wieder. :) ... bis dahin!
 

webcasi

Nicht mehr ganz neu hier

Hallo Curanei,

ja das stimmt ich habe genauso einen an der Murmel und manchmal zig Gedanken gleichzeitig. Aber Frauen sind ja manchmal Multitaskingfähig :)

Ich wünsche allen ein Frohes Weihnachtsfest und bis zum nächsten Mal
 
M

Maikl H

Guest

Ein paar (überflüssige) Anmerkungen
if und else sind keine Schleifen, es sind Bedingungen. Schleifen sind so nette Sachen wie for, foreach ...
Bei einer mysql Abfrage den * generell abzulehnen kommt auf die Tabelle und die benötigten Spalten an. Will ich die INhalte aller Spalten ausgeben, ist der * durchaus berechtigt.
Bei der Sortierung ist asc überflüssig, da dies von mysql ohnehin angenommen wird. Anders sieht es aus bei desc, dies muss angegeben werden.
In der foreach-Schleife von curani (Beitrag vom 19.12.2018) würde ich $ausgabe als Array gestalten, statt als String; genau genommen ein assoziatives Array . Dies erleichtert den Zugriff auf einzelne Einträge welche derzeit mit Bindestrich getrennt sind und nur über explode selectiert werden könnten - also wieder ein Array.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.611
Beiträge
1.538.341
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben