Frage zum ändern von MySQL Datenbank einträgen mit PHP

Hi ^^.
Und zwar hab ich folgendes Problem.
Ich betreibe derzeit nen kleinen GameServer mit etwa 39 Leuten.
Das Problem der Server hat einige macken (leider kein Source Code…) und schreibt einen DB eintrag falsch.

Das sind jeweils zwei Spalten einmal
skills
1,2,3,4,5,6,9,10,7,8,11,12,13,14,108,109,111,112,0,0,0,0,0,136,137,138,139,140,141,142,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0

und skill_levels
10,10,10,0,0,0,5,0,20,20,0,0,0,0,20,20,20,0,0,0,0,0,0,0,4,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Diese beiden Einträge sind so richtig (falsch wäre bei skills die ersten Zahlen 0,0,0… und bei skill_levels am Anfang 0,0,0…)

Der Server trägt allerdings bei beiden Einträgen am Anfang jeweils 3 Nullen ein und das ist schlecht weil dann eben die Skills nicht funken.

So jetzt kommt der Teil wieso ich hier frage.

Das mit den Skills steht in der Tabelle Characters.
Jeder Eintrag hat eine Spalte in der der Account Name eines Spielers steht (accountname)

Das heißt jedem Eintrag ist ein Fester Account zugeteilt.
Nun möchte ich folgendes.

Auf meiner Account Registrationswebseite soll es ein kleines HTML Formular geben.
Dort soll der Spieler seinen Accountname eingeben und dann sollen alle Chars gefixt werden. (Ich weiß eine einfache eingabe des Charnamens wäre einfacher und das würde sogar ich bewerkstelligen können mit etwas Geduld)

Sprich die ersten 3 nullen mit 1,2,3 und bei den Leveln mit 10,10,10 ersetzen.
Ist das ihrgendwie möglich ?

Ihrgendwie hab ich im Kopf noch was alla verknüpften Tabellen.

Hoffe ihr könnt mir da weiterhelfen.

Ok vergisst das verknüpften Tabellen von mir ^^.
In der Tabelle Characters steht ja der Accountname.
Also müsste ich einfach nur alle Character einträge selectieren bei denen der Accountname übereinstimmt.

Allerdings hab ich noch ein Problem.
Ich bekomm das mit den Einträgen doch nicht hin.
Ich wüsste nur wie man den Eintrag komplett ändert.
Das Risiko das jemand seinen Action Slot Fixt und dann plötzlich keine Skills lvl mehr hat möchte ich nicht eingehen.
Könnte man da noch ne If Abfrage machen ob bei Skills und Skills Level der Wert bei 0 liegt und nur dann den Befehl ausführen der in die DB schreibt ? Sollte eigentlich doch machbar sein.

Kurz mal: woot?

Ich verstehe im Prinzip nur Bahnhof: Koffer klauen. :slight_smile:

Also wenn ich das richtige verstehe, hast du eine MySQL-Datenbank mit zwei Tabellen, die nicht das tun, was du möchtest.

Dazu kommt noch irgendwas mit Characters (Vermutlich eine weitere Tabelle?), in der die “skills”-Tabelle auch auftritt? Also kann man davon ausgehen, dass die Tabelle ca. so aussieht und skills nur eine Spalte ist?

accountname | ... | skills
------------------------
// Einträge

Wieso tauchen aber irgendwelche Nullen auf und wie sieht jetzt bitte schön ein Eintrag bei dir aus?

Würde gerne mal sehen, wie ein Eintrag aussieht und was in skills da steht und in der anderen Tabelle (oder Spalte). (also nimm dir mal ein Beispielaccount vor und zeig uns wie die Tabellen aufgebaut sind)

Zum zweiten Post: Was ist ein “ActionSlot”? Woher kommt er und wohin will er? :smiley: Eine IF-Abfrage kannst du definitiv machen :wink:

Ganz grob geschätzt: Du hast vermutlich ein großes Problem mit der Normalisierung der Tabellen :slight_smile: Oder anders ausgedrückt: Die Konsistenz der Daten ist bei dir - jedenfalls so wie es z.Zt. klingt für mich - nicht gewährleistet.

MfG
myPages

Wenn die Vagrant Skills (1,2,3) nicht eingetragen lässt der Slot einem das Spiel abstürzen wenn man versucht einen Skill reinzuziehen.
In den Action Slot kann man mehrere Skills ziehen damit diese schneller ausgeführt werden.
Hier mal meine Tabelle.
Es geht nur um die Tabelle Characters und die Spalten

skills text NOT NULL,
skill_levels text NOT NULL,

Via der Spalte accountname text NOT NULL, möchte ich den Datenbankeintrag auswählen lassen. Der jenige soll in das Formular einfach seinen Accountname eintragen und dann werden alle Chars gefixt die er derzeit besitzt. Und wenn man es noch ganz übertreiben will könnte man sogar ausgeben welche JobKlasse er ist

Allerdings muss dies eben geschehen wenn der Char erstellt wurde weil der Server dann erst seine Daten in die Tabelle schreibt.

Also so solls aussehen.

Spieler registriert sich. Erstellt einen Account. Erstellt einen Character. Spieler geht auf die HP und fixt seinen Slot.

Sollte bei einem Char etwas anderes als 0 oder 0,0,0,… stehen dann soll ein echo ausgegeben werden. Am besten welche Chars schon gefixt sind bzw. wo schon den 1. JobChange gemacht haben. Und was auch super wäre wenn da dann stehen würde
"Dein Character charname ist schon class"
Man müsste dann halt die Zahl wo bei class steht noch eine Bezeichnung geben.

Hier mal die Struktur und einen funktionieren Char und einen der buggy ist.

[code]-- phpMyAdmin SQL Dump
– version 2.11.7
http://www.phpmyadmin.net

– Host: localhost
– Erstellungszeit: 02. Oktober 2008 um 08:57
– Server Version: 5.0.51
– PHP-Version: 5.2.6

SET SQL_MODE=“NO_AUTO_VALUE_ON_ZERO”;

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
/
!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
/
!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
/
!40101 SET NAMES utf8 */;


– Datenbank: flyff



– Tabellenstruktur für Tabelle accounts

CREATE TABLE IF NOT EXISTS accounts (
id int(255) NOT NULL auto_increment,
username varchar(32) NOT NULL default ‘’,
password varchar(32) NOT NULL default ‘’,
accesslevel int(3) NOT NULL default ‘0’,
logged_in int(1) NOT NULL default ‘0’,
channelnum int(255) NOT NULL default ‘0’,
bankpassword int(4) NOT NULL default ‘0’,
bankpenya1 int(9) NOT NULL default ‘0’,
bankpenya2 int(9) NOT NULL default ‘0’,
bankpenya3 int(9) NOT NULL default ‘0’,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=58 ;



– Tabellenstruktur für Tabelle characters

CREATE TABLE IF NOT EXISTS characters (
channelnum varchar(255) NOT NULL,
charname text NOT NULL,
level int(10) NOT NULL default ‘1’,
class int(10) NOT NULL default ‘0’,
sex int(10) NOT NULL default ‘0’,
hairstyle int(10) NOT NULL default ‘0’,
haircolor int(10) NOT NULL default ‘0’,
eyestyle int(10) NOT NULL default ‘0’,
stat_str int(10) NOT NULL default ‘15’,
stat_sta int(10) NOT NULL default ‘15’,
stat_dex int(10) NOT NULL default ‘15’,
stat_int int(10) NOT NULL default ‘15’,
charslot int(10) NOT NULL default ‘0’,
id int(10) NOT NULL auto_increment,
posX int(10) NOT NULL default ‘6973’,
posY int(10) NOT NULL default ‘10’,
posZ int(10) NOT NULL default ‘3328’,
guild_id int(10) NOT NULL default ‘0’,
posWorldID int(10) NOT NULL default ‘1’,
accountname text NOT NULL,
penya int(9) NOT NULL default ‘1000000000’,
exp float NOT NULL,
curhp int(10) NOT NULL default ‘10000’,
curmp int(10) NOT NULL default ‘10000’,
curfp int(10) NOT NULL default ‘10000’,
karma_point int(10) NOT NULL default ‘0’,
duel_point int(10) NOT NULL default ‘0’,
killing_point int(10) NOT NULL default ‘0’,
skills text NOT NULL,
skill_levels text NOT NULL,
fslot1_opcodes text NOT NULL,
fslot1_ids text NOT NULL,
fslot1_text text NOT NULL,
fslot2_opcodes text NOT NULL,
fslot2_ids text NOT NULL,
fslot2_text text NOT NULL,
fslot3_opcodes text NOT NULL,
fslot3_ids text NOT NULL,
fslot3_text text NOT NULL,
fslot4_opcodes text NOT NULL,
fslot4_ids text NOT NULL,
fslot4_text text NOT NULL,
hotslot_opcodes text NOT NULL,
hotslot_ids text NOT NULL,
hotslot_text text NOT NULL,
flying_level int(10) NOT NULL default ‘0’,
flying_exp float NOT NULL default ‘0’,
skillpoints int(3) NOT NULL default ‘0’,
statpoints int(3) NOT NULL default ‘0’,
messenger_state int(1) NOT NULL default ‘0’,
posAngle int(10) NOT NULL default ‘1’,
sizeMod int(10) NOT NULL default ‘1’,
party_id int(10) NOT NULL default ‘0’,
buffpet_itemnum int(10) NOT NULL default ‘0’,
disposition int(10) NOT NULL default ‘0’,
actionslot_opcodes text NOT NULL,
actionslot_ids text NOT NULL,
actionslot_text text NOT NULL,
partyDefaultName text NOT NULL,
canJoinGuildAt int(10) NOT NULL default ‘0’,
actionslot_cooldown int(10) NOT NULL default ‘0’,
allowViewEquipment int(10) NOT NULL default ‘0’,
allowPVPDuelRequests int(10) NOT NULL default ‘0’,
fslot5_opcodes text NOT NULL,
fslot5_ids text NOT NULL,
fslot5_text text NOT NULL,
fslot6_opcodes text NOT NULL,
fslot6_ids text NOT NULL,
fslot6_text text NOT NULL,
fslot7_opcodes text NOT NULL,
fslot7_ids text NOT NULL,
fslot7_text text NOT NULL,
fslot8_opcodes text NOT NULL,
fslot8_ids text NOT NULL,
fslot8_text text NOT NULL,
bag1_last_until int(10) NOT NULL default ‘0’,
bag2_last_until int(10) NOT NULL default ‘0’,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=180 ;
[/code]

Und hier mal das Beispiel bei einem bugfreien User.

--
-- Daten für Tabelle `characters`
--

INSERT INTO `characters` (`channelnum`, `charname`, `level`, `class`, `sex`, `hairstyle`, `haircolor`, `eyestyle`, `stat_str`, `stat_sta`, `stat_dex`, `stat_int`, `charslot`, `id`, `posX`, `posY`, `posZ`, `guild_id`, `posWorldID`, `accountname`, `penya`, `exp`, `curhp`, `curmp`, `curfp`, `karma_point`, `duel_point`, `killing_point`, `skills`, `skill_levels`, `fslot1_opcodes`, `fslot1_ids`, `fslot1_text`, `fslot2_opcodes`, `fslot2_ids`, `fslot2_text`, `fslot3_opcodes`, `fslot3_ids`, `fslot3_text`, `fslot4_opcodes`, `fslot4_ids`, `fslot4_text`, `hotslot_opcodes`, `hotslot_ids`, `hotslot_text`, `flying_level`, `flying_exp`, `skillpoints`, `statpoints`, `messenger_state`, `posAngle`, `sizeMod`, `party_id`, `buffpet_itemnum`, `disposition`, `actionslot_opcodes`, `actionslot_ids`, `actionslot_text`, `partyDefaultName`, `canJoinGuildAt`, `actionslot_cooldown`, `allowViewEquipment`, `allowPVPDuelRequests`, `fslot5_opcodes`, `fslot5_ids`, `fslot5_text`, `fslot6_opcodes`, `fslot6_ids`, `fslot6_text`, `fslot7_opcodes`, `fslot7_ids`, `fslot7_text`, `fslot8_opcodes`, `fslot8_ids`, `fslot8_text`, `bag1_last_until`, `bag2_last_until`) VALUES
('-1', '<GM>KevinsComputer', 120, 31, 0, 4, -10192011, 4, 15, 239, 21, 239, 0, 83, 1205, 85, 735, 0, 201, 'kevinscomputer', 999999992, 2, 33127, 6564, 1036, 0, 0, 0, '1,2,3,64,65,69,70,107,118,119,120,121,30,31,32,33,34,35,36,37,0,0,0,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,0,313,241', '10,10,10,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,5,5', '6,6,6,6,6,6,6,6,6', '25,31,37,28,34,38,40,39,41', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '9,8,8,8,8,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ.evann 20 UHR SERVER DOWNÿ.evann DOWN WEGEN HAMACHI FREIÿ.evann DOWNTIME UNBEKANNTÿ.evann  Server Neustart in 1 Minute bitte ausloggenÿ ÿ ÿ ÿ ', '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '6,6,6,6,6,6,6,8,8,8,0,0,0,0,0,0,0,0', '24,30,36,27,33,43,44,0,0,0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ.serverstatsÿ/createitem ÿ.evann  NEUEN CLIENT NUTZEN BITTE DANKESCHOENÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', 1, 0, 34, 0, 0, 325, 1, 0, -1, 0, '6,6,6,6,6', '37,37,37,37,37', '', '', 0, 0, 0, 0, '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', '0,0,0,0,0,0,0,0,0', '0,0,0,0,0,0,0,0,0', ' ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', 1225244950, 1225244956);

Und hier ein verbuggter

[code]–
– Daten für Tabelle characters

INSERT INTO characters (channelnum, charname, level, class, sex, hairstyle, haircolor, eyestyle, stat_str, stat_sta, stat_dex, stat_int, charslot, id, posX, posY, posZ, guild_id, posWorldID, accountname, penya, exp, curhp, curmp, curfp, karma_point, duel_point, killing_point, skills, skill_levels, fslot1_opcodes, fslot1_ids, fslot1_text, fslot2_opcodes, fslot2_ids, fslot2_text, fslot3_opcodes, fslot3_ids, fslot3_text, fslot4_opcodes, fslot4_ids, fslot4_text, hotslot_opcodes, hotslot_ids, hotslot_text, flying_level, flying_exp, skillpoints, statpoints, messenger_state, posAngle, sizeMod, party_id, buffpet_itemnum, disposition, actionslot_opcodes, actionslot_ids, actionslot_text, partyDefaultName, canJoinGuildAt, actionslot_cooldown, allowViewEquipment, allowPVPDuelRequests, fslot5_opcodes, fslot5_ids, fslot5_text, fslot6_opcodes, fslot6_ids, fslot6_text, fslot7_opcodes, fslot7_ids, fslot7_text, fslot8_opcodes, fslot8_ids, fslot8_text, bag1_last_until, bag2_last_until) VALUES
(’-1’, ‘Dextery’, 106, 8, 0, 4, -10192011, 4, 134, 15, 106, 15, 0, 152, 6940, 100, 3230, 1, 1, ‘pursuer’, 1140541971, 0, 8822, 272, 521, 0, 0, 0, ‘0,0,0,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,0,0,0,0,207,208,209,210,211,212,213,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0’, ‘0,0,0,20,0,8,0,6,0,3,0,20,0,0,0,10,0,4,4,0,0,0,0,10,10,0,4,0,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’, ‘3,5,6,6,6,6,6,6,5’, ‘27,3,28,9,23,24,11,3,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', 1, 0, 229, 0, 0, 318, 1, 0, -1, 0, ‘0,0,0,0,0’, ‘0,0,0,0,0’, ‘’, ‘AdvanceParty’, 0, 0, 0, 0, ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', ‘0,0,0,0,0,0,0,0,0’, ‘0,0,0,0,0,0,0,0,0’, ’ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ', 0, 0);
[/code]

Moin,

na ja die Abfrage von einem Nutzer gestaltet sich recht einfach. (simpel und muss definitiv noch optimiert werden, Stichwort MySQL-Injections & Co)

$sql = mysql_query("SELECT accountname FROM characters WHERE accountname = '$_POST[name]'"); 

Das Ändern von Datensätzen geht auch relativ simpel über den UPDATE … SET-Befehl.

$sql = mysql_query("UPDATE characters SET {spalte1} = {wert1}, {spalte2} = {wert2}, {spalte3} = {wert3} WHERE accountname = '$_POST[name]'");

$_POST[name] kann man ggf. auch automatisch setzen, je nachdem, wie dein System beschaffen ist.

Mit einer IF-Abfrage, wie du sie dir wünscht:

if(mysql_query("SELECT {spalte1}, {spalte2}, {spalte3} FROM characters WHERE accountname = '$_POST[name]' AND ({spalte1} = 0 XOR {spalte2} = 0 XOR {spalte3} = 0)"))
{ $sql = mysql_query("UPDATE characters SET {spalte1} = {wert1}, {spalte2} = {wert2}, {spalte3} = {wert3} WHERE accountname = '$_POST[name]'"); 
} else { echo "Alles in Lot"; }

Der Code ist ungetestet.

Kurze Erläuterung zu den Befehlen:
WHERE = wo, welcher -> Datensätze einschränken. Wenn du willst, kannst du daran auch noch LIMIT 0,1 anhängen, damit du wirklich nur einen Datensatz erhälst. LIMIT schränkt den Datenbestand bei der Abfrage ebenfalls weiter ein.

UPDATE … SET -> Datensatz aktualisieren. Hinter SET werden die einzelnen Felder, die geändert werden sollen, angegeben und der Wert, den sie erhalten sollen. Die … stehen für den Tabellennamen.

Die if-Abfrage sieht erst einmal befremdlich aus, nutzt aber den Rückgabewert von mysql_query, der entweder false ist - falls kein Eintrag gefunden wurde - oder aber true, falls einer vorliegt.

Die ( … ) sorgen nur für eine Gruppierung.
XOR ist ein exklusives ODER und meint im Prinzip entweder spalte1 = 0 oder spalte2 = 0 oder spalte3 = 0 (oder auf gut deutsch: falls eine Spalte auf 0 steht, wird der Ganze ausdruck true, ansonsten bleibt er false) - Du kannst hier eventuell auch mit AND oder dem normalen OR experimentieren, da ich nicht genau weiss, wie das ablaufen soll :wink: - schlichtweg testen und rumprobieren, bis es klappt.

Damit sollten die Befehle soweit geklärt sein.

MfG
myPages

Ok vielen Dank erstmal.

  1. Problem wie übergebe ich die Daten von dem HTML Forumlar an das PHP Script. (Erledigt siehe hier hab ich mal unter Mühe selbst gecodet nightboys.ath.cx/nightboys/Calcu … chnung.php)
  2. Problem Wie baue ich eine Verbindung zum MySQL Server auf.
  3. Was meinst du die Abfrage der Accounts ist einfach ?

Was soll man denn da Injecten ?
Auf dem Ding läuft phpmyadmin nur local und ist von aussen nicht erreichbar.
Der MySQL Server ebenfalls nicht.

Und noch eine kleine Frage zu IF.
Kann ich auch mehrere Fälle durchfragen also z.B.
(syntax lass ich mal ausser acht)

ob eine bestimmte class vorhanden ist und ein bestimmtes lvl

also z.B. if = class 3 and if = lvl 15 then $sql = update
if = class 4 and if = lvl 15 then $sql = update
if = class 3 and if =lvl 14 echo du kannst noch keinen jobchange machen
if = class 4 and if =lvl 14 echo du kannst noch keinen jobchange machen

Also müsste ich den Wert abfragen und festlegen bei welchem Wert er das ganze ausführen oder ?

Man könnte ja den Wert von der MySQL Abfragen und in einer Variable speichern.
(Ich weiß wie Variabeln funken nutze ich bei meinem Calc auch.)

Moin,

eine Verbindung zu einem MySQL-Server baut man mit mysql_connect() und mysql_select_db() auf. Alles weitere zu den Funktionen findet sich in PHP Referenz (ein Lesezeichen für die Seite ist ratsam :smiley:)

Na ja durch WHERE kann man sich den betreffenden Datensatz sehr einfach raussuchen lassen :wink: Mehr war damit nicht gemeint.

Wenn du Daten ungeprüft an die Datenbank übergibst (sei es durch eine Suche oder bei einer anderen Abfrage), kann man - z.B. ich, wenn dir was Böses wollte - die Abfrage manipulieren. Da das Ganze sehr komplex ist, gehe ich hier nicht weiter darauf ein, und verweise auf einen Eintrag von Wikipedia, wo du mehr zum Thema SQL-Injections findest. Daten bitte NIEMALS ungeprüft weitergeben!

Ja, du kannst if beliebig erweitern u.U. macht dann aber auch schon die PHP-Funktion switch() Sinn.

Wenn du erst am Anfang mit PHP stehst, kann ich nur dieses Tutorial ans Herz legen, da wird auf das Wichtigste eingegangen und Schritt für Schritt PHP Anwendungen aufgebaut.

MfG
myPages

Vielen Dank erstmal für die Links.
Schattenbaum ist eigentlich auch zu empfehlen (wieso fällt mir das erst jetzt wieder ein grml…). Stehe ziemlich am Anfang. Bzw ich kann etwas PHP nur PHP mit MySQL ist eben mein Problem.

So hab aber noch ein Problem der JobChange.
Dazu brauch ich diesmal folgende Spalten.
Der erste und der zweite funktionieren.
nur master und hero müssen noch gemacht werden.
Accountname, Class, und level.
Ihrgendwie via If muss das gelöst werden.
Auch hier soll wieder nur der Accountname eingegeben werden und dann sollen alle charactere gewechselt werden.
Im Hintergrund müsste z.B. folgendes abgefragt werden
(syntax usw. lass ich mal ausser acht jetzt nur um mal ein beispiel zu zeigen)

Master (0 auf 15 1job change lvl 60 2 jobchange lvl 120 master)
if = class 11 and level 120 then sql update set class 21, lvl 60
if = class 11 and level unter 120 then echo du musst lvl 120 sein um master zu werden
(die abfrage müsste natürlich mit allen classen gemacht werden classe 11 war nur ein beispiel genauso wie unten das ist auch nur eine klasse die es gibt)

Hero (0 auf 15 1job change lvl 60 2 jobchange lvl 120 fällt auf lvl 60 master zurück lvl 120 hero)

if = class 21 and level 120 then sql update set class 31
if = class 21 and level under 120 then echo du kannst erst mit lvl 120 hero werden.

vielleicht kann man das auch einfacher lösen.
der user darf nur selbst keine jobklasse angeben weil er sonst betrügen könnte.

Moin,

es wäre allgemein leichter dein Problem nachzuvollziehen, wenn du dir angewöhnen würdest, vollständige, grammatikalisch korrekte Sätze zu bilden :wink: (Satzzeichen sollen manchmal auch helfen)

Wenn ich das richtig sehe, möchtest du den Wert von master und hero abfragen und class und level ändern, wenn der Name übereinstimmt. (korrekt?)

master und hero finde ich jedenfalls nicht bei dir in den Tabellendefinitionen, die du gepostet hast. Das kann zwei Gründe haben: Entweder habe ich einen Knick in der Optik oder aber die Dinger kommen von woanders :wink:

Ehrlich gesagt verspüre ich auch wenig Ambitionen dir alles vorzukauen :wink: (nichts für ungut, aber selber auf eine Lösung kommen, macht mehr Spaß :slight_smile: ). Aber um jetzt Integer-Werte (auf Deutsch: Zahlen) zu vergleichen, zu berechnen usw. gibt es arithmetische Operatoren. (Operatoren sind Zeichen, wie man sie u.A. aus der Mathematik kennt)

PHP stellt folgende Operatoren zur Verfügung (was die einzelnen machen, kannst du selbst nachlesen bzw. ausprobieren, falls dir welche unbekannt sind)

if($a > $b) { }
if($a < $b) { }
echo $a/$b;
echo $a*$b;
echo $a^$b;
echo $a%$b;
echo $a+$b;
echo $a-$b;

Gibt noch ein paar weitere Operatoren, aber auf die gehe ich erstmal nicht ein.

MfG
myPages

Das ganze wird bei mir in Class gespeichert.
Das ist eine Zahl.
Je nach der Zahl hat man eine bestimmte Klasse.
Mit Mathe operationen hab ich ja schon gearbeitet bei meinem Calc.
Und wegem dem vorkauen sorry.

MERCENARY 1 ACROBAT 2 ASSIST 3 MAGICIAN 4 KNIGHT 6 BLADE 7 JESTER 8 RANGER 9 RINGMASTER 10 BILLPOSTER 11 PSYCHIKEEPER 12 ELEMENTOR 13 KNIGHT_MASTER 16 BLADE_MASTER 17 JESTER_MASTER 18 RANGER_MASTER 19 RINGMASTER_MASTER 20 BILLPOSTER_MASTER 21 PSYCHIKEEPER_MASTER 22 ELEMENTOR_MASTER 23 KNIGHT_HERO 24 BLADE_HERO 25 JESTER_HERO 26 RANGER_HERO 27 RINGMASTER_HERO 28 BILLPOSTER_HERO 29 PSYCHIKEEPER_HERO 30 ELEMENTOR_HERO 31

Ich hab mich jetzt mal auf meinen {GM} Arsch gehockt und bin mal soweit gekommen.
Allerdings hab ich gerade nen massiven Hänger.
Wie frage ich jetzt den aktuellen LvL ab ?

[code]<?php
// Frage Verbindungsdaten für MySQL ab und baue Verbindung auf und wähle Datenbank aus
require(‘config2.php’);

// Frage Charactername von Formular ab und setze Variable
$charname = $_POST[‘Charname’];

// Wähle Eintrag aus frage LvL ab und wenn der richtige LvL vorhanden ist führe abfrage aus wenn LvL falsch gebe echo aus
$abfrage = “SELECT chracters FROM WHERE charname $charname”;
??? Wie frage ich jetzt die Spalte lvl ab.
$lvl = mysql_query($abfrage);
?>
[/code]

so in etwa.

//Abfrage erstellen
$abfrage = "SELECT * FROM `tabelle` WHERE `charname`='".$charname."'";

// `tabelle` mit dem namen der character tabelle austauschen, wahrschienlich `characters` oder?


//abfrage abschicken
$query = mysql_query($abfrage);

//Datensatz auslesen.
$ds = mysql_fetch_assoc($query);

//spalte aus dem aktuellen datensatz lesen.
$lvl = $ds['lvl'];

Ich hab bei der Abfrage jetzt nicht auf injections geachtet. ich bin einfach mal davon ausgegangen, dass dafür vorher gesorgt wird.

mfg Balmung

Also folgendes erstellt mir eine Variable mit dem Namen lvl ?
Dann Code ich mal gemütlich weiter und melde mich wenn ich wieder hänge :slight_smile:

$abfrage = "SELECT * FROM `tabelle` WHERE `charname`='".$charname."'"; $query = mysql_query($abfrage); $ds = mysql_fetch_assoc($query); $lvl = $ds['lvl'];

Ok nach etwas weiter lesen und abfrage zusammenfummeln (bzw. phpmyadmin zusammenfummeln lassen ist das dabei rausgekommen)

Und falls es dann nur an der config2.php liegt hier mal diese Datei.

[code]<?php
if(stristr($SERVER[‘PHP_SELF’], “config.php”)) die(‘asdada’);
$host = “localhost”; // host mysql
$user = “root”; // mysql username
$pass = "denkste_bekommste_mein_pw
^^"; // mysql password
$db = “flyff”; // mysql db

mysql_connect($host,$user,$pass) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
?>
[/code]

[code]<?php
// Frage Verbindungsdaten für MySQL ab und baue Verbindung auf und wähle Datenbank aus
require(‘config2.php’);

// Frage Charactername von Formular ab und setze Variable
$charname = $_POST[‘Charname’];

// Wähle Eintrag aus frage LvL ab und wenn der richtige LvL vorhanden ist führe abfrage aus wenn LvL falsch gebe echo aus
$abfrage = “SELECT * FROM tabelle WHERE charname=’”.$charname."’";
$query = mysql_query($abfrage);
$ds = mysql_fetch_assoc($query);
$lvl = $ds[‘lvl’];

if($lvl == “15”)
{
UPDATE flyff.characters SET class = ‘4’,
stat_str = ‘15’,
stat_sta = ‘15’,
stat_dex = ‘15’,
stat_int = ‘15’,
skills = ‘1,2,3,64,65,69,70,107,118,119,120,121,30,31,32,33,34,35,36,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’,
skill_levels = ‘10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’,
skillpoints = ‘28’,
statpoints = ‘28’ WHERE characters.charname =$charname LIMIT 1 ;
}
else
{
echo “Du bist entweder keine LvL 15 oder du hast schon einen Jobchange gemacht.”;
}
?>[/code]