Schnellere Lösung? (2 for-Schleifen verursachen lange Wartezeit)

chilimaus

Mitglied
Huhu, ^^

da bin ich mal wieder mit einem Problem: ich habe ein Online-Trading-Card-Game programmiert, läuft auch soweit ganz fabelhaft *g*
Wers nicht kennt: 12 Bildchen eines Themas (Set) müssen gesammelt werden. Dafür werden sie auf meiner Seite in 3 Reihen aufgelistet, jeweils 4 in einer Reihe (als Tabelle). Besitzt man eine Karte noch nicht, kommt ein Bildchen, dass man sie halt noch nicht hat.

Nun frage ich die Nummer aller vom User gesammelten Sets aus einer Datenbank aus und prüfe bei jedem Set, ob Karte 1 vorhanden ist, wenn ja, zeige die Karte, wenn nein, zeige das Suchbild, dann für Karte 2, Karte 3 etc ... das dauert natürlich, weil wenn man 5 Sets sammelt sind das schon 60 mal abgefragt...

Geht das irgendwie schneller? Ich wusste nun nicht, ob ich den Code dazuschreiben soll, denn er ist ja nicht fehlerhaft...:suspekt:

Sorry wenns dämlich klingt >.< bin froh über Hilfe, die User meckern nämlich ein bisschen über die lange Ladezeit xD
 
Moin,

Schreib mal den Code trotzdem...und auch den Aufbau der Tabelle;)
Rein vom Prinzip her würde ich das jeweilige Bild bereits über ein IF()-Statement im Query holen, das sollte das nochmalige Durchgehen der Ergebnisse ersparen.
 
Okay, also, der Code:

PHP:
$sql5 = "SELECT * FROM `collect` WHERE `sammler` = '$message->name' ORDER BY `name`";
$result5 = mysql_query($sql5);
$wieviele = mysql_num_rows($result5);
if($wieviele == "0")
{
echo "Dieser User sammelt keine Sets!";
}
else
{
for($i5=0; $i5<$wieviele; $i5++)
{
$namee = mysql_result($result5, $i5, "name");
$sql42 = "SELECT * FROM `sets` WHERE `name` LIKE '$namee'";
$result42 = mysql_query($sql42);
$row22=mysql_fetch_object($result42);
if($row22->art == "n")
{
$num = '12';
}
else
{
$num = '24';
}
   for ($i=0; $i<$num; $i++)
   {
$zahl = 1 + $i;
$sql58 = "SELECT * FROM `cards` WHERE `besitzer` = '$message->name' AND `name` = '$namee' AND `nummer` = '$zahl' AND `wo` = 'Collecting'";
$result8 = mysql_query($sql58);
$result88 = mysql_fetch_object($result8);
if($result88->name == "")
{
echo "<td width='25%'><center><img src='search$zahl5.gif'></td>";
}
else
{
echo "<td width='25%'><center><img src='$namee";
echo "$zahl.gif'></td>";
}

Ist natürlich etwas gekürzt, dazwischen sind noch einige Codeschnipsel für die Tabelle etc. ...

Die Tabelle, in der die gerade gesammelten Sets gespeichert werden (collect), speichert eine ID, den Namen des Sammlers und den Namen des Sets. Die Tabelle für die einzelnen Karten (cards) speichert ebenfalls eine ID, dann den Besitzer, wo sich diese Karte befindet (muss fürs Sammeln unter 'Collecting' sein), und den Namen und die Zahl der Karte.

Das mit dem IF-Statement werd ich gleich mal googlen, hab ich noch nix von gehört ^^ danke ^^
 
Wenn du 2 oder mehr Tabellen abfragst und jede davon eine Benutzer-ID vorweisen kann wäre es vielleicht sinnvoll über JOINs nachzudenken.
Ein Beispiel liefern kann man gerade schlecht bei den wenigen Infos zu deinen Tabellen =)
 
Ja, Joins wären sehr sinnvoll. Im Moment hast du für jede Karte eine Abfrage, das ist viel zu viel.

Du kannst dir erstmal alle Karten holen, die schon in der Sammlung des Mitglieds sind. Die schreibst du in ein Array.

Dann holst du dir alle Setnamen und die Art des Sets, das geht in einem Query. ... und bevor ich hier vernünftig formuliert bekomme, was ich meine, tipp ich lieber den Code, das ist einfacher XD

PHP:
$sql5 = "SELECT `art`,`collect`.`name` FROM `sets` LEFT JOIN `collect` ON `collect`.`name` = `sets`.`name` WHERE `sammler` = '$message->name' ORDER BY `collect`.`name`";
$result5 = mysql_query($sql5);
$wieviele = mysql_num_rows($result5);
if($wieviele == "0")
{
echo "Dieser User sammelt keine Sets!";
}
else
{
$sql58 = "SELECT `name`,`nummer` FROM `cards` WHERE `besitzer` = '$message->name' AND `wo` = 'Collecting'";
$result8 = mysql_query($sql58);
$karten = array();
while($row8 = mysql_fetch_object($result8))
{
$karten[] = $row8->name.$row8->nummer;
}

while($row22 = mysql_fetch_object($result5))
{
if($row22->art == "n")
{
$num = '12';
}
else
{
$num = '24';
}
for ($i=1; $i<=$num; $i++)
{
if(in_array($row22->name.sprintf("%02d", $i),$karten)
{
echo '<img src="search.gif">';
}
else
{
echo '<img src="'.$row22->name.sprintf("%02d", $i).'.gif">';
}
}
}
}
Ich hoffe, ich bin jetzt nicht irgendwo mit Klammern durcheinandergekommen ^^; Aber eigentlich müsste es so funktionieren.
Die Tabelle und vor allem das <center> kannst du dir übrigens sparen ;)

So, und jetzt geh ich mich bei deinem TCG anmelden ^^
 
Bestände denn die Möglichkeit, die DB umzustrukurieren,,,ich glaube ein Umbau dürfte die Sache enorm beschleunigen.
 
Wow *_* danke, hat super geklappt, Flicksi! (Natürlich auch danke an die anderen für die Hilfe! ^^)

Jetzt gehts wirklich viiiel schneller...ich kenn mich mit Arrays noch nicht wirklich aus, muss mir da noch einiges aneignen...aber das wär doch mal n guter Anfang dafür *g*
 
Zurück