probleme mit if

Flenkium

Grünschnabel
Hallo Comm.

Ich habe ein Problem:

Also ich habe 2 Arrays mit folgenden werten:

Code:
Array ( [0] => 1 [1] => - [2] => >Trd<  [3] => Norfi [4] => Krieger [5] => 62285060 )
und
Array ( [beruf] => Krieger [allianz] => >Trd< [ges_pkt] => 62285060 )

Das erste Array wurde per Textarea übertragen via explode in Einzelteile zerlegt.
Das 2. Array sind Werte aus einer DB und sollen mit den eingegeben Werten verglichen werden.
Ich habe vor mir ein par nette Spielereien für ein Browsergame zu programmieren. In diesen Fall eine art Rangliste. Wenn jetzt eins der Werte aus Array 2 anders ist als die aus Array 1 dann soll der Eintrag aktualisiert werden.

dazu folgender code:

Code:
for($i=0;$i<count($infoarray);$i++){
    
    ${werte_.$i} = explode('	',$infoarray[$i]);

//Hier wird geprüft, ob es den Spieler schon in der DB gibt

    if(@in_array(${werte_.$i}[3],$namen)){     

        ${result_.$i} = mysql_query("SELECT beruf,allianz,ges_pkt FROM users 
                                WHERE name = '". ${werte_.$i}[3] ."'");
        ${row_.$i} = @mysql_fetch_assoc(${result_.$i});
        

        /* Besonders diese if Funktion bereitet mir Kopfschmerzen */

        if(${row_.$i}['allianz']!=${werte_.$i}[2] || ${row_.$i}['ges_pkt'] != ${werte_.$i}[5] || 
           ${row_.$i}['beruf'] != ${werte_.$i}[4]){

                $b++;   // Die ist hier um zu zählen wie viele Spieler aktualisiert wurden

            mysql_query("UPDATE users SET allianz='". ${werte_.$i}[2] ."', 
                       beruf='". ${werte_.$i}[4] ."', ges_pkt='". ${werte_.$i}[5] ."',
                       WHERE name='". ${werte_.$i}[3] ."'");

        }
    }else{
        //Hier wird der Spieler gespeichert, wenn er noch nicth vorhanden ist.
        //habe ich jetzt mal weg gelassen
    }
}
Welche Werte die einzelnen Zahlen bei ${werte_.$i} haben seht ihr hier:
0 & 1: sind uninteressant
2: Allianztag der Allianz des Spielers
3: Nickname des Spielers
4: Spielerzweig, den der Spieler gewählt hat
5: die Gesamtpunktzahl des Spielers

Bei $infoarray handelt es sich um einen Array, in dem der sting bereits in einzelne Zeilen zerlegt wurde.
Beim array $namen handelt es sich um Spielernamen aus der Datenbank.

Mein Problem ist nun. Wie ihr oben sehen könnt sind die Werte die verglichen werden bei ALLEN gleich . Also sollte die Bedingung bei if ein FALSE ausgeben und der Spieler wird nicht geupdatet.
Nun funktioniert das eben nicht. Obwohl die Werte gleich sind, kommt man immer wieder in die if Klausel rein und das Programm updatet quasi den Spieler. Was er ja nicht soll, weil die Werte ja gleich sind. :confused:

Das ist jetzt nicht unbedingt dramatisch, aber Warum verhält PHP sich so. würde schon gerne wissen, was ich übersehe.

Ich schreibe den code auch gerne nochmal sauberer wenn ihr wollt, aber bitte gib mir jemand einen Tipp.

MfG Flenkium
 
Zuletzt bearbeitet:
Hallo .. ich verstehe deinen Code nicht so richtig ... kannst du den bitte in "[ php ]" bbcodes schreiben, damit die unterschiedlichen Farben die Sache etwas übersichtlicher machen?

wenn ich dich richtig verstehe, willst du nur prüfen, ob ein Datensatz im Script mit dem Datensatz in der DB übereinstimmt ... wenn nicht dann willst du die DB updaten?

Gruß,
Grille
 
Oh OK

Richtig. Ich will nur prüfen ob die Werte übereinstimmen. Da sie übereinstimmen sollte es eigentlich upgedatet werden.
Aber das tut es.

Code:
Array ( [0] => 1 [1] => - [2] => >Trd<  [3] => Norfi [4] => Krieger [5] => 62285060 )
und
Array ( [beruf] => Krieger [allianz] => >Trd< [ges_pkt] => 62285060 )

PHP:
for($i=0;$i<count($infoarray);$i++){
    
    ${werte_.$i} = explode('	',$infoarray[$i]);

//Hier wird geprüft, ob es den Spieler schon in der DB gibt

    if(@in_array(${werte_.$i}[3],$namen)){     

        ${result_.$i} = mysql_query("SELECT beruf,allianz,ges_pkt FROM users 
                                WHERE name = '". ${werte_.$i}[3] ."'");
        ${row_.$i} = @mysql_fetch_assoc(${result_.$i});
        

        /* Besonders diese if Funktion bereitet mir Kopfschmerzen */

        if(${row_.$i}['allianz']!=${werte_.$i}[2] || ${row_.$i}['ges_pkt'] != ${werte_.$i}[5] || 
           ${row_.$i}['beruf'] != ${werte_.$i}[4]){

                $b++;   // Die ist hier um zu zählen wie viele Spieler aktualisiert wurden

            mysql_query("UPDATE users SET allianz='". ${werte_.$i}[2] ."', 
                       beruf='". ${werte_.$i}[4] ."', ges_pkt='". ${werte_.$i}[5] ."',
                       WHERE name='". ${werte_.$i}[3] ."'");

        }
    }else{
        //Hier wird der Spieler gespeichert, wenn er noch nicth vorhanden ist.
        //habe ich jetzt mal weg gelassen
    }
}
 
Also wenn ich den Code am anfang hinschreibe kommt sehr oft das hier:
Notice: Use of undefined constant string_ - assumed 'string_' in

und das @ ist da damit keine Fehlermeldung kommt, wenn die DB mal leer sein sollte.
 
Notice: Use of undefined constant string_ - assumed 'string_' in
Jup,
PHP:
 ${werte_.$i}
da sucht er nach einer Konstante "werte_", die er nicht findet und deshalb "werte_" als String - so wie es gedacht ist - verwendet.
Ich hielt PHP grad für weniger fehlertolerant und dachte deshalb, dass der Fehler da liegt und nicht das eigentlich gemeinte vermutet wird^^. ;)
Richtig ist eigentlich:
PHP:
${'werte_' . $i}
IMO sollte man statt variablen Variablen (${'foo' . $bar}) lieber Arrays ($foo[$bar]) verwenden, was jetzt aber keine entscheidene Rolle spielt.



und das @ ist da damit keine Fehlermeldung kommt, wenn die DB mal leer sein sollte.
Besser vorher eine Bedingung setzen, die prüft, ob die DB leer ist... Sonst wird der Anweisungsblock in der Bedingung auch bei unterdrückter Fehlermeldung durchlaufen.
Obwohl die Werte gleich sind, kommt man immer wieder in die if Klausel rein und das Programm updatet quasi den Spieler.
Ich sehe keinen Fehler im Code, aber hast du schon überprüft, ob ${row_.$i} überhaupt richtig aus der DB ankommt?
Kannst auch mal versuchen zwei Werte, die gleich sein müssten, mit var_dump auszugeben....

Debuggen halt ;)
 
Jo also die Fehlermeldung ist weg. Danke schön.
Aber trotzdem geht er immer noch in die IF Funktion rein :confused:

IMO sollte man statt variablen Variablen (${'foo' . $bar}) lieber Arrays ($foo[$bar]) verwenden, was jetzt aber keine entscheidene Rolle spielt.

Ja also. Ich wollte Mehrdimensionale Array verhindern. Die mag ich nicht :-)

Besser vorher eine Bedingung setzen, die prüft, ob die DB leer ist... Sonst wird der Anweisungsblock in der Bedingung auch bei unterdrückter Fehlermeldung durchlaufen.

Is erledigt ^^

... aber hast du schon überprüft, ob ${row_.$i} überhaupt richtig aus der DB ankommt?

Also mit print_r() kommt das hier:
Code:
Array ( [beruf] => Krieger [allianz] => >Trd<  [ges_pkt] => 62285060 )

Kannst auch mal versuchen zwei Werte, die gleich sein müssten, mit var_dump auszugeben....

Ok. ... ...
Ich sehe gerade das da so einiges nicht richtig sein kann.
Ich versuche mal was.
z.B. das hier ^^
Code:
[0]=>  string(8) " 1 "

Vielen Dank für die Hilfe
 
Ja also. Ich wollte Mehrdimensionale Array verhindern. Die mag ich nicht
Der wäre doch ziemlich eindimensional :D

[0]=> string(8) " 1 "
Joa, ein String mit sieben Lücken, kann gut sein dass da was nich ganz stimmt.
Ich meinte eher noch zB ${row_.$i}['allianz'] und ${werte_.$i}[2] zu vergleichen, weil die ja gleich sein sollten; sind sies nicht, hättest du eine Erklärung für die if-Sachen, die immer ausgeführt werden.
 
Oh sind sie nicht?

Naja. ES GEHT JA JETZT ^^ ^^

Da ich das durch var_dump das
Code:
[0]=> string(8) " 1 "
gesehen habe, habe ich mir gedacht, dass da mit meinen expolde Funktionen wohl irgendwas nicht richtig sein kann.

Nun gibt var_dump richtig [0]=> string(1) " 1 " aus ^^

Danke für eure Hilfe
bis dann ^^
 
Zurück