anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 14 Okt, 2019 01:40

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kleines Livechat Problem.
BeitragVerfasst: Di 24 Aug, 2010 12:07 
Offline
Freak
Freak
Benutzeravatar

Registriert: Di 01 Mai, 2007 13:57
Beiträge: 1634
Wohnort: Dortmund.
Geschlecht: Männlich
LoGD: Lokal.
Skype: josh.hoiul
Hallo,

ich habe gestern auf meinem lokalem Server ein neues Chatsystem integriert. An sich läuft dieser richtig gut, allerdings habe ich da doch ein kleines Problem. Und zwar habe ich nun private Nachrichten in diesem System integriert. (/p User:Text) Diese privaten Nachrichten werden auch wie die anderen Nachrichten in der 'commentary'-Tabelle gespeichert. So weit so gut, passt auf alles.

Nun zu meinem Problem: Daher die privaten Nachrichten auch mit im limit der Abfrage waren und diese für andere User nicht sichtbar waren, sah es schon sehr doof aus, wenn 9 private Nachrichten und nur eine normale Nachrichten zu 'sehen' waren. (Die Seite wird halt trotzdem damit berechnet.)

Daher habe ich mich dazu entschlossen 2 Abfragen durchzuführen. In der ersten Abfrage, frage ich 'limit' (Meistens nur 10) Nachrichten aus der Tabelle ab. (Öffentliche Nachrichten) Mit der zweiten Abfrage frage ich lediglich die privaten Nachrichten ab.

Die Abfragen führe ich dann in einem Array zusammen und lasse dieses Array mit ksort noch sortieren und mit array_unshift umgekehrt ausgeben.

Auch das funktioniert alles wunderbar. - Nur habe ich jetzt das Problem, dass sich nach gegebener Zeit (Sofern schon ein paar neue öffentliche Nachrichten gesendet wurden) die ganzen privaten Nachrichten im oberen Teil des Chats tummeln.

Meine Frage wäre: Wie bekomme ich es hin, das öffentliche und private Nachrichten zusammen abgefragt werden, allerdings nur die öffentlichen Nachrichten ausschlaggebend für die Seite sind? (Private Nachrichten sollen allerdings dann auch auf eine nächste Seite verschwinden sobald 10 öffentliche Nachrichten vorhanden sind.)

Hier mal der Auslese-code:

$this->bbcode_second_pass_code('', '$s = mysql_query('SELECT commentary.*,accounts.login,accounts.name,accounts.loggedin,accounts.location,accounts.laston
FROM commentary
INNER JOIN accounts ON accounts.acctid = commentary.author
WHERE section = "'.$this->section.'" AND accounts.locked = 0 AND priv = 0
ORDER BY commentid DESC
LIMIT 0,10');
$cCd = 0;
$comments = array();

while( $row = mysql_fetch_assoc($s) ) {

$i++;
$comments[$row['commentid']]['i'] = $row['commentid'];
$comments[$row['commentid']]['c'] = $row['comment'];
$comments[$row['commentid']]['p'] = $row['postdate'];
$comments[$row['commentid']]['iN'] = $row['isNpc'];
$comments[$row['commentid']]['iE'] = $row['isEmote'];
$comments[$row['commentid']]['iS'] = $row['isSys'];
$comments[$row['commentid']]['pR'] = 0;
$comments[$row['commentid']]['pT'] = '';
$comments[$row['commentid']]['pF'] = '';
$comments[$row['commentid']]['l'] = $row['login'];
$comments[$row['commentid']]['n'] = $row['name'];
$comments[$row['commentid']]['lO'] = $row['laston'];
$comments[$row['commentid']]['lI'] = $row['loggedin'];


}

$s = mysql_query('SELECT commentary.*,accounts.login,accounts.name,accounts.loggedin,accounts.location,accounts.laston
FROM commentary
INNER JOIN accounts ON accounts.acctid = commentary.author
WHERE section = "'.$this->section.'" AND accounts.locked = 0 AND priv = 1
ORDER BY commentid DESC
LIMIT 0,10');

while( $row = mysql_fetch_assoc($s) ) {

$i++;
$comments[$row['commentid']]['i'] = $row['commentid'];
$comments[$row['commentid']]['c'] = $row['comment'];
$comments[$row['commentid']]['p'] = $row['postdate'];
$comments[$row['commentid']]['pR'] = $row['priv'];
$comments[$row['commentid']]['pT'] = $row['pTo'];
$comments[$row['commentid']]['pF'] = $row['pFrom'];
$comments[$row['commentid']]['iN'] = $row['isNpc'];
$comments[$row['commentid']]['iE'] = $row['isEmote'];
$comments[$row['commentid']]['iS'] = $row['isSys'];
$comments[$row['commentid']]['n'] = $row['name'];
$comments[$row['commentid']]['lO'] = $row['laston'];
$comments[$row['commentid']]['lI'] = $row['loggedin'];
$comments[$row['commentid']]['l'] = $row['login'];

$private = true;

$ids[$row['commentid']] = $row['commentid'];
}')

Ich bin mit dem Code definitiv nicht zufrieden, wüsste aber auch gerade nicht in welche Richtung ich denken sollte, daher ich das so noch nicht gemacht habe.

Ich erwarte nun auch keinen neuen Abfragecode, sondern viel eher einen Denkhinweis in welche Richtung ich denken sollte. (:

Liebe Grüße,
My.

P.S: Verzeihung wegen der Grammatik. :o Bin gerade noch in der Schule und musste mich beeilen.

_________________
Never change a running system. Bullshit! ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Di 24 Aug, 2010 13:06 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
Was auch immer das für eine merkwürdige Funktion sein soll, private Nachrichten in den Chat miteinzubauen - es bleibt dir nichts anderes als eine PHP-Lösung übrig, da MySQL nur feste Werte in der LIMIT-Klausel erlaubt.

Bedeutend einfacher dürfte es sein, die "privaten Nachrichten" ganz wo anders zu speichern und auch an einem anderen Ort auszugeben. Auch von der Ausführzeit dürfte das die beste Lösung sein als das verwenden mehrfacher Schleifen, um die Ergebnisse zweier SQL's miteinander so zu verschmelzen, dass die Reihenfolge die richtige ist.

Falls du dich trotzdem nicht davon abhalten lassen willst, hier meine spontante Idee:
  • Die Öffentlichen Nachrichten mit dem Limit 10 aus der Datenbank holen
  • Das Datum des ersten und das Datum des letzten Datensatzes mittels PHP herausnehmen
  • Die privaten Nachrichten zwischen diesen beiden Daten holen
  • Über array_merge() die beiden Datensätze verschmelzen
  • Über usort() mit eigener Funktion die Datensätze nach Datum sortieren
  • Das daraus erhaltene Array als "geholten" Datensatz behandeln und entsprechend deiner bisherigen Routine bearbeiten


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Mi 25 Aug, 2010 00:48 
Offline
Profi
Profi

Registriert: Mo 20 Apr, 2009 00:30
Beiträge: 124
MySql hat geschrieben:
Ich erwarte nun auch keinen neuen Abfragecode, sondern viel eher einen Denkhinweis in welche Richtung ich denken sollte. (:


Ich bin trotzdem so frei dir einen neuen "Abfragecode" zu liefern.

$this->bbcode_second_pass_code('', '
SELECT c1.*, accounts.login, accounts.name, accounts.loggedin, accounts.location, accounts.laston
FROM commentary c1
INNER JOIN accounts ON accounts.acctid = c1.author
WHERE section = "'.$this->section.'"
AND accounts.locked = 0
AND commentid >=
(
SELECT c2.commentid FROM commentary c2
JOIN
(
SELECT commentid FROM commentary
INNER JOIN accounts ON accounts.acctid = commentary.author
WHERE section = "'.$this->section.'"
AND accounts.locked = 0
AND priv = 0
ORDER BY commentid DESC
LIMIT 10
) AS c3
ON c2.commentid = c3.commentid
ORDER BY c2.commentid ASC
LIMIT 1
)
ORDER BY commentid DESC
')

Liefert dein gewünschtes Ergebnis.

p.s.: Wenn man mysql heißt sollte man sich vllt auch ein bisschen mit mysql beschäftigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Mi 25 Aug, 2010 11:31 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
Ich glaube, so kommt man ohne die dritte Verschachtelungsstufe hin:
$this->bbcode_second_pass_code('', 'SELECT c.*, a.login, a.name, a.loggedin, a.location, a.laston
FROM commentary c
INNER JOIN accounts a ON a.acctid = c.author
WHERE c.section = "'.$this->section.'"
AND a.locked = 0
AND c.commentid >=
(
SELECT commentid FROM commentary cin
JOIN accounts ain ON cin.author = ain.acctid
WHERE cin.section = "'.$this->section.'"
AND LEFT(cin.comment,2) <> "/p"
AND ain.locked = 0
ORDER BY commentid DESC LIMIT 9,1
)
ORDER BY commentid DESC')

@Bathory: Jop, treffend formuliert ;-)

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Mi 25 Aug, 2010 18:44 
Offline
Profi
Profi

Registriert: Mo 20 Apr, 2009 00:30
Beiträge: 124
Jup die Zweite von den drei Verschatelung ist in der Tat unnötig, wenn man im Limit ein Offset setzt.
Habe ich zur späten Stunde eindeutig verpennt :lol:
Danke für den Hinweis =).

Was ich nicht ganz nachvollziehen kann ist, warum du statt:

$this->bbcode_second_pass_code('', 'AND cin.priv = 0')

die LEFT Funktion ausgewählt hast?

$this->bbcode_second_pass_code('', 'AND LEFT(cin.comment,2) <> "/p"')

Das Ergebnis ist ja das gleiche nur ohne den Overhead einer String-Funktion.

Aber vllt liege ich auch nur wieder auf dem Schlauch *g*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Mi 25 Aug, 2010 20:38 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
Mein Fehler, ich hatte übersehen, das My dafür ein Flag-Feld eingebaut hat.

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kleines Livechat Problem.
BeitragVerfasst: Do 26 Aug, 2010 17:52 
Offline
Freak
Freak
Benutzeravatar

Registriert: Di 01 Mai, 2007 13:57
Beiträge: 1634
Wohnort: Dortmund.
Geschlecht: Männlich
LoGD: Lokal.
Skype: josh.hoiul
Danke Euch zweien. :) Das Auslesen funktioniert nun wie gewollt.

P.S: Ich habe nicht umsonst um einen Denkanstoß gebeten. (:

_________________
Never change a running system. Bullshit! ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum