Rolf B: Problem mit PHP Code

Beitrag lesen

Hallo fuxxy1987,

zum einen hast Du falsches HTML gebaut: <img> gehört in den <body>, <meta http-equiv> in den <head> Bereich. Wenn Du <img> vor <meta http-equiv> ausgibst, wird ein <head> Bereich automatisch beendet und der <body> gestartet. Damit landet das meta-Element im Body, wo es nicht hingehört. Meine Browser beachten es zwar trotz falscher Platzierung, aber das ist die allgemeine Fehlertoleranz von Browsern, auf die man sich nicht verlassen sollte. Einen Lösungsvorschlag dazu mache ich weiter unten in meinem Verbesserungsvorschlag zu deinem Code.

Zum anderen solltest du nicht so viel Code kopieren. Es ist besser, gemeinsame Komponenten nur einmal zu programmieren. Das kann man durch das Auslagern in eine Funktion lösen, oder dadurch, dass man den gemeinsamen Code ans Ende stellt und die unterschiedlichen Teile in Variablen vorbereitet.

Deine 4 Servicetypen unterscheiden sich eigentlich nur dadurch, dass ein anderes Feld im User gesetzt wird.

getmoney: SET money=money+'$service_amount'
getgold : SET gold=gold+'$service_amount'
energyrefill: SET energy='100'
vip: SET `role`='VIP'

Merkwürdig finde ich übrigens, dass Du $service_amount und 100 in Anführungszeichen setzt. Das sind Zahlen, und damit wird gerechnet. Anführungszeichen bewirken, dass der MYSQL Server hin und her konvertieren muss. Sind die Spalten money, gold und energy in der players-Tabelle etwa als Strings definiert? Das sollten sie nicht sein, es sollten Zahlen sein (bspw. DECIMAL(10,2) für Zahlen mit 8 Stellen vor und 2 Stellen nach dem Komma). Wenn Du keine Nachkommastellen verwendest, kann es auch einfach INT oder BIGINT sein.

Die INSERT INTO `payments` Query ist für alle gleich, und sie sollte - wie dedlfix schon sagt - nur ausgeführt werden wenn der UPDATE gelungen ist. Andernfalls hast Du eine Zahlung registriert, ohne dass die Gegenleistung erbracht wurde. Ich finde es darüber hinaus auch merkwürdig, dass der Satz in der players-Tabelle über den Username identifiziert wird und in der payments-Tabelle über die plr_id. Sollten plr_id und username nicht die gleiche Person referenzieren? Oder sind Player und User bei Dir unterschiedliche Dinge?

Mein Vorschlag wäre, das so zu coden:

   if ($service_type == 'getmoney') {
      $update = "money=money+$service_amount";
   } elseif ($service_type == 'getgold') {
      $update = "gold=gold+$service_amount";
   } elseif ($service_type == 'energyrefill') {
      $update = "energy=100";
   } elseif ($service_type == 'vip') {
      $update = "`role` = 'VIP'";
   }
   $usernameParm = mysqli_real_escape_string($username);
   $succPlayer = mysqli_query($connect,
                              "UPDATE `players` SET $update WHERE `username`='$usernameParm'");

   if ($succPlayer && mysqli_affected_rows($connect) > 0) {
      $succPayment = mysqli_query($connect, "INSERT INTO `payments` (player_id, service_id, txn_id, date, time) VALUES ('$plr_id', '$service_id', '$txn_id', '$date', '$time')");
   }

   if ($succPlayer && $succPayment) {
      echo '<meta http-equiv="refresh" content="1; url=home.php">';
      if ($service_type == 'VIP') {
         $acUrl = "https://track.adcocktail.com/tracking_sale.php?kid=10389&lv=0&bestid=".urlencode($username)."&wert=$service_amount&beschreibung=VIP";
         $acPixel = '<img width="1" height="1" src="'.$acUrl.'">';
      } else {
         $acPixel = '';
      }
   }

Ich habe nur $username mit urlencode behandelt weil ich davon ausgehe, dass $service_amount eine Zahl enthält. $txn_id habe ich ebenfalls nicht codiert; wenn da Zeichen drin sind, die in einer URL oder einer SQL Abfrage Sonderbehandlung brauchen, muss man noch 'ran.

Das HTML für das adcocktail Pixel lege ich dabei erstmal in eine Variable. Den Grund habe ich eingangs erläutert: <meta> und <img> gehören in verschiedene Bereiche des HTML Dokuments. Dein Payment-Code muss zu einer Zeit laufen, wo der <head> des Ausgabedokuments erzeugt wird, und er hinterlegt das adcocktail-Pixel in einer Variablen, die Du beispielsweise zu Beginn des <body> ausgibst. Du kannst den Payment-Code auch noch früher laufen lassen, bevor die HTML Aufbereitung beginnt, und legst das HTML für das <meta> Element und das <img> Element in Variablen. Eine Trennung des Programmcodes für Eingaben, Verarbeitung und Ausgaben ist ohnehin die bessere Lösung.

Ach ja, ein Hinweis noch: vielleicht fällt Dir auf dass ich weder das meta noch das img Element mit /> geschlossen habe. Das ist Absicht, es sind beides Elemente ohne Inhalt, die kein Ende-Tag haben. Nur wenn Du XHMTL baust, musst Du solche Elemente wegen der Grundregeln von XML mit /> abschließen.

Rolf

Edit: Hinweise auf Kontextwechsel eingearbeitet

--
sumpsi - posui - clusi