Browsergame : 1 Frage bezüglich MySQL Eintragung per INSERT INTO

Taranion

Grünschnabel
Hallo zusammen.

Ich bin seit längerem dran ein Browsergame zu programmieren ( versuche es zumindest ) und hänge nun an folgender Sache fest.

Es handelt sich um ein Browsergame, wobei man Raumschiffe hat ( Sprich... Standard BG ) und diese in verschiedene Gruppenarten aufteilen soll. Soll bedeuten.... Handelsflotten, in denen nur Transportschiffe kommen, Kampfflotten wo nur Jäger etc. reinkommen usw.
Ich habe eine Datenbank groups wo halt die User_ID die Koordinaten der Gruppentyp und halt die Schiffsanzahl und der Schiffstyp nach ID gespeichert werden sollen gespeichert werden sollen ( und noch ein paar andere angaben ).

Als Funktion sieht das ganze wie folgt aus :

PHP:
// NEUE GRUPPE HINZUFÜGEN START
	function set_new_group($user_id, $coords, $typ, $anz, $shipid)
	{
		global $CONFIG;
		
		$db = new cl_extended_database();
		
		$gal = $coords['gal'];
        $sys = $coords['sys'];
        $plan = $coords['plan'];
		
		$fid = $this->get_fleetid($coords);
				  
		$str_ships = "";
		
		$str_ships = $shipid . "x" . $anz . "%";
		
		//echo "$str_ships<br>";
		//echo "Setzte $anz stk. von ID $shipid in Gruppentyp $typ für User-ID $user_id ( Fleetid : $fid ) , ".$coords['gal']." ".$coords['sys']." ".$coords['plan']."<br>";
		
		$db->query("INSERT INTO groups SET user_id = '$user_id', fleet_id = '$fid', gal = '$gal', sys = '$sys', plan = '$plan', typ = '$typ', ships = '$str_ships';");
		$db->err();	

        $db->reinit();
		
		$db->dbclose();
	}
// NEUE GRUPPE HINZUFÜGEN ENDE

Wenn ich jetzt sagen wir mal ein Schiff mit der ID 1, 1 mal auswählen schreibt der in die DB bei "ships" 1x1% , was ja auch OK ist.
Wenn ich jetzt aber 1 Schiff mit der ID 1 und 5 Schiffe mit der ID 4 ( ist egal wieviel und welche ID ) nehme, soll er es eigentlich, da es ja eine zusammengehörige Gruppe ist, in die Zelle ships 1x1%, 4x5% schreiben, sprich hintereinander einlesen und in diese eine Zelle schreiben.
Er schreibt aber für den zweiten Wert eine extra Zeile in die DB.
Ich weiß das ich irgendwie mit einer "while" Schleife arbeiten muss, allerdings wenn ich dies mache, berechnet der ohne ende, bis er mir irgendwann einen memory fehler ausgibt.
Wäre Super wenn mir da einer helfen könnte, da ich ungerne mit einer anderen Funktion weiter mache, bis ich eine wo ich dran bin nicht funktioniert.

MfG
Dirk
 
Zuletzt bearbeitet:
Möchtest du da jetzt etwas einfügen oder etwas aktualisieren? Dein SQL Statement ist irgendwie ein Mix aus beidem... wobei für ein Update erstens der richtige Command sowie eine WHERE-Klausel fehlt, für ein INSERT INTO allerdings die Syntax seltsam ist.
 
Dies soll jetzt die Funktion sein um die Daten neu einzugeben, also einen komplett neuen Eintrag machen. Auch wenn das etwas seltsam aussieht, funktioniert sie bei mir, bis auf die Sache, die ich im Hauptpost beschrieben habe.
( Ich eigne mir PHP beim programmieren selber an, wobei dann manche Sachen eventuell für andere komisch aussehen kann, daher eventuell der Mix )

P.S. Habe den Hauptpost Editiert da ich den Code als Zitat eingefügt hatte. Hab das jetzt geändert.
 
Zuletzt bearbeitet:
@Tim Bureck: Die Syntax ist vollkommen OK für MySQL.

@OP:

Vielleicht bringt es was, die shipid und die anz in Arrays zu schreiben, diese dann per foreach()-Schleife (oder besser hier for() mit Kombination count()) und implode() zu einem String zusammen zu bauen. Also etwas in der Art:

PHP:
function set_new_group($user_id, $coords, $typ, $anz, $shipid)
    {
        global $CONFIG;
        
        $db = new cl_extended_database();
        
        $gal = $coords['gal'];
        $sys = $coords['sys'];
        $plan = $coords['plan'];
        
        $fid = $this->get_fleetid($coords);
                  
        $str_ships = "";
		
		if(is_array($shipid))
		{
			$ship_strings = array();
			if(!is_array($anz))
			{
				throw new Exception("Schiffe sind als Array angegeben, Anzahl ist kein Array!");
			}
			for($i = 0; $i < count($shipid); $i++)
			{
				if(!isset($anz[$i]))
				{
					throw new Exception("Schiffe sind als Array angegeben, Anzahl für Index $i existiert nicht!");
				}
				$ship_strings[] =  $shipid[$i] . "x" . $anz[$i] . "%";
			}
			
			$str_ships = implode(",", $ship_strings);
		}
		else
		{
			$str_ships = $shipid . "x" . $anz . "%";
		}
        
        //echo "$str_ships<br>";
        //echo "Setzte $anz stk. von ID $shipid in Gruppentyp $typ für User-ID $user_id ( Fleetid : $fid ) , ".$coords['gal']." ".$coords['sys']." ".$coords['plan']."<br>";
        
        $db->query("INSERT INTO groups SET user_id = '$user_id', fleet_id = '$fid', gal = '$gal', sys = '$sys', plan = '$plan', typ = '$typ', ships = '$str_ships';");
        $db->err();    

        $db->reinit();
        
        $db->dbclose();
    }

* Ungetestet *
 
Danke Saftmeister, aber damit klappt es auch nicht wirklich. Der gibt mir trotzdem für jeden Schiff-ID eine extra Zeile.
Ich habe mal zwei Screenshoots gemacht, von der groups Tabelle.

Tabellenstruktur =
groups.jpg


und....

Inhalt =
groups2.jpg


Bei dem Inhalt sieht man wie der die Werte für die Schiffe unter ships eingetragen hat ( also 102x1% und 104x1% usw. ).
Dort wo die shipswerte frei sind habe ich testweise das else aus deiner Idee rausgenommen, wobei dann die werte nicht übernommen werden.
In dieser Zelle soll es dann aber wie folgt eingetragen werden 102x1%,104x1%, sprich direkt hintereinander damit diese wirklich in eine zusammengehörige Gruppe angezeigt werden ( dafür kommt dann noch group_id, was ich noch nicht wirklich drinne habe.
Ich werde selber noch ein wenig versuchen aber vieleicht hat ja einer gerade DIE Lösung.

Gruß
Dirk
 
Ich glaube ich werde die Tabelle komplett umgestalten und für jeden Schiff-ID eine Spalte machen. So kann ich mich erstmal auf andere Funktionen konzentrieren und diese Sache fertig machen wenn ich dafür eine Lösung habe. Aber ihr könnt gerne weiter antworten.
Es kann auch sein das ich bei der Übergabe der Werte einen Fehler habe.
Ich nutze SMARTY zur Template übergabe und stelle mal den HTML Code zur Übergabe plus den Bereich aus der PHP rein. Vieleicht liegt auch dort der fehler.

HTML:
<form action="groups.php" method="post">
	<input type="hidden" name="typ" value="{*$typ*}">
<table>
	<tr>
		<td colspan="2">{*$groupname*} ( Typ : {*$typ*} )</td>	
	</tr>
{*foreach from=$groupolist item=ship*} </p>
	<tr>
		<td width="279" align="center" class="loginm"><a href="infos.php?s={*$ship.id*}&t=ships&l=flotten.php">{*$ship.name*}</a> ({*$ship.count*})</td>
		<td width="200" align="center">
		<input style="color: #FFFFFF; background-color: #000000; font-size:10px" tabindex="3" type="text" name="p{*$ship.id*}" size="9" maxlength="9" value="0"></td>
	</tr>
{*/foreach*}
	<tr>
		<td align="center" colspan="2"><input style="border-style:solid; border-width:1px; width:100px; font-size:8pt; color:#FFFFFF; background-color:#000000" type="submit" value="Gruppe erstellen"></td>
	</tr>
</table>
</form>

und hier die PHP ...

PHP:
if(isset($_POST))
    {
      for($i=0;$i<500;$i++)
      {
        if(isset($_POST['p'.$i]) && ($_POST['p'.$i] >0))
		{
		$typ = $_POST['typ'];
		
	  	$db->set_new_group($user_id,$_SESSION['coords'],$typ,$_POST['p'.$i],$i);
		}
      }
    } 

    $smarty->display("$style/groups.html");

Wie oben gesagt, wenn keiner eine Lösung weiß, werde ich das ganze einfach mit einzelnen Spalten machen.

Gruß
Dirk
 
Du müsstest dann natürlich auch ein Array an Werten an die Funktion übergeben:

PHP:
$schiffe = array(1, 4, 12, 305);
$anzahl = array(4, 2, 5, 10);
set_new_group($user_id,$_SESSION['coords'],$typ, $anzahl, $schiffe);

Intern wird dann aus den beiden Arrays ein String. Ich dachte, das wäre soweit klar...
 
Du solltest sowieso im sinne eines guten Datenbankentwurfes keine Arrays in eine Zelle schreiben. Dazu kannst du dir mal die Seite über die Normalformen auf z.B.: wikipedia durchlesen.

Was mir zu der Datenbank noch auffällt ist, dass du anscheinend auch ein Feld Troopers hast, welches of leer ist. Du solltest auch versuchen keine Felder mit NullValues zu haben wenn sich dies vermeiden lässt.

Mein Vorschlag für die Datenbank:
Code:
Tabelle Groups:
| id | user_id | fleet_id | gal | sys | plan | group_id | type |

Tabelle GroupShips
| group_id | ship_id | anzahl |

Tabelle GroupTroops
| group_id | troop_id | anzahl |
 
Zurück