Ankündigung

Einklappen
Keine Ankündigung bisher.

Nachrichtensystem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Nachrichtensystem

    Hallo.

    Ich versuche ein Nachrichtensystem zu realisieren, und brauche noch den letzten Denkanstoß.

    Das ist die (so meine ich) die Fehlerhafte SQL Datenbankabfrage bei der ich mir den Kopf zerbreche.:

    Code:
    $sql = "SELECT nachrichten.*, antworten.* FROM nachrichten
    LEFT JOIN antworten ON nachrichten.id = antworten.chat_id
    WHERE antworten.chat_id = nachrichten.id AND nachrichten.autor = '{$id}' OR nachrichten.bezieher = '{$id}' AND antworten.autor = '{$id}' OR antworten.bezieher = '{$id}'";
    $result = $pdo->query($sql);
    Die Spalten heißen:

    nachrichten: id, autor, bezieher, titel, nachricht, datum

    sowie:

    antworten: id, chat_id, autor, bezieher, titel, nachricht, datum

    Die ganze Konversation soll dann auf die nachrichten Tabelle aufbauen in der (durch die id) die chat_id generiert wird.

    Anschließend soll die Konversation in einer Schleife sortiert nach Datum angezeigt werden.

    Ich hoffe Ihr könnt mir helfen.

    Christian

    (So soll es nachher aussehen: https://www.w3schools.com/howto/howto_css_chat.asp)


  • #2
    Du musst dich entscheiden, ob nur Nachrichten mit Antworten (INNER JOIN) oder auch Nachrichten ohne Antworten (LEFT JOIN) angezeigt werden sollen.
    Außerdem sollte man AND und OR nicht wild mischen, sondern wenn dann entsprechend einklammern was zusammengehört:

    Code:
    WHERE antworten.chat_id = nachrichten.id -- Hiermit machst du deinen Left Join zum Inner Join
    AND (nachrichten.autor = '{$id}' OR nachrichten.bezieher = '{$id}')
    AND (antworten.autor = '{$id}' OR antworten.bezieher = '{$id}')"; -- und hier auch
    Weitere Probleme:
    - SELECT * unbedingt vermeiden
    - Prepared Statements verwenden
    Eine Mannschaft aus Granit! So wie einst Real Madrid!
    Und so zogen wir in die Bundesliga ein und wir werden wieder Deutscher Meister sein!

    Kommentar


    • #3
      Danke Meister1900

      Und wie geht der Left Join?

      Vielen Dank im Voraus.

      Christian

      Kommentar


      • #4
        Den hast du ja bereits gepostet. Wenn du LEFT JOIN willst, lasse die rot markierten Kriterien weg bzw. baue dein WHERE um.
        Prüfe die Felder aus antworten dann nicht auf fixe Werte, sondern berücksichtige, dass es dann auch null Werte geben kann.
        Eine Mannschaft aus Granit! So wie einst Real Madrid!
        Und so zogen wir in die Bundesliga ein und wir werden wieder Deutscher Meister sein!

        Kommentar


        • #5
          Antworten und Nachrichten sind 2 Tabellen, die fast identisch sind.
          Willst Du mit der Konstruktion wirklich abbilden, wer angefangen hat und Dich auf 2 Teilnehmer beschränken?

          Kommentar


          • #6
            Perry Staltic :

            Ja, ich will mit der Konstruktion wirklich abbilden, wer angefangen hat und mich auf 2 Teilnehmer beschränken.

            Kommentar


            • #7
              Meister1900 Und wie soll ich die WHERE umbauen, dass sich daraus die Konversation ergibt?

              Danke schon mal im Voraus.

              Kommentar


              • #8
                Zitat von king-ich Beitrag anzeigen
                Hallo.

                Ich versuche ein Nachrichtensystem zu realisieren, und brauche noch den letzten Denkanstoß.

                Das ist die (so meine ich) die Fehlerhafte SQL Datenbankabfrage bei der ich mir den Kopf zerbreche.:

                Code:
                $sql = "SELECT nachrichten.*, antworten.* FROM nachrichten
                LEFT JOIN antworten ON nachrichten.id = antworten.chat_id
                WHERE antworten.chat_id = nachrichten.id AND nachrichten.autor = '{$id}' OR nachrichten.bezieher = '{$id}' AND antworten.autor = '{$id}' OR antworten.bezieher = '{$id}'";
                $result = $pdo->query($sql);

                Das ist IMHO schon Murks. Bei Deiner 2-Tabellen-Lösung, warum hast Du die JOIN-Condition nochmals als WHERE-Condition? Das ist flüssiger als Wasser, also überflüssig.

                Dann: Du hast Inhalte der Konversation in 2 Tabellen. Auch das ist Murks.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  akretschmer

                  Und wie geht's richtig?

                  Steh auf'm Schlauch...

                  Kommentar


                  • #10
                    Zitat von king-ich Beitrag anzeigen
                    akretschmer

                    Und wie geht's richtig?

                    Steh auf'm Schlauch...
                    dazu müßte ich mehr wissen.
                    • kann es auf die Antworten wieder Antworten geben? und so weiter ...
                    • sind da immer nur exakt 2 (sender, empfänger) beteiligt oder mehr?


                    mal so als 2 sich aufdrängende Fragen ...
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • #11
                      akretschmer :

                      Ja, auf die Antworten kann es wieder Antworten geben.

                      Und ja, es sind immer nur exakt 2 (Sender und Empfänger) beteiligt.

                      Das sind der Eingeloggte, und der Empfänger / Sender einer Antwort bzw. Nachricht...

                      Kommentar


                      • #12
                        nun, das ganze Bild ist mir noch nicht klar. Können die Teilnehmer wechseln? A sachreibt, B antwortet, C antwortet, A antwortet, X antwortet? Oder bleibt es immer zwischen 2?

                        Mal als grobe Idee:

                        Code:
                        test=# create table teilnehmer(id serial primary key, name text);
                        CREATE TABLE
                        test=*# create table thread(id serial primary key, titel text);
                        CREATE TABLE
                        test=*# create table nachrichten (id bigserial primary key, ts timestamp, sender int references teilnehmer, receiver int references teilnehmer, thread int references thread, message text, check(sender != receiver));
                        CREATE TABLE
                        test=*#
                        wie gesagt, vermutlich fehlen da Felder, die Du noch brauchst. Eventuell könnte man in den Nachrichten noch die ID derjenigen mit aufnehmen, auf die man antwortet.

                        Andreas
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Das ganze soll eigentlich nur ein Chat zwischen 2 Personen sein, bei dem die Nachrichten in der Datenbank gespeichert werden, um sie dann nach Datum sortiert, mit der Möglichkeit zu antworten oder zu ergänzen, wieder auszugeben.

                          Kommentar


                          • #14
                            Ich habe ein bisschen gearbeitet:

                            Leider zeigt der Bildschirm mir nur eine weiße Seite... (?)

                            Kann mir jemand helfen?

                            Kommentar


                            • #15
                              Error-Reporting anschalten bzw. hochschrauben und dann Error-Log prüfen
                              Eine Mannschaft aus Granit! So wie einst Real Madrid!
                              Und so zogen wir in die Bundesliga ein und wir werden wieder Deutscher Meister sein!

                              Kommentar

                              Lädt...
                              X