Variablenübergabe ?
gepostet vor 18 Jahre, 6 Monate von Kelturio
Hallo Leute,
und zwar bin ich gerade dabei ein Arbeitersystem in mein BG einzuführen, bei dem der User Arbeiter in die Minen schicken kann, die dort dann ihre Arbeit verrichten können.
Dabei wird zuerst ausgelesen wie viele Arbeitslose der Spieler derzeit hat und dann kann der User z.b. auf einen Link "1" klicken, wenn er 1 Arbeitslosen der Mine x zuordnen will.
Ich habe es derzeit so gelöst:
//zur Verfügung stehende Arbeiter auslesen
$sql = "SELECT Arbeiter FROM bgame_einheiten WHERE User_ID = '".$_SESSION["user_id"]."'";
$result = mysql_query ($sql);
$Arbeiter_frei = mysql_fetch_array ($result);
if ($Arbeiter_frei["Arbeiter"] >= 1) {
echo "
1";
}
if (isset($_REQUEST["Goldmine_zuweisen1"])) {
//Einen Arbeiter den Arbeitslosen abziehen
$Arbeitslose = $Arbeiter_frei["Arbeiter"] - 1;
$sql = "UPDATE bgame_einheiten SET Arbeiter = ".$Arbeitslose." WHERE User_ID = '".$_SESSION["user_id"]."'";
mysql_query ($sql);
}
Dies klappt auch bisher, aber wenn man nun auf diesen Link "1" klickt, dann lädt es erstmal die Seite neu und nebenbei führt es die Anweisungen in der letzten if-Abfrage aus.
Danach muss man die Seite nochmal aktualisieren und es werden einem nun die Arbeitslosen richtig angezeigt.
Kann man das ganze auch irgendwie OHNE Seitenaktualisierung machen ?
gepostet vor 18 Jahre, 6 Monate von Mudder
Mit AJAX könnte man es machen aber bei deinen Programmierfertigkeiten sage ich jetzt mal ganz einfach Nein!
gepostet vor 18 Jahre, 6 Monate von Kelturio
Naja, es ist noch kein Programmier-Profi vom Himmel gefallen. Ich kann es ja lernen. ^^
Was ist AJAX genau ?
gepostet vor 18 Jahre, 6 Monate von Chojin
*2 sekunden umstell*
//zur Verfügung stehende Arbeiter auslesen
$sql = "SELECT Arbeiter FROM bgame_einheiten WHERE User_ID = '".$_SESSION["user_id"]."'";
$result = mysql_query ($sql);
$Arbeiter_frei = mysql_fetch_array ($result);
$Arbeitslose = $Arbeiter_frei["Arbeiter"];
if (isset($_REQUEST["Goldmine_zuweisen1"])) {
//Einen Arbeiter den Arbeitslosen abziehen
$Arbeitslose = $Arbeiter_frei["Arbeiter"] - 1;
$sql = "UPDATE bgame_einheiten SET Arbeiter = ".$Arbeitslose." WHERE User_ID = '".$_SESSION["user_id"]."'";
mysql_query ($sql);
}
if ($Arbeitslose >= 1) {
echo "
1";
}
gepostet vor 18 Jahre, 6 Monate von woodworker
naja ich hätte ganz einfach nen dropdown feld oder nen textfeld hingemacht und dann halt zuweisen mit den werten
immer dieser ajax overhead
gepostet vor 18 Jahre, 6 Monate von Kelturio
@Chojin:
Du hast doch im Prinzip nur die unterste if-Abfrage mit der darüber vertauscht. Was genau bringt das ?
Und warum hast du über dieser Abfrage "$Arbeitslose = $Arbeiter_frei["Arbeiter"];" deklariert ? Darunter in der if-Abfrage wird es doch wieder deklariert, aber nur mit dem Unterschied, dass noch -1 gerechnet wird.
gepostet vor 18 Jahre, 6 Monate von Chojin
Original von Kelturio
@Chojin:
[..]
Du hast doch im Prinzip nur die unterste if-Abfrage mit der darüber vertauscht. Was genau bringt das ?
[..]
Hast du es ausprobiert?
gepostet vor 18 Jahre, 6 Monate von Kelturio
@Chojin:
Ja, und es ist genauso wie vorher.
gepostet vor 18 Jahre, 6 Monate von Chojin
dann würd ich an deiner stelle jetzt mal ein paar if's und echos einbauen, um die genauen werte zur laufzeit zu überprüfen.
Generel hab ich die Linkausgabe nach unten gezogen, weil du dann theoretisch mitbekommst, wenn sich was geändert hat... wenn deine Ausgabe ganz oben auf der Seite ist wird die immer falsch sein, wenn der Rest vom Script nach der Ausgabe noch was abzieht oder dazuzählt.
reg4rds
chojin
gepostet vor 18 Jahre, 6 Monate von Mudder
@Kelturio
AJAX ist eine System womit man mittels Javascript Anweisungen an den Server schicken kann. Sprich das eine JS-Funktion dem Server sagt, dass der User grade auf das Plus-Zeichen gedrückt hat. Mittels eines entsprechenden Frameworks kann der Server, JS nun sagen, dass es einen Text ausgeben soll, ein Bild ändern oder auch ne Alert-Message aufpoppen lassen soll.
Natürlich könntest du das AJAX-System lernen doch ohne dich beleidigen zu wollen, doch du solltest dich auf den Kern deines Spiels konzentrieren und die Finger davon lassen.
Was du evtl. aber auch machen könntest - wenn du das Input-Feld nicht verwenden willst was ich übrigends auch am besten finde - dann nehme neben einem "+1" auch Felder wie "+5", "+10" damit man nicht ewig rumklicken muss.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Das hatte ich auch vor, Mudder. :wink:
Ich wollte die Felder, +1, +5, +10 und +20 verwenden und vllt. auch noch +max. ^^
Kann man die Seite nicht nach der Abarbeitung dieses Codes nur ein einziges Mal von alleine aktualisieren lassen ?
Dann müsste es der User nicht manuell machen. :wink:
gepostet vor 18 Jahre, 6 Monate von Chojin
Original von Kelturio
Kann man die Seite nicht nach der Abarbeitung dieses Codes nur ein einziges Mal von alleine aktualisieren lassen ?
Dann müsste es der User nicht manuell machen. :wink:
genau das macht doch die Änderung von mir...
gepostet vor 18 Jahre, 6 Monate von Kelturio
@ Chojin:
Das hat meine Lösung vorher aber auch schon gemacht. :wink:
Die Aktualisierung müsste eben noch einmal mehr erfolgen.
gepostet vor 18 Jahre, 6 Monate von Chojin
Original von Kelturio
@ Chojin:
Das hat meine Lösung vorher aber auch schon gemacht. :wink:
Kann eigendlich nicht sein, da in deinem Code deine Ausgabe vor dem UPDATE query war...
Ich würd mal überprüfen ob deine webseiten irgendwo zwischengespeichert und deshalb falsch angezeigt werden.
So, das wars mit dem support, hab keine lust dir programmieren bei zu bringen.
reg4rds
chojin
gepostet vor 18 Jahre, 6 Monate von Kelturio
@Chojin:
Das find ich ja echt Klasse.
Willst du mir jetzt nur nicht helfen, da mein Code vorher auch schon funktioniert hatte und deiner keine Veränderrungen gebracht hat oder wie ?
Ich wollte jetzt auch nur wissen wie man nach der Abfrage seine Seite noch ein einziges weiteres Mal aktualisieren lassen kann, mehr nicht.
gepostet vor 18 Jahre, 6 Monate von The-Winner
Vermutlich wird die die ausgabe vor deinem Code gemacht(hast du nicht gepostet). Also einfach erst berechnen+aktualisieren, dann ausgeben.
gepostet vor 18 Jahre, 6 Monate von Kelturio
@The-Winner:
Genau, aber wie kann ich die Seite erneut aktualisieren ?
Denn ich muss die Ausgabe weiter oben machen, da ich die Anzeige da oben brauche.
Gibt es da irgend einen PHP Befehl oder so, mit dem ich die ganze Seite aktualisieren kann ?
gepostet vor 18 Jahre, 6 Monate von abuzeus
Du kannst deien Ausgaben doch im Skript machen, wann du willst.
Mache doch erst alle Berechnungen und gib am Schluss die Seite in einem Rutsch aus. Ist eh besser, Berechnungen und Darstellung zu trennen...
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ja, eigentlich müsste es bis jetzt ja auch klappen, aber ich verstehe nicht wieso es eben nicht klappt.
Es läfut so ab:
Der User betritt die Seite "Produktion" und kann dort sehen wie viele Arbeiter er dort hat, die zur Zeit keine Tätigkeit aussüben. Diese Arbeitslosen werden natürlich direkt aus der DB heraus gelesen.
Jetzt stehen dem User verschiedene Links zur Verfügung, mit denen er 1, 5, 10, 20 oder eben die maximale Arbeiterzahl in Mine x schicken kann.
Nun entscheidet sich der User beispielsweise für 5 Arbeiter und klickt auf den Link mit der "5". Dann passiert folgendes:
if (isset($_REQUEST["Goldmine_zuweisen5"])) {
$Anzahl = 5;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
}
In der Funktion "Arbeiterzuweisung" werden nun die 5 Arbeiter von den Arbeitslosen abgezogen und der Goldmine zugeordnet. Am Schluss werden dann noch alle Tabellen auf den neuesten Stand mit einem UPDATE-Befehl gebracht.
Nachdem der User auf den Link mit der "5" geklickt hat, aktualisiert sich die Seite irgendwie von alleine.
Nun scrollt man runter, aber es stehen nicht 5 Arbeitslose weniger in der Spalte, sondern genauso viele wie vorher.
Erst wenn man nun wieder erneut die Seite aktualisiert, steht die richtige Anzahl in der Spalte.
Eigentlich müsste das ganze doch schon beim Ersten mal funzen, denn die Arbeitslosen werden doch direkt aus der DB gelesen.
gepostet vor 18 Jahre, 6 Monate von TheUndeadable
Öffnest du eine zweite Db-Connection?
Evtl kann es sein, dass der Update-Query noch in einer Queue liegt, während der Select-Query schon aktiv ist.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ne, eine zweite Connection öffne ich nich.
Kann es irgend etwas mit den Links zu tun haben ?
Der Link, um 5 Arbeiter in die Goldmine zu schicken, sieht z.b. so aus:
echo "
5";
Darunter sage ich dann:
if (isset($_REQUEST["Goldmine_zuweisen5"])) {
$Anzahl = 5;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
}
Das Problem ist wahrscheinlich, dass sich die Seite nach dem Klick auf diesen Link nicht "richtig" aktualisiert.
Sie soll sich richtig aktualisieren, damit sich auch die Werte richtig aktualisieren.
gepostet vor 18 Jahre, 6 Monate von Störti
Wenn du einen "normalen" Link (kein JavaScript) erstellst und im Browser auf ihn klickst, wird die seite neu geladen, "halb geladen" oder so gibt es da nicht. Ich sehe den Fehler eher dort:
Am Anfang des Scriptes initialisierst du die Userdaten und auch die Arbeitslosen. Danach führst du die Aktion "Arbeiter zur Arbeit schicken" aus und hast die Userdaten innerhalb des Scriptes jedoch nicht aktualisiert, sondern nur die in der DB.
Du musst in deiner Funktion dann noch eine Zeile hinzufügen:
$userdata['arbeitslose'] -= $Anzahl;
Dann merkt auch PHP, dass sich die Anzahl geändert hat.
Ansonsten merkt PHP das erst, wenn beim nächsten Scriptaufruf die Daten neu ausgelesen werden.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Hmm, genau kann ich dir da nicht folgen.
Also:
In meiner Datei produktion.php steht bei den Arbeitslosen eine Zahl, also Select .... von DB. Dann weiter unten habe ich diese Links stehen bei denen der User sich aussuchen kann wie viele Arbeiter er in die Mine schickt.
Direkt danach kommt eine Abfrage:
if (isset($_REQUEST["Goldmine_zuweisen1"])) {
$Anzahl = 1;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
}
Diese löst verschickt dann die Arbeiter etc. und die Seite wird neu geladen, da der Link ja heißt:
echo "
5";
Aber ich versteh nicht ganz wo ich etwas setzen soll, damit man die Seite nicht noch einmal aktualisieren muss.
Gibt es nicht irgend einen Refresh-Befehl oder so, der die Seite einmal noch selbst aktualisiert ?
gepostet vor 18 Jahre, 6 Monate von Krisch
Die übergibst der Funktion 'Arbeiterzuweisung' einen Parameter 'Arbeitslose'. Und so wie es aussieht vergisst du ausserhalb von der Funktion den Wert der übergebenen Variablen zu ändern.
Soll heissen: jedes Mal nachdem du die Funktion aufgerufen hast, musst du $Arbeitslose -= $Anzahl machen.
Bei deinem Beispiel:
if (isset($_REQUEST["Goldmine_zuweisen1"])) {
$Anzahl = 1;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
$Arbeitslose -= $Anzahl;
}
(Alternativ übergibst du den Parameter per Referenz oder gibst als Rückgabewert die neue Anzahl der Arbeitslosen zurück.)
gepostet vor 18 Jahre, 6 Monate von Kelturio
Hmm, jo, habe es mal so probiert, aber das selbe Prob bleibt immer noch bestehen:
Nach dem Klick auf den Link lädt es die Seite neu, aber die Werte haben sich noch nicht verändert.
Auch das Gold müsste sich z.b. verändert haben, da das Arbeiter zuweisen Gold kostet.
Erst wenn man die Seite erneut aktualisiert stehen die richtigen Werte da.
Das selbe Prob habe ich übrigens auch beim Gebäudebau.
Der User klickt auf einen Submit Button ausbauen und die Bauzeit wird angezeigt. Nun muss man die Seite aber noch einmal aktualisieren, damit man sieht, dass es die benötigten Ressourcen abgezogen hat.
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Original von Kelturio
In der Funktion "Arbeiterzuweisung" werden nun die 5 Arbeiter von den Arbeitslosen abgezogen und der Goldmine zugeordnet.
Wo werden die denn abgezogen? In der Datenbank oder auch bei deinen php-Variablen? Du mußt nicht nur den Inhalt der Datenbank aktualisieren, wenn sich Werte ändern, sondern auch die Variablen in deinem Code auf dieser Seite. Hast du das?
Original von Kelturio
echo "
5";
Darunter sage ich dann:
if (isset($_REQUEST["Goldmine_zuweisen5"])) {
$Anzahl = 5;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
}
Das "Darunter" klingt für mich eher so, als wäre der Funktionsaufruf immernoch unter der Ausgabe. Ist das nun so oder hast du die Berechnungen an den Anfang genommen?
gepostet vor 18 Jahre, 6 Monate von Störti
Grundsätzlich solltest du dir angewöhnen, dass du alle Aktionen, die der User ausführen kann, abgearbeitet werden, BEVOR du irgendwas an den user ausgibst. Ich habe das bei mir so gelöst, dass ich in der Datei "page_header.php", die bei mir in jeder Seite den Kopf der Seite ausgibt (Logo, Menü etc.), prüfe, ob die Variable $_REQUEST['action'] gesetzt ist. Wenn ja, wird irgendeine Aktion ausgeführt. Danach entscheide ich per switch, was dann gemacht wird. Dadurch gehe ich sicher, dass die Daten, die zum Ausgeben der Seite genutzt werden garantiert akuell sind.
if (isset($_REQUEST["Goldmine_zuweisen5"])) {
$Anzahl = 5;
Arbeiterzuweisung("Goldmine", $Anzahl, $Arbeitslose);
}
Genau genommen kannst du dir in diesem Block die Initialisierung von $Anzahl sparen, wenn du die 5 gleich in den Funktionsaufruf schreibst:
if (isset($_REQUEST["Goldmine_zuweisen5"])) {
Arbeiterzuweisung("Goldmine", 5, $Arbeitslose);
}
Das spart den Speicherplatz für den überflüssigen Integerwert (man muss sparen, wo man kann).
gepostet vor 18 Jahre, 6 Monate von Kelturio
@Julbrygd:
Ja, hatte es gestern Abend noch so gemacht und es geht.
Besser gesagt es gänge, denn die verschiedenen benötigten Variablen zur Berechnung muss ich auch nun noch mit hoch in den Quelltext nehmen, oder ich binde sie gleich mit in die Funktion ein. Mal sehen.
Nur, wenn ich die ganzen Variablen und Berechnungen nach oben verschiebe, dann muss ich ja unten vor dem Aufruf, all diese Variablen auf "global" setzen, denn sonst steht immer da, dass sie nicht definiert wären. Ist das normal oder geht das auch anders ?
Danke !
@Störti:
Ja, das mit dem aaktuell halten der Daten habe ich nun verstanden.
Hmm, da muss ich noch ne Menge Code von mir nochmal durchgehen, um es richtig zu machen.
Naja, man lernt immer wieder dazu und selbst das beste Browsergame wird noch nicht die "beste" Lösung sein. ^^
Thx auch an dich !
gepostet vor 18 Jahre, 6 Monate von Störti
Alle Daten, die du häufig brauchst, würde ich versuchen in ein bzw. mehrere sinngerechte Arrays zu packen. Z.B. alles, was du dir aus der DB holst und direkt mit dem User zu tun hat (Registrierungsdaten, Profileinstellungen, Rohstoffe und speziell Arbeitslose, weil mir das dort aufgefallen ist) in ein Array $userdata und alle Configdaten, die du irgendwann mal brauchst in ein Array $config (wenn es konstante Werte sind, würde ich aber eher Konstanten empfehlen, die du mit define() erstellst). Dann musst du in den Funktionen imme rnur schreiben "global $userdata, $config;" schreiben und keine Romane wie "global $user_id, $username, $user_pass, $arbeitslose, [...];".
Weiterhin lege ich dir eines nahe:
Schreibe dein BG alleine, also ohne bei jedem Problem gleich dieses Forum hier zu beschäftigen. Es ist hier zur zeit zwar deutlich aktiver als sonst, aber es bringt nichts, wenn wir dir dein Game schreiben, du musst seibst auf die Lösungen kommen.
Und dass dein erstes BG gleich perfekt wird (oder auch nur annähernd), kannst du sowieso vergessen, dass kann dir hier sicherlich JEDER bestätigen. Sowas brauch Übung und Erfahrung...
gepostet vor 18 Jahre, 6 Monate von Fornax
... und sehr viel Zeit und Motivation
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ok, vielen Dank für eure Ratschläge.
Sollte ich die Arrays wie $userdata etc. gleich im Login definieren als Session oder sowas ? Geht das ?
Edit:
Ich habe den Code nun alles in den Header gepackt, aber da sind nun haufenweise if-Abfragen. Kann man die auch etwas kürzer machen oder nicht ?
if (isset($_REQUEST["Goldmine_zuweisen1"])) Arbeiterzuweisung("Goldmine", 1, $Arbeitslose);
if (isset($_REQUEST["Goldmine_zuweisen5"])) Arbeiterzuweisung("Goldmine", 5, $Arbeitslose);
if (isset($_REQUEST["Goldmine_zuweisen10"])) Arbeiterzuweisung("Goldmine", 10, $Arbeitslose);
if (isset($_REQUEST["Goldmine_zuweisen20"])) Arbeiterzuweisung("Goldmine", 20, $Arbeitslose);
if (isset($_REQUEST["Goldmine_zuweisen".$max_goldmine])) Arbeiterzuweisung("Goldmine", $max_goldmine, $Arbeitslose);
if (isset($_REQUEST["Saegewerk_zuweisen1"])) Arbeiterzuweisung("Saegewerk", 1, $Arbeitslose);
if (isset($_REQUEST["Saegewerk_zuweisen5"])) Arbeiterzuweisung("Saegewerk", 5, $Arbeitslose);
if (isset($_REQUEST["Saegewerk_zuweisen10"])) Arbeiterzuweisung("Saegewerk", 10, $Arbeitslose);
if (isset($_REQUEST["Saegewerk_zuweisen20"])) Arbeiterzuweisung("Saegewerk", 20, $Arbeitslose);
if (isset($_REQUEST["Saegewerk_zuweisen".$max_saegewerk])) Arbeiterzuweisung("Saegewerk", $max_saegewerk, $Arbeitslose);
if (isset($_REQUEST["Steinbruch_zuweisen1"])) Arbeiterzuweisung("Steinbruch", 1, $Arbeitslose);
if (isset($_REQUEST["Steinbruch_zuweisen5"])) Arbeiterzuweisung("Steinbruch", 5, $Arbeitslose);
if (isset($_REQUEST["Steinbruch_zuweisen10"])) Arbeiterzuweisung("Steinbruch", 10, $Arbeitslose);
if (isset($_REQUEST["Steinbruch_zuweisen20"])) Arbeiterzuweisung("Steinbruch", 20, $Arbeitslose);
if (isset($_REQUEST["Steinbruch_zuweisen".$max_steinbruch])) Arbeiterzuweisung("Steinbruch", $max_steinbruch, $Arbeitslose);
if (isset($_REQUEST["Erzmine_zuweisen1"])) Arbeiterzuweisung("Erzmine", 1, $Arbeitslose);
if (isset($_REQUEST["Erzmine_zuweisen5"])) Arbeiterzuweisung("Erzmine", 5, $Arbeitslose);
if (isset($_REQUEST["Erzmine_zuweisen10"])) Arbeiterzuweisung("Erzmine", 10, $Arbeitslose);
if (isset($_REQUEST["Erzmine_zuweisen20"])) Arbeiterzuweisung("Erzmine", 20, $Arbeitslose);
if (isset($_REQUEST["Erzmine_zuweisen".$max_erzmine])) Arbeiterzuweisung("Erzmine", $max_erzmine, $Arbeitslose);
if (isset($_REQUEST["Farm_zuweisen1"])) Arbeiterzuweisung("Farm", 1, $Arbeitslose);
if (isset($_REQUEST["Farm_zuweisen5"])) Arbeiterzuweisung("Farm", 5, $Arbeitslose);
if (isset($_REQUEST["Farm_zuweisen10"])) Arbeiterzuweisung("Farm", 10, $Arbeitslose);
if (isset($_REQUEST["Farm_zuweisen20"])) Arbeiterzuweisung("Farm", 20, $Arbeitslose);
if (isset($_REQUEST["Farm_zuweisen".$max_farm])) Arbeiterzuweisung("Farm", $max_farm, $Arbeitslose);
gepostet vor 18 Jahre, 6 Monate von Störti
switch ( $action )
{
case 'Goldmine_zuweisen1' : Arbeiterzuweisung("Goldmine", 1, $Arbeitslose); break;
case 'Goldmine_zuweisen5' : Arbeiterzuweisung("Goldmine", 5, $Arbeitslose); break;
case 'Goldmine_zuweisen10' : Arbeiterzuweisung("Goldmine", 10, $Arbeitslose); break;
case 'Goldmine_zuweisen20' : Arbeiterzuweisung("Goldmine", 20, $Arbeitslose); break;
[...]
}
In der Form hab ichs gemacht.
Also dass du nur eine Variable hast, die du prüfen musst ($action) und nicht zig Tausende. Dann sieht ein switch-Block viel übersichtlicher aus...
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ja, aber ein Link sieht ja so aus:
echo "
5";
Da steht doch gar nichts von $action. Denn ich muss ja überprüfen, ob Link x geklickt wurde.
Muss der Link da so heißen ?:
echo "
5";
Eine weitere Frage. Ich habe vor den Berechnungen nun, welche ich nun ganz oben hin getan habe noch paar SELECT Befehle gepackt, denn die Funktion brauch paar Variablen.
//zur Verfügung stehende Arbeiter auslesen
$sql = "SELECT Arbeiter FROM bgame_einheiten WHERE User_ID = '".$_SESSION["user_id"]."'";
$Arbeiter_frei = mysql_fetch_array(mysql_query($sql));
$Arbeitslose = $Arbeiter_frei["Arbeiter"];
//Arbeitende Arbeiter auslesen
$sql = "SELECT Goldmine_Arbeiter, Saegewerk_Arbeiter, Steinbruch_Arbeiter, Erzmine_Arbeiter, Farm_Arbeiter FROM bgame_produktionsgebaeude WHERE User_ID = '".$_SESSION["user_id"]."'";
$Arbeiter = mysql_fetch_array(mysql_query($sql));
//Gebäudestufen auslesen
$sql = "SELECT Goldmine, Saegewerk, Steinbruch, Erzmine, Farm FROM bgame_produktionsgebaeude WHERE User_ID = '".$_SESSION["user_id"]."'";
$Gebaeudestufe = mysql_fetch_array(mysql_query($sql));
//max Arbeiterzuweisung feststellen
$Freie_Stelle_Gold = $Gebaeudestufe["Goldmine"] * 5 - $Arbeiter["Goldmine_Arbeiter"];
if ($Freie_Stelle_Gold > $Arbeitslose) $max_goldmine = $Arbeitslose; else $max_goldmine = $Freie_Stelle_Gold;
$Freie_Stelle_Holz = $Gebaeudestufe["Saegewerk"] * 5 - $Arbeiter["Saegewerk_Arbeiter"];
if ($Freie_Stelle_Holz > $Arbeitslose) $max_saegewerk = $Arbeitslose; else $max_saegewerk = $Freie_Stelle_Holz;
$Freie_Stelle_Stein = $Gebaeudestufe["Steinbruch"] * 5 - $Arbeiter["Steinbruch_Arbeiter"];
if ($Freie_Stelle_Stein > $Arbeitslose) $max_steinbruch = $Arbeitslose; else $max_steinbruch = $Freie_Stelle_Stein;
$Freie_Stelle_Erz = $Gebaeudestufe["Erzmine"] * 5 - $Arbeiter["Erzmine_Arbeiter"];
if ($Freie_Stelle_Erz > $Arbeitslose) $max_erzmine = $Arbeitslose; else $max_erzmine = $Freie_Stelle_Erz;
$Freie_Stelle_Nahrung = $Gebaeudestufe["Farm"] * 5 - $Arbeiter["Farm_Arbeiter"];
if ($Freie_Stelle_Nahrung > $Arbeitslose) $max_farm = $Arbeitslose; else $max_farm = $Freie_Stelle_Nahrung;
Genau diesen Block an Abfragen und kurzen Berechnungen für die Funktion, habe ich nun nach der Funktion ein zweites mal hin getan, denn wenn die Funktion abgearbeitet wurde, dann brauche ich gleich die neuen Wert der DB und der berechneten Felder wie Freie_Stelle.
Ist das ok so, dass ich das ein zweites mal nach der Funktion stehen habe ?
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Probier es doch mal mit so einem Link:
echo "5";
Und die Auswertung dann so:
if (isset($_REQUEST["gebaeude"]) and isset($_REQUEST["arbeiter"])) Arbeiterzuweisung($_REQUEST["gebaeude"], $_REQUEST["arbeiter"], $Arbeitslose);
Oder wenn du noch prüfen willst, ob auch wirklich eine "gültige" Gebäudeanzahl übergeben wurde:
$gebaeudeanzahl=array(1,5,10,20);
if (isset($_REQUEST["gebaeude"]) and isset($_REQUEST["arbeiter"]) and in_array($_REQUEST["arbeiter"], $gebaeudeanzahl)) Arbeiterzuweisung($_REQUEST["gebaeude"], $_REQUEST["arbeiter"], $Arbeitslose);
Hier fehlen dann allerdings noch die $max-Werte.
Bei den Links setzt du dann jeweils das Gebäude bzw. die Arbeiteranzahl unterschiedlich. Und eigentlich brauchst du nicht den gesamten Block nochmal hin, dabei wird jede Abfrage nochmal von der Datenbank geholt, das muß nicht sein. Änder doch die Variable nach dem Aufruf der Funktion, wenn es geht. Oder übergib sie von der Funktion zum Haupttext mit return.
gepostet vor 18 Jahre, 6 Monate von The-Winner
aber aufpassen dass arbeiter integer ist und >0 sonst gibts Probleme.
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Dann hier nochmal komplett:
if (isset($_REQUEST["gebaeude"]) and isset($_REQUEST["arbeiter"])) {
$maxanzahl="max_".$_REQUEST["gebaeude"];
$arbeiteranzahl=array(1,5,10,20,$$maxanzahl);
$gebaeudetypen=array("goldmine","saegewerk","steinbruch","erzmine","farm");
if (in_array($_REQUEST["arbeiter"], $arbeiteranzahl) and in_array($_REQUEST["gebaeude"], $gebaeudetypen)) {
Arbeiterzuweisung($_REQUEST["gebaeude"], $_REQUEST["arbeiter"], $Arbeitslose);
};
};
Die Links dann so:
echo "5";
Achtung dabei im Link die gleiche Schreibweise verwenden wie in der Variable für die $max-Werte (Kleinschreibung).
edit: Nun auch noch die Überprüfung der Gebäudetypen, damit sollte es funktionieren. Ist auf jeden Fall weniger aufwendig als die umfangreiche if-Abfrage. Ich persönlich würde in diese Variante keine Abfrage mehr machen, ob arbeiter >0 und integer ist, weil ich denke, daß das durch das in_array gegeben ist. In der Variante oben, ohne in_array, sollte das aber unbedingt rein.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Hey, vielen Dank. Das klappt auch wunderbar bis auf die Links, bei denen die maximale Anzahl an Arbeitern zugewiesen wird.
Also:
Ganz oben auf der Seite werden erst einmal die max-Werte ermittelt:
$Freie_Stelle_Gold = $Gebaeudestufe["Goldmine"] * 5 - $Arbeiter["Goldmine_Arbeiter"];
if ($Freie_Stelle_Gold > $Arbeitslose) $max_Goldmine = $Arbeitslose; else $max_Goldmine = $Freie_Stelle_Gold;
Diese selben Zeilen sind darunter noch einmal für jedes andere Gebäude geschrieben.
So, dann kommt die Abfrage, ob was geklickt wurde:
if (isset($_REQUEST["gebaeude"]) and isset($_REQUEST["arbeiter"])) {
$maxanzahl = "max_".$_REQUEST["gebaeude"];
$arbeiteranzahl = array(1, 5, 10, 20, $maxanzahl);
$gebaeudetypen = array("Goldmine", "Saegewerk", "Steinbruch", "Erzmine", "Farm");
if (in_array($_REQUEST["arbeiter"], $arbeiteranzahl) and in_array($_REQUEST["gebaeude"], $gebaeudetypen)) {
Arbeiterzuweisung($_REQUEST["gebaeude"], $_REQUEST["arbeiter"], $Arbeitslose);
}
}
Danach kommt nochmal eine Aktualisierung der Daten, also der selbe Block mit Anweisungen wie SELECT * FROM blabla erfolgt dann nocheinmal wie über der Abfrage, ob was geklickt wurde, damit die Daten ganz unten immer aktuell sind.
Und ganz unten stehen dann die Links, hier ein Bsp. für einen Maxlink:
echo "
max";
Aber wenn ich nun auf max klicke passiert überhaupt nix.
Was habe ich falsch gemacht ?
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Original von Julbrygd
Achtung dabei im Link die gleiche Schreibweise verwenden wie in der Variable für die $max-Werte (Kleinschreibung).
In deinem Link ist das Gebäude groß geschrieben.
Rufst du die Funktion Arbeiterzuweisung noch von woanders aus auf? Wenn nicht, kannst du auch den Funktionsinhalt direkt dahin schreiben, wo der Funktionsaufruf ist. Dann ersparst du dir die Aktualisierung der Daten.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ja, ich rufe die Funtkion auch noch woanders auf.
Das mit dem Maxlink müsste doch aber funktionieren, denn ich habe die Strings in den Arrays ja nun auch groß geschrieben.
if (isset($_REQUEST["gebaeude"]) and isset($_REQUEST["arbeiter"])) {
$maxanzahl = "max_".$_REQUEST["gebaeude"];
$arbeiteranzahl = array(1, 5, 10, 20, $maxanzahl);
$gebaeudetypen = array("Goldmine", "Saegewerk", "Steinbruch", "Erzmine", "Farm");
if (in_array($_REQUEST["arbeiter"], $arbeiteranzahl) and in_array($_REQUEST["gebaeude"], $gebaeudetypen)) {
Arbeiterzuweisung($_REQUEST["gebaeude"], $_REQUEST["arbeiter"], $Arbeitslose);
}
}
Also kann ich es im Link doch auch groß lassen, oder ?
echo "
max";
Es funktioniert aber trotzdem nicht.
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Da fehlt ein $.
$arbeiteranzahl = array(1, 5, 10, 20, [color=red]$[/color]$maxanzahl);
gepostet vor 18 Jahre, 6 Monate von Chojin
Muss den das ein Array sein? Ich würde da einen mehrdimensionalen Switch draus machen
Und dann würde ich eine OOP Lösung des Problems deutlich vorziehen!
mod_rewrite hilft obendrein, dass der Link ordentlich aussieht:
RewriteRule ^Zuweisen/(Goldmine|Sägewerk|Steinbruch|Erzmine|Farm)/([0-9]{1,2})/Arbeiter/?$ /zuweisen.php?&gebaeude=$1&arbeiter=$2 [QSA,L]
Es ist schon sehr interessant was aus dem Topic geworden ist, letztenendes ist das hier eine Art "remote debugging" und ich hoffe ihr habt da immernoch bock drauf wenn es dann mal nichtmehr um so simple Sachen geht.. (in 7 Monaten oder nem Jahr kommt dann das Kampfscript dran)
Es wäre in meinen Augen viel sinnvoller den Leuten zu erklären wie sie selbst debuggen und fehler abschalten, als ihnen hier jeden fetzen quellcode vorzukauen. Ein bisschen Grundwissen sollte man schon vorlegen können, wenn es um etwas so Komplexes wie ein Browsergame geht.
reg4rds
chojin
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Viele Wege führen nach Rom. Er muß es ja nicht so nehmen, wie es da steht. Es ist ein Vorschlag, mehr nicht. Und nein, in 7 Monaten bin ich nicht mehr hier. Aber wenn ich jetzt etwas Zeit habe, warum nicht? Sicher hat er mehr davon, wenn ihm einer erklärt, wie er selbst die Fehler findet, nur braucht das bei so kleinen Sachen mehr Zeit als mal eben einen Code-Vorschlag zu machen. BTW finde ich in deiner Antwort auch nichts davon. :wink: Hinter das Fehlerfinden wird er eh noch kommen, wenn er mit dem Projekt weiter macht. Ich denke, da kommt keiner drumrum.
gepostet vor 18 Jahre, 6 Monate von gorgo
Also ich geb Cojin da völlig Recht. Wenn ihr an so einem Code noch weiter mit herum Flickschustert und copy und Paste den gebrauch des eigenen Hirns ersetzt, denn hilfst du ihm kein Stück.
Vorallem wenn er nichtmal versteht warum etwas nu funktioniert (oder eben nicht), wird das doch um so schlimmer um so länger er auf diesem Weg "nach Rom" eiert.
Sorry aber z.B. dieser IF Block um die Arbeiteranzahl einzuteilen müsste z.B. komplett eingestampft und neu gescriptet werden anstatt das man da nun noch die Fehler rausfindet.
Alle mal hand hoch, die diese 20 Zeilen code in maximal 3 zeilen erledigen.
@ Kelturio. Ich will hier nicht deine Arbeit mies machen, aber dein Code entwickelt sich zu etwas, wofür du dich selber noch verfluchen wirst. Und bei diesem Code ist das einzigste was du lernst, das sich immer wer findet der dir nen pflaster auf ne wunde stelle klepbt wo im Grunde ne amputation nötig wär
gepostet vor 18 Jahre, 6 Monate von Kelturio
@Julbrygd:
Danke, mit dem zweiten $ klappt das nun auch einwandfrei.
Warum muss man da eigentlich zwei $ machen ? Was hat das zu bedeuten ?
@Chojin und gorgo:
Ja, ich weiß, dass mir hier ziemlich viele Codestücke gleich komplett vorgelegt wurden, aber andererseits frage ich ja nun auch nicht gleich nach Codesegmenten, sondern einfach um Hilfe, da ich noch ein Newbie in Sachen PHP Programmierung bin. Habe mir PHP eben erst vor kurzer Zeit einigermaßen selbst mit Tutorials etc. beigebracht, aber um dies sehr gut beherschen zu können, benötigt es weitaus mehr Ausdauer und Übung als ich es bis jetzt hinter mich gebracht habe.
Habt ihr nicht auch mal ganz klein angefangen ? :wink:
Ich bin bereit zu lernen und würde z.b. auch sehr gerne wissen wollen wie man selbst in PHP professionell Fehlersuche bzw. Debugging betreiben kann, denn wenn ich das dann kann, dann würde ich auch vllt. nicht mehr soo viel Hilfe hier vom Forum benötigen, wer weiß. ^^
Auch in Sachen OOP mit PHP habe ich bisher noch keine Erfahrungen gemacht, da es einfach eine komplexere und schwierigere Sache ist und ich mich deswegen erstmal nicht an dieses Thema gewagt habe. Aber da werde ich wohl nicht drum herum kommen, wenn ich einen guten Code schreiben möchte. :wink:
Könnt ihr mir da vllt. auch gute Seiten, Tutorials o.ä. nennen, bei denen ich OOP und solche Dinge lernen kann ?
gepostet vor 18 Jahre, 6 Monate von friedenspanzer
Hmm... meine Standardantwort wenn jemand ein Tutorial über PHP sucht:
http://tut.php-q.net/ Dort hab ich alles her und es erklärt teilweise relativ tiefgehend wie was warum funktioniert.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Vielen Dank, das werd ich mal durchpauken.
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Wenn man fertige Codeschnipsel bringt, läuft man natürlich Gefahr, daß derjenige diese verwendet ohne sich einen Kopf zu machen, warum das funktioniert. Ich denke aber spätestens wenn er an anderer Stelle vor einem ähnlichen Problem steht, wird er sich darüber Gedanken machen.
Und einem Programmieranfänger zu sagen, he dein Code ist auch in 3 Zeilen zu machen, ohne einen Ansatz dafür, finde ich ehrlichgesagt sinnlos. Wenn, dann sollte man schon wenigstens andeuten, in welche Richtung das laufen kann, sonst nützt ihm der Ratschlag genau überhaupt nichts.
Natürlich ist der IF-Block nicht schön (deshalb habe ich mich überhaupt hier eingemischt), aber ein erstes Browsergame sieht nunmal oft nicht anders aus. Und immerhin funktionierte er, ich finde schon allein das gibt ihm eine gewisse Daseinsberechtigung. In seinem zweiten Bowsergame wird Kelturio sowas mit Sicherheit nicht mehr reintun.
@gorgo: Die Amputation hat der Code gerade hinter sich.
@Kelturio: In $maxanzahl befindet sich der Name der Variable, als String. Und das zweite $ steht da, damit dieser String als Variable verwendet wird. Also $maxanzahl könnte sein max_Farm, dann ist $$maxanzahl $max_Farm und damit die Variable, die ausgewertet werden soll.
gepostet vor 18 Jahre, 6 Monate von Kelturio
Ach so, nun ist mir alles klar. Vielen Dank.
Und wieder bin ich um ein Schnipsel PHP Wissen reicher geworden.