Order by Date funktioniert nicht ganz
bearbeitet von
Hallo @portseven,
> hab ein Chat System Programmiert. Alles läuft perfekt außer das er mir nicht die neusten Chat's zuerst sortiert.
Ich gehe mal durch deinen Code und stelle ein paar Verständnisfragen:
> ~~~PHP
> $user = $pdo->prepare("
> SELECT * FROM user;");
>
> if(!$user->execute()) {
> print_r($user->errorInfo());
> }
> ~~~
- Hat das Newline im SQL-Statement einen Grund?
- Warum selektierst du blind alle Felder per Wildcard und nicht ausschließlich die gewünschten?
- Was passiert im Fehlerfall, wird da nur die `errorInfo` ausgegeben und das Programm läuft einfach weiter oder wird es ordnungsgemäß beendet?
> ~~~php
> <?php while($row = $user->fetch(PDO::FETCH_ASSOC)) { ?>
> <form class="left" action="" method="GET">
> ~~~
Du öffnest für *jeden Eintrag* in der Datenbank ein neues Formular, aber ich sehe nirgends typische Formularelemente oder das beendende `</form>`-Tag.
> ~~~php
> if($stmt = $pdo->prepare("
> SELECT
> msg.id,
> msg.user_id,
> msg.sender_id,
> msg.message,
> msg.date
> FROM msg
> WHERE msg.user_id = :user_id AND sender_id = :sender_id || msg.user_id = :sender_id AND msg.sender_id = :user_id ORDER BY date DESC LIMIT 1;"))
> {
>
> }
> $stmt->BindParam(':user_id', $_SESSION['id']);
> $stmt->BindParam(':sender_id', $row['id']);
>
> if(!$stmt->execute()) {
> print_r($stmt->errorInfo());
> }
> ~~~
1. Du bereitest die gleiche Query *in jedem Schleifendurchlauf* vor. Der Sinn von Prepared Statements ist es gerade, *einmal prepare* aufzurufen und *mehrmals bind*.
2. kannst du diese Query hier mit der oben in *eine Query* verheiraten.
3. Der Rückgabewert von prepare wird ignoriert – wie sieht es mit der Fehlerbehandlung aus?
4. Von welchem SQL-Spaltentyp ist denn dein msg.date-Feld?
> ~~~php
> <?php while($row2 = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
> <section class="all-user-list-msg">
>
> <a href="messages.php?u=<?php echo $row['id']; ?>">
>
> <p class="img">
> <img src="<?php echo $row['image']; ?>">
> </p>
> ~~~
- `p class="img"` mit lediglich einem `img` (ohne alt-Attribut!), das klingt prinzipiell nach einer `figure` – und das img trotzdem mit einem alternativen Text.
- Die Kontextwechsel nach HTML und URI werden nicht behandelt.
> ~~~php
> <p class="date"> • <?php $time = convertTime($row2['date']); echo $time; ?></p>
> ~~~
- Die vielen Leerzeichen tun zwar nicht weh, haben aber keine Funktion. Aber was macht das Steuerzeichen 149 da?
- Die Ausgabe der Zeit kann ohne Zwischenvariable auskommen.
Viele Grüße
Robert