Seite 1 von 2

Was mache ich falsch?

Verfasst: 13.11.2004 22:27
von Gumfuzi
Ich komme einfach nicht weiter mit meiner eigenen Seite:

Habe den nachstehenden Code, aber beim Ausführen bleibt die Seite weiss. Das bedeutet normalerwiese, daß etwas mit der Syntax nicht stimmt (ev. ein ";" zuwenig, etc.) - oder?
Das dumme ist auch, daß, wenn nur die weisse Seite kommt, man nie weiss in welcher Zeile der Fehler ist. Ich habe auch schon den Confixx-Perl-Debugger scannen lassen, aber der findet auch nix.

Kann mir bitte jemand sagen, was daran falsch ist, denn ich finde den Fehler mit meinem Noob-Wissen nicht... :oops:

Code: Alles auswählen

<?php 
define('IN_PHPBB', true); 
$phpbb_root_path = './'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 

$page_title = 'Die besten Spieler'; 
include($phpbb_root_path . 'includes/page_header.'.$phpEx); 

$template->set_filenames(array('body' => 'zocker.tpl'));

$sql='SELECT highscore_player, Count(*) AS Anzahl FROM `phpbb_ina_highscore` WHERE `highscore_mon` = ' . date("m", time()) . ' AND `highscore_year` = ' . date("Y", time()) . ' GROUP BY highscore_player';
if(!$result = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);
}

while($row = $db->sql_fetchrow($result))
{
	$template->assign_block_vars('test', array(
		'MON_NAME' => $row['highscore_player'],
		'MON_ANZ' => $row['Anzahl']
	));
}

$sql='SELECT game_name, reverse_list FROM `phpbb_ina_games`';
if(!$result = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);

while($row = $db->sql_fetchrow($result))
{
	$i = $i + 1;
	$name[$i] = $row['game_name'];
	$reverse[$i] = $row['reverse_list'];
}
$c = $i;

for($i = 1; $i <= $c; $i++)
{
	if($reverse[$i] = 0)
	{
		$sortlist = 'DESC';
	}
	else
	{
		$sortlist = 'ASC';
	}

	$sql='SELECT game_name, player, score FROM `phpbb_ina_scores` WHERE game_name = ' . $name[$i] . 'ORDER BY score ' . $sortlist . ' LIMIT 1';
	if(!$result = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);

	$count[$i] = 'player';
	$ausgabe = $ausgabe + $count[$i];
}

$template->assign_vars(array(
	'AUSGABE' => $ausgabe,
	'VAR_C' => $c
));

$template->assign_vars(array('TITEL' => $page_title));
$template->pparse('body');
include($phpbb_root_path . 'includes/page_tail.'.$phpEx); 
?>
Bleiben ev. die Variablen ausserhalb der while-Schleifen oder if-Schleifen nicht erhalten?
(das "$ausgabe" dient nur dazu, um erstmal zusehen, ob überhaupt Daten dabei rauskommen ,) )

Verfasst: 13.11.2004 22:52
von Dennis63
Mache doch in jeder Zeile ein echo "1"; Dann weißt Du, wo das Script hängt...

Grüße
Dennis

Verfasst: 13.11.2004 22:54
von Gumfuzi
Hmmm, ganz egal, wo ich das echo "1"; hinschreibe, es erscheint keine "1" am Schirm...

*edit*
mit "//" habe ich nun ein paar Zeilen ausgrenzen können, sobald der folgende Teil abgearbeitet wird, bleibt das bild weiss:

Code: Alles auswählen

$sql='SELECT game_name, reverse_list FROM `phpbb_ina_games`';
if(!$result = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);

while($row = $db->sql_fetchrow($result))
{
	$i = $i + 1;
	$name[$i] = $row['game_name'];
	$reverse[$i] = $row['reverse_list'];
}
$c = $i;

for($i = 1; $i <= $c; $i++)
{
	if($reverse[$i] = 0)
	{
		$sortlist = 'DESC';
	}
	else
	{
		$sortlist = 'ASC';
	}

	$sql='SELECT game_name, player, score FROM `phpbb_ina_scores` WHERE game_name = ' . $name[$i] . 'ORDER BY score ' . $sortlist . ' LIMIT 1';
	if(!$result = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);

	$count[$i] = 'player';
	$ausgabe = $ausgabe + $count[$i];
}

Verfasst: 14.11.2004 11:05
von Blutgerinsel
ob es letztendlich nur daran liegt bleibt die Frage:

Code: Alles auswählen

for($i = 1; $i <= $c; $i++) 
{ 
   if($reverse[$i] = 0) 
   { 
      $sortlist = 'DESC'; 
   } 
   else 
   { 
      $sortlist = 'ASC'; 
   }
Schon mal $reverse nach diesem Durchlauf angeschaut? Dann wäre aufgefallen das dein Array kaputt ist durch:

Code: Alles auswählen

$reverse[$i] = 0
Dies sollte ein Vergleich sein ist aber eine Zuweisung :wink:

Im ganzen gesehen muss ich mich fragen wozu du soviele SQL Querys absetzt....
Du ziehst dir aus einer Table diverse Informationen, bereitest damit wiederrum ein Array auf welches du dann im Endeffekt n:1(m)
wieder in eine Table jagst......

Da stellt sich die Frage
a) Weshalb du die Table nichts verknüpfst
b) Ob du alle oder nur einen speziellen Datensatz suchst

Verfasst: 14.11.2004 11:28
von Gumfuzi
Hallo Blutgerinsel,

danke für Deine Antwort. Ich habe nun bei der IF-Abfrage den

Code: Alles auswählen

if($reverse[$i] == 0)
geändert, nun sollte es verglichen werden.

Tja, die Frage mit den vielen Queries:
Es geht hier um den Activity Mod, wo "einfach" ausgelesen werden soll, wieviel HiScores (Platz 1) jeder Spieler hat.
In der Tabelle liegt aber pro Spiel für jeden Spieler die persönliche Bestleitung vor, zB:
Spiel1, Spieler1, 50
Spiel2, Spieler2, 100
Spiel3, SPieler1, 75
Spiel2, Spieler1, 55
Spiel1, SPieler2, 45
etc.

Ich brauche aber die Anzahl der HiScores (wo SpielerX die meisten Punkte hat) pro Spieler, sodaß ich am Schluß es so habe:
Spieler1 = 2x HiScore
Spieler2 = 1x HiScore
etc.

Ich muss ja vorher in der phpbb_ina_games die verschiedenen Spielnamen auslesen, denn nur dort stehen die pro Spiel nur einmal drin (bei der phpbb_ina_scores eben nicht) - darum zuerst die Auslesung der Spiele von phpbb_ina_games.

Es wird da sicher einen einfacheren Weg geben, aber ich komme einfach nicht drauf.

Kannst Du mir nicht bitte einen Hinweis geben (ich weiß, daß Du nur ungern fertige Lösungen postest, sondern Anregungen dazu) - ev. nur, mit welchen Befehlen ich ans Ziel komme, dann probiere ich das mal (die Links zu den Manuals habe ich ja nun).

Wäre Dir sehr dankbar!

Verfasst: 14.11.2004 13:47
von Blutgerinsel
[] Du hast eine Table phpbb_ina_games
die so aussieht?

Spiel1, Spieler1, 50
Spiel2, Spieler2, 100
Spiel3, SPieler1, 75
Spiel2, Spieler1, 55
Spiel1, SPieler2, 45

Widerspricht aber dem:
[....]Spielnamen auslesen, denn nur dort stehen die pro Spiel nur einmal drin (bei der phpbb_ina_scores eben nicht)
Du hast eine Table phpbb_ina_scores die sieht wie aus?

Die erste Table sollte eigenlich für die Bestimmung der Anzahl ausreichen, wenn die Table wie oben aussieht....

Schema:

Code: Alles auswählen

SELECT 
  spielerspalte,
  COUNT(*) AS Highscore
FROM
  spielerhighscore
GROUP BY
  spielerspalte
ORDER BY
  Highscore DESC
Wenn du die Tables besser erklärst kann man dir besser helfen

Verfasst: 14.11.2004 14:00
von Gumfuzi
Es geht hier um zwei verschiedene Tabellen.
OK, hier die Tabellenstruktur:

phpbb_ina_games (alle Daten zu den Spielen selbst; beinhaltet keine HiScores):
game_id
game_name (Name des Spieles)
...
reverse_list (gibt an, ob der HiScore auf- oder absteigend sortiert werden soll)

phpbb_ina_scores (beinhaltet die Hiscores):
score_id
game_name (wie oben)
player (HiScoreinhaber)
score (Punkte)
date
Hier steht von jedem Spieler die Bestleistung von jedem Spiel (das er schon gespielt hat) drin. D.h. um zu wissen, wer bei jedem Spiel der Beste ist, muss man die Liste nach dem Spiel filtern und dann die höchsten Punkte oder die wenigsten Punkte (siehe "reverse_list") suchen bzw. den SPieler, der diese Punkte hat.

Danke für Deine Mühen und Geduld!

Verfasst: 14.11.2004 14:14
von Blutgerinsel
phpbb_ina_games (alle Daten zu den Spielen selbst; beinhaltet keine HiScores):
game_id
game_name (Name des Spieles)


Diese Table abändern zu
phpbb_ina_scores (beinhaltet die Hiscores):
score_id
game_id (wie oben)
player (HiScoreinhaber)
score (Punkte)
date

-> game_id+score_id sollte der Primary Key sein

Code: Alles auswählen

SELECT
  S.player,
  COUNT(*) AS HighScoreCount,
  SUM(S.score) AS HighScoreSum
FROM
  phpbb_ina_games G
INNER JOIN
  phpbb_ina_scores S
ON G.game_id=S.game_id
GROUP BY
  S.player
ORDER BY
  HighScoreCount DESC
Müsste er gruppieren können, da sollte man je nach Anforderung OrderBy DESC (absteigend) oder ASC (aufsteigend) platzieren...

Verfasst: 14.11.2004 18:01
von Gumfuzi
Hmmm, die Tabelle kann ich schlecht ändert, da auch der Activity MOD dann verändert werden müsste. Aber da ja in beiden Tabellen "game_name" vorkommt, könnte ich doch das "game_name" anstelle von "game_id" benutzen - oder klappt das damit nicht?

Ist der Primary Key Pflicht, oder ist der "nur" wegen der Geschwindigkeit wichtig?

Verfasst: 14.11.2004 20:11
von Blutgerinsel
Gumfuzi hat geschrieben:Hmmm, die Tabelle kann ich schlecht ändert, da auch der Activity MOD dann verändert werden müsste. Aber da ja in beiden Tabellen "game_name" vorkommt, könnte ich doch das "game_name" anstelle von "game_id" benutzen - oder klappt das damit nicht?

Ist der Primary Key Pflicht, oder ist der "nur" wegen der Geschwindigkeit wichtig?
Dann gehört der Modschreiber geschlagen :D

Primary Key:
- identifiziert eindeutig den Datensatz
- hält Datensätze eindeutig wie z.B. Unique
- gestattet schnelleren Zugriff auf Datensätze....

Klar es würde gehen mit dem namen.....Allerdings sollten Primary Keys nur aus Zahlen bestehen. Da die DB schneller auf Zahlen reagieren kann als auf Text