foreach - Problem

Sasser

Erfahrenes Mitglied
Hallo alle zusammen!

Ich habe folgende Funktion gebaut. Diese funktioniert auch wunderbar. Nur wenn in der DB mehrere Sachen hintereinander stehen:

Timestamp|ID|Anzahl#Timestamp|ID|Anzahl ...

führt er nur das erste aus und wenn man neu aktualisiert dann das nächste, obwohl ich foreach # benutze!? Könnt ihr mir helfen?

PHP:
function updateweaponprogress($user)
{
$db = connect_db();
$result = mysql_query("Select * FROM citys WHERE `user` = '$user'", $db);
while($row=mysql_fetch_assoc($result))
  {
  if ($row[weaponprogress] != "")
    {
      $search = explode("#", $row[weaponprogress]);
      foreach ($search as $var)
        {
        $part = explode("|", $var);
        $weapon=mysql_fetch_assoc(mysql_query("SELECT * FROM weapons WHERE `id` = '$part[1]'", $db));
        if (time() >= $part[0])
          {
          $field = "W$part[1]";
          $weapons = $row[$field]+$part[2];
          $weaponprogress = str_replace("$var","",$row[weaponprogress]);
          $weaponprogress = str_replace("##","#",$weaponprogress);
          if (substr($weaponprogress, -1) == "#")
            {
            $weaponprogress = substr($weaponprogress, 0, -1);
            }
          if (substr($weaponprogress, 0, 1) == "#")
            {
            $weaponprogress = substr($weaponprogress, 1);
            }
          mysql_query("UPDATE citys SET `weaponprogress` = '$weaponprogress', `W$part[1]` = '$weapons' WHERE `coordinates` = '$row[coordinates]'", $db);
          }
        }
      }
  }
mysql_close($db);
}
 
Ich hab das Problem schon selbst behoben! Die forearch - Schleife hat funktioniert, nur hat er beim DB-Eintrag immer den alten Datensatz vor der forearch - Schleife benutzt! :)

In der Schleife habe ich nun nochmal einen DB-Abruf gemacht, dadurch holt der immer den aktuellsten Datensatz! Hat nur daran gelegen! :suspekt:
 
Eine letzte Frage habe ich aber noch dazu, denn das bringt mich irgendwie an meine Grenzen! :)

Bisher ist es ja so: Der Timestamp gibt an, wann alle z.B. 5 Waffen oder so fertig sind und demnach werden auch alle 5 Waffen erst in die Datenbank geschrieben wenn alle fertig sind. Bei einem Onlinegame wäre es ja sinnvoll, wenn man den Timestamp so berechnet wann man mit dem Bau begonnen hat:

PHP:
$weapon=mysql_fetch_assoc(mysql_query("SELECT * FROM weapons WHERE `id` = '$part[1]'", $db));
$start = $part[0]-($weapon[duration]*$part[2]);

und dann irgendwie die Prozedur für jede Waffe durchgeht. Also so lange dass man die aktuelle Zeit nicht übersteigt. Somit kann man ja dann jede einzelne Waffe in die DB übernehmen ohne warten zu müssen, bis alle fertig sind.

Wie kann ich das realisieren?
 
Ich habe deinen Text nun bestimmt 5 mal gelesen und bin kein bisschen Schlauer gewurden, was du realisieren willst.

Es wäre auf jeden Fall sinnvoller, in die Datenbank den Timestamp einzutragen, an dem die Waffe fertig sein soll. Alles andere wäre unperformanter.
Somit müsstest du bei deinem Query nur noch alle Einträge auslesen, die kleinergleich dem aktuellen Timestamp sind und keinerlei Berechnung oder Filter anwenden.

Ich hoffe das hat wenigstens einen Teil deiner Frage beantwortet. ;)
 
Das ganze mache ich doch schon, aber ich trage den Timestamp ein, wielange die 5 Waffen brauchen!
 
Ich bin ein Stück weitergekommen;

PHP:
$weapon=mysql_fetch_assoc(mysql_query("SELECT * FROM weapons WHERE `id` = '$part[1]'", $db));
$start = $part[0]-($weapon[duration]*$part[2]);
$i = "0";
do
{
$i++;
$time = $start+($weapon[duration]*$i);
}
while ($time < time());
$field = "W$part[1]";
$weapons = $row[$field]+$i;
mysql_query("UPDATE citys SET `W$part[1]` = '$weapons' WHERE `coordinates` = '$row[coordinates]'", $db);

Allerding addiert er jedesmal 1 dazu, obwohl die Zeit nicht kleiner ist als die aktuelle. Ich weis das es an der do-while-Schleife liegt, da diese ja immer md. 1 mal ausgeführt wird oder? Wie könnte man das umgehen?
 
Zurück