Sebastian: Textabfrage

Hallo,

mal wieder ich.^^

Ich hab wiedermal ein Problemchen.......

Ich möchte in meinem Chat die Textausgabe unter den folgenden Bediengungen ausgeben:

  • als empfänger ist niemand(alle) also 0
  • man selbst is der empfänger
  • man ist der absender
    und er soll ab dem letzten eintrag also seitdem man eingeloggt is anzeigen..also bevor du eingeloggt warst die nich...und er soll ab da 100 nachrichten ausgeben....

Nun macht er da mucken... und gibt die z.B. nicht ab 200 aus da wo der letzte Eintrag war sondern erst ab 211!
Und ich weiß schonmal das es an den Bediengungen liegt weil wenn ich die wegnehme klappt es.

$textabfrage = mysql_query("SELECT * FROM chat WHERE empfaengerid LIKE '0' OR empfaengerid LIKE '$userrow->id' OR absender LIKE '$userrow->username' LIMIT $last,100");
while($textrow = mysql_fetch_object($textabfrage))
{
//ausgabe//
}

Vielen Dank im vorraus und mit freundlichen Grüßen
Sebastian

  1. Hi,

    auf die Idee, Dir den Query mal ausgeben zu lassne und z.b. direkt in Phpmyadmin abzusetzen bist auch schon gekommen?

    1. ??*nix peil*??

      das soll ein chat sein und für alle zu sehen sein und nicht nua für mich in PhpMyAdmin.......

      also ich glaub einfach das es zuviele bediengungen für den server sind wobei man ja eigentlich sagt das die technik von heute so schnell nicht aufgibt...und die bediengungen überschneiden sich auch nicht...

      und...bitte das nächstemal darauf achten was ich schreibe ;)

      1. Yerf!

        ??*nix peil*??

        das soll ein chat sein und für alle zu sehen sein und nicht nua für mich in PhpMyAdmin.......

        Und das was Steel schreibt nennt man Debugging und ist ein Vorgang nur für den Entwickler...

        Es geht darum
        a) zu sehen, welches Statement nun genau an den Datenbankserver gesendet wird (nach dem Einsetzen der Variablen) und
        b) welche Antwort der Datenbankserver gibt.

        Gruß,

        Harlequin

        1. es wäre natürlich auch möglich mir einfach nur eine antwort zu geben da ich des ding zichtausendmal angeguckt habe!!!

          1. Yerf!

            es wäre natürlich auch möglich mir einfach nur eine antwort zu geben da ich des ding zichtausendmal angeguckt habe!!!

            Das Problem ist dass man anhand des PHP-Codes nur sagen kann: sieht eigentlich gut aus und sollte gehen. Der Fehler steckt also vermutlich im Inhalt der PHP-Variablen oder an der Datenbankstruktur. Diese sind aber aus deinem Posting heraus nicht ersichtlich...

            Lass dir also das fertige Statement per echo ausgeben und poste es hier, am besten mit dem Ergebnis (notfalls gekürzt) das phpmyadmin bei diesem Statement liefert. Ansonsten hat hier keiner eine Chance den Fehler zu finden.

            Gruß,

            Harlequin

            1. Feld Typ Null Standard
              id   bigint(20)  Nein
              absender   varchar(50) Nein
              datum   varchar(15) Nein
              zeit   varchar(8) Nein
              text   longtext Nein
              ip   varchar(15) Nein
              empfaengerid   int(8) Nein  0
              empfaenger   varchar(25) Nein
              spezial   int(1) Nein  0

              $userrow->username ist halt der Username vom Leser und $userrow->id ist halt die ID vom leser... 0 steht dafür das es nicht geflüstert wird also jeder es lesen kann....

              1. Yerf!

                $userrow->username ist halt der Username vom Leser und $userrow->id ist halt die ID vom leser... 0 steht dafür das es nicht geflüstert wird also jeder es lesen kann....

                Hm, wenn diw Werte wirklich so sind sollte es eigentlich passen.

                Allerdings beschleicht mich gerade ein ganz seltsames Gefühl... wie ermittelst du $last? Ebenfalls unter einbezug der WHERE-Einschränkung? Ich tipp jetzt mal ganz stark auf nein...

                Gruß,

                Harlequin

                1. hehe...lol

                  Ich nehme einfach die ID vom letzten Eintrag bevor der User irgendwas geschrieben hat und bevor die Systemnachricht kommt das ein neuer User gekommen ist. Die ID wird dann als $last per GET übermittelt und dann im Lese-Fenster werden die Nachrichten ab dieser ID angezeigt.

                  1. Yerf!

                    Ich nehme einfach die ID vom letzten Eintrag bevor der User irgendwas geschrieben hat und bevor die Systemnachricht kommt das ein neuer User gekommen ist. Die ID wird dann als $last per GET übermittelt und dann im Lese-Fenster werden die Nachrichten ab dieser ID angezeigt.

                    Öhm... also noch schlimmer als befürchetet:

                    LIMIT schränkt auf Zeilennummern ein, nicht auf den Primärschlüssel. Du verlässt dich also darauf, dass diese 2 Angaben übereinstimmen. Was ist Allerdings, wenn IDs fehlen oder diese nicht sortiert sind?

                    Ein 'order by' steht nicht in deinem Statement, darauf verlassen dass man die Einträge in der gleichen Reihenfolge bekommt, wie man sie geschrieben hat sollte man sich aber besser nicht.

                    Fehlende IDs in der Reihenfolge können nicht nur durch gelöschte Einträge entstehen, sondern z.B. auch durch Einschränkungen beim Select (wie in deinem Beispiel). Du wolltest die Einträge ab 200 hast aber ab 211 bekommen? Ich tippe mal, dass da 11 Whispers sind, die nicht an diesen User gerichtet waren...

                    Wenn die IDs sicher lückenlos sind könntest Du in der Abfrage auf ID>200 AND ID<300 abfragen.

                    Gruß,

                    Harlequin

                    1. Ahhh....Danke!!... Das heißt wenn ich das weiter als $last übertragen möchte müsste ich die letzte ID wie gehabt abfragen und dann bei der Ausgabe ID>$last und davor noch $max definiern mit $last + 100 weil ich ja 100 einträge angezeigt haben will und dann bei der Ausgabe noch ID<$max machen ....und jetzt sag mir das ich richtig liege?^^

                      Gruß
                      Sebastian

                      1. Yerf!

                        Ahhh....Danke!!... Das heißt wenn ich das weiter als $last übertragen möchte müsste ich die letzte ID wie gehabt abfragen und dann bei der Ausgabe ID>$last und davor noch $max definiern mit $last + 100 weil ich ja 100 einträge angezeigt haben will und dann bei der Ausgabe noch ID<$max machen ....und jetzt sag mir das ich richtig liege?^^

                        Ja, schon ganz gut. Leider ist da noch der Denkfehler mit drinn den auch ich gemacht habe... Die +100 garantiert leider nicht, dass 100 Einträge kommen, denn auch in dem Bereich könnten gefilterte liegen. Also am Besten ID>$last, nach ID sortieren und LIMIT 100.

                        Gruß,

                        Harlequin