Seite 1 von 2

SQL-Fehler im PN-Archiv

Verfasst: 02.01.2003 16:50
von HeikoStr
Moin,

ich habe da ein Problem mit dem Archiv bei den Privaten Nachrichten...

Beim Aufruf des Archivs erhalte ich nur die Meldung:
Allgemeiner Fehler
Could not query private messages
Mit Such-Funktion habe ich hier nicht gefunden... Im englischen Forum nur diesen Hinweis: http://www.phpbb.com/phpBB/viewtopic.php?t=58834

Nur bringt mich das jetzt nicht viel weiter... Ich finde nämlich diese SQL-Anweisung nicht in meinem Quelltext der privmsg.php...

In Zeile 217 wird zwar eine Variable $pm_sql_user definiert, die einen Teil der Anfrage enthält, aber die kann ich so nicht ändern, wie beschrieben...

Zusätzliche Informationen: Version 2.0.3
bisher keine Mods in privmsg.php
Forum auf: http://www.fogelvrei.de/forum/

Schonmal vielen Dank für mögliche Hilfe, HeikoStr

Verfasst: 03.01.2003 00:53
von Mister_X
kannst du mal den link:DebugMode anmachen und die genauere Fehlermeldung nochmal posten.

Verfasst: 03.01.2003 07:36
von HeikoStr
Es wird mir zwar jetzt keiner glauben, aber seit gestern nachmittag gibt es den Fehler in meinem Forum nicht mehr...
Seit Weihnachten (Update von 1.4 auf 2.0.3) kam diese Meldung und jetzt ist sie plötzlich weg...
Ich habe meinen Provider schon angeschrieben, ob er was am SQL-Server geändert hat... Mal abwarten, was kommt...

Gruß, Heiko

PS: Sollte der Fehler wieder kommen, werde ich die Meldung vom Debug-Mode hier posten...

Verfasst: 14.01.2003 07:11
von HeikoStr
Moin,

jetzt ist der Fehler tatsächlich wieder aufgetaucht...

Hier nun die Fehlermeldung im DEBUG-Mode:
Allgemeiner Fehler

Could not query private messages

DEBUG MODE

SQL Error : 1104 The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username FROM privmsgs pm, users u WHERE ( ( pm.privmsgs_to_userid = 17 AND pm.privmsgs_type = 3 AND u.user_id = pm.privmsgs_from_userid ) OR ( pm.privmsgs_from_userid = 17 AND pm.privmsgs_type = 4 AND u.user_id = pm.privmsgs_from_userid ) ) ORDER BY pm.privmsgs_date DESC LIMIT 0, 50

Line : 1918
File : /opt/root/home/fogelvreide/public_html/forum/privmsg.php
Und die angesprochenen Zeilen...

Code: Alles auswählen

Zeilen 1913-1919
//
// Okay, let's build the correct folder
//
if ( !($result = $db->sql_query($sql)) )
{
        message_die(GENERAL_ERROR, 'Could not query private messages', '', __LINE__, __FILE__, $sql);
}
Ich vermute, die SQL-Anfrage wird hier definiert:

Code: Alles auswählen

Zeilen 1742-1754
        case 'savebox':
                $sql_tot .= "WHERE ( ( privmsgs_to_userid = " . $userdata['user_id'] . "
                                AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " )
                        OR ( privmsgs_from_userid = " . $userdata['user_id'] . "
                                AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ") )";

                $sql .= "WHERE ( ( pm.privmsgs_to_userid = " . $userdata['user_id'] . "
                                AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . "
                                AND u.user_id = pm.privmsgs_from_userid )
                        OR ( pm.privmsgs_from_userid = " . $userdata['user_id'] . "
                                AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "
                                AND u.user_id = pm.privmsgs_from_userid ) )";
                break;
Gruß, Heiko

Verfasst: 23.01.2003 21:53
von HeikoStr
Noch ein paar Infos zum Server:
PHP Version 4.2.2
MySQL 3.23.39

Wenns noch hilft... Leider besteht das Problem immer noch...

Gruß, Heiko

PS: Forum liegt auf www.fogelvrei.de/forum/

Verfasst: 24.01.2003 00:55
von PhilippK
Wie groß ist denn deine PN-Tabelle? Evtl. würde ich mal probieren, ob ein REPAIR TABLE (z.B. über phpMyAdmin) hilft.
Wenn's nicht klappt, könnte man versuchen, die Tabellen über ein JOIN zu verknüpfen.

Gruß, Philipp

Verfasst: 24.01.2003 12:44
von HeikoStr
Beide Tabellen hatten keinen Überhang...
Repair und Optimize trotzdem mal ausgeführt, aber Fehler kommt immer noch...
privmsgs: 972 Einträge und 87,0 KB
privmsgs_text: 1007 Einträge und 315,5 KB

Was meinst Du denn mit dem Join???

Verfasst: 25.01.2003 00:29
von PhilippK
HeikoStr,

versuch mal folgenden SQL-Befehl direkt mit phpMyAdmin auszuführen:

Code: Alles auswählen

SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username
  FROM privmsgs pm, users u
  WHERE (
    ( pm.privmsgs_to_userid = 17 AND pm.privmsgs_type = 3 AND u.user_id = pm.privmsgs_from_userid ) OR
    ( pm.privmsgs_from_userid = 17 AND pm.privmsgs_type = 4 AND u.user_id = pm.privmsgs_from_userid ) )
  ORDER BY pm.privmsgs_date DESC
  LIMIT 0, 50
anschließend den hier:

Code: Alles auswählen

SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username
  FROM privmsgs pm
    INNER JOIN users u ON u.user_id = pm.privmsgs_from_userid
  WHERE (
    ( pm.privmsgs_to_userid = 17 AND pm.privmsgs_type = 3 ) OR
    ( pm.privmsgs_from_userid = 17 AND pm.privmsgs_type = 4 ) )
  ORDER BY pm.privmsgs_date DESC
  LIMIT 0, 50
Gruß, Philipp

Verfasst: 27.01.2003 10:52
von HeikoStr
PhilippK hat geschrieben:HeikoStr,

versuch mal folgenden SQL-Befehl direkt mit phpMyAdmin auszuführen:

Code: Alles auswählen

SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username
  FROM privmsgs pm, users u
  WHERE (
    ( pm.privmsgs_to_userid = 17 AND pm.privmsgs_type = 3 AND u.user_id = pm.privmsgs_from_userid ) OR
    ( pm.privmsgs_from_userid = 17 AND pm.privmsgs_type = 4 AND u.user_id = pm.privmsgs_from_userid ) )
  ORDER BY pm.privmsgs_date DESC
  LIMIT 0, 50
Er erste Befehl ergab folgende Meldung:

Code: Alles auswählen

MySQL meldet: 
The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok
anschließend den hier:

Code: Alles auswählen

SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username
  FROM privmsgs pm
    INNER JOIN users u ON u.user_id = pm.privmsgs_from_userid
  WHERE (
    ( pm.privmsgs_to_userid = 17 AND pm.privmsgs_type = 3 ) OR
    ( pm.privmsgs_from_userid = 17 AND pm.privmsgs_type = 4 ) )
  ORDER BY pm.privmsgs_date DESC
  LIMIT 0, 50
Und jetzt bringt er mir die 6 Nachrichten, die im Archiv sind...
Was muß ich denn nun im Quelltext ändern???

MfG, Heiko

Verfasst: 27.01.2003 18:04
von PhilippK
Ersetzte folgendes:

Zeile 1885f.:

Code: Alles auswählen

$sql = "SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username 
	FROM " . PRIVMSGS_TABLE . " pm, " . USERS_TABLE . " u ";
mit

Code: Alles auswählen

$sql = "SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username 
	FROM " . PRIVMSGS_TABLE . " pm INNER JOIN " . USERS_TABLE . " u ";
Zeile 1895ff.:

Code: Alles auswählen

		$sql .= "WHERE pm.privmsgs_to_userid = " . $userdata['user_id'] . "
			AND u.user_id = pm.privmsgs_from_userid
			AND ( pm.privmsgs_type =  " . PRIVMSGS_NEW_MAIL . "
				OR pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . " 
				OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )";
mit

Code: Alles auswählen

		$sql .= "ON u.user_id = pm.privmsgs_from_userid
			WHERE pm.privmsgs_to_userid = " . $userdata['user_id'] . "
			AND ( pm.privmsgs_type =  " . PRIVMSGS_NEW_MAIL . "
				OR pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . " 
				OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )";
Zeile 1907ff.:

Code: Alles auswählen

		$sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
			AND u.user_id = pm.privmsgs_to_userid
			AND ( pm.privmsgs_type =  " . PRIVMSGS_NEW_MAIL . "
				OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )";
mit

Code: Alles auswählen

		$sql .= "ON u.user_id = pm.privmsgs_to_userid
			WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
			AND ( pm.privmsgs_type =  " . PRIVMSGS_NEW_MAIL . "
				OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )";
Zeile 1917ff.:

Code: Alles auswählen

		$sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
			AND u.user_id = pm.privmsgs_to_userid
			AND pm.privmsgs_type =  " . PRIVMSGS_SENT_MAIL;
mit

Code: Alles auswählen

		$sql .= "ON u.user_id = pm.privmsgs_to_userid
			WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
			AND pm.privmsgs_type =  " . PRIVMSGS_SENT_MAIL;
Zeile 1928ff.:

Code: Alles auswählen

		$sql .= "WHERE u.user_id = pm.privmsgs_from_userid 
			AND ( ( pm.privmsgs_to_userid = " . $userdata['user_id'] . " 
				AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) 
			OR ( pm.privmsgs_from_userid = " . $userdata['user_id'] . " 
				AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) )";
mit

Code: Alles auswählen

		$sql .= "ON u.user_id = pm.privmsgs_from_userid
			WHERE ( ( pm.privmsgs_to_userid = " . $userdata['user_id'] . " 
				AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) 
			OR ( pm.privmsgs_from_userid = " . $userdata['user_id'] . " 
				AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) )";
Gruß, Philipp