fuxxy1987: Problem mit PHP Code

Hallo zusammen. Könnte mir jemand sagen, was ich falsch mache wenn ich einen Tracking Code (Pay-per-Sale) einbauen will? Ich wollte es so lösen, jedoch funktionert es irgendwie nicht. Code ist ziwschen **> *


    if ($countsv > 0 && $countsvu > 0) {
        $rowsv  = mysqli_fetch_assoc($querysv);
        $rowsvu = mysqli_fetch_assoc($querysvu);
        
        $service_id     = $rowsv['id'];
        $service_type   = $rowsv['type'];
        $service_amount = $rowsv['amount'];
        $plr_id         = $rowsvu['id'];
        
        if ($service_type == 'getmoney') {
            $givemoney = mysqli_query($connect, "UPDATE `players` SET money=money+'$service_amount' WHERE `username`='$username'");
            $succquery = mysqli_query($connect, "INSERT INTO `payments` (player_id, service_id, txn_id, date, time) VALUES ('$plr_id', '$service_id', '$txn_id', '$date', '$time')");
            echo '<meta http-equiv="refresh" content="1; url=home.php" />';
        } elseif ($service_type == 'getgold') {
            $givegold  = mysqli_query($connect, "UPDATE `players` SET gold=gold+'$service_amount' WHERE `username`='$username'");
            $succquery = mysqli_query($connect, "INSERT INTO `payments` (player_id, service_id, txn_id, date, time) VALUES ('$plr_id', '$service_id', '$txn_id', '$date', '$time')");
            echo '<meta http-equiv="refresh" content="1; url=home.php" />';
        } elseif ($service_type == 'energyrefill') {
            $refillfuel = mysqli_query($connect, "UPDATE `players` SET energy='100' WHERE `username`='$username'");
            $succquery  = mysqli_query($connect, "INSERT INTO `payments` (player_id, service_id, txn_id, date, time) VALUES ('$plr_id', '$service_id', '$txn_id', '$date', '$time')");
            echo '<meta http-equiv="refresh" content="1; url=home.php" />';
        } elseif ($service_type == 'vip') {
            $setvip    = mysqli_query($connect, "UPDATE `players` SET `role`='VIP' WHERE `username`='$username'");
            $succquery = mysqli_query($connect, "INSERT INTO `payments` (player_id, service_id, txn_id, date, time) VALUES ('$plr_id', '$service_id', '$txn_id', '$date', '$time')");


			**> echo '<img width="1" height="1" src="https://track.adcocktail.com/tracking_sale.php?kid=10389&lv=0&bestid=<?php echo $username ?>&wert=<?php echo $service_amount ?>&beschreibung=VIP" />';**


            echo '<meta http-equiv="refresh" content="1; url=home.php" />';
        }
        
    }
    
}
?>
  1. Tach!

    Könnte mir jemand sagen, was ich falsch mache wenn ich einen Tracking Code (Pay-per-Sale) einbauen will? Ich wollte es so lösen, jedoch funktionert es irgendwie nicht.

    Beschreibe bitte genauer, was das Problem ist. Was konkret möchtest du erreichen und welcher Tel des Codes soll dafür was erledigen? Was möchtest du wo einbauen und was ist das es, das nicht funktioniert? Funktionieren ist ein sehr allgemeines Wort. Beschreib es bitte als konkrete Tätigkeiten. Ist es ein Problem, eine passende Vorgehensweise zu finden oder arbeitet der Code nicht wie du dir das vorgestellt hast? Wenn letzteres, wo wird welcher Wert erwartet, kommt aber nicht, oder was kommt stattdessen?

    Was ich dem Code entnehme, sind eine Menge mysqli_query()-Aufrufe, aber keine Kontrolle, ob das Statement vom DBMS abgearbeitet werden konnte. Konkret: keine Auswertung des Rückgabewertes auf Fehlerzustände.

    Und der Kontextwechsel ist auch nicht beachtet worden.

    dedlfix.

  2. Tach!

    Es gab einen Edit-Konflikt beim Versuch dem Code eine Formatierung zu spendieren. Die Markierung der betreffende Stelle und der Hinweis darauf wurden nachgereicht.

    			**> echo '<img width="1" height="1" src="https://track.adcocktail.com/tracking_sale.php?kid=10389&lv=0&bestid=<?php echo $username ?>&wert=<?php echo $service_amount ?>&beschreibung=VIP" />';**
    

    So geht Stringverknüpfung nicht. Das <?php... wird nicht als Code interpretiert, sondern als Zeichen, weil am Anfang mit ' eine Zeichenkette eröffnet wurde, die erst am Ende geschlossen wird. Du musst sie stattdessen beenden, dann den Usernamen als Variable hinzufügen und anschließend den Rest anhängen.

    echo 'a' + $b + 'c';
    

    Beachte auch den Kontextwechsel. Der Inhalt von $b muss sich hier an die URL-Regeln halten (urlencode()). Die gesamte URL ist außerdem in HTML einbegettet und muss sich an die HTML-Regeln halten (beispielsweise & muss als &amp; notiert werden).

    dedlfix.

    1. Hallo

      Du musst sie […] beenden, dann den Usernamen als Variable hinzufügen und anschließend den Rest anhängen.

      echo 'a' + $b + 'c';
      

      Korrektur:

      echo 'a' . $b . 'c';
      

      Du hattest die Syntax von JavaScript benutzt. 😀

      Tschö, Auge

      --
      Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
      Hohle Köpfe von Terry Pratchett
      1. Tach!

        Du musst sie […] beenden, dann den Usernamen als Variable hinzufügen und anschließend den Rest anhängen.

        echo 'a' + $b + 'c';
        

        Korrektur:

        echo 'a' . $b . 'c';
        

        Du hattest die Syntax von JavaScript benutzt. 😀

        Oder die von C# und vielen anderen Sprachen. Das stimmt natürlich, PHP verknüpft Strings mit Punkten. Alternativ kann man einem echo auch mehrere Werte mit Komma getrennt übergeben.

        dedlfix.

        1. Hallo

          Du hattest die Syntax von JavaScript benutzt. 😀

          Alternativ kann man einem echo auch mehrere Werte mit Komma getrennt übergeben.

          Das ist mir nach dem absenden des Postings auch durch den Kopf gegangen. Aber hier, wenn auch am Beispiel von echo gezeigt, war ja Zeichenkettenverknüpfung a.k.a. String Concatenation das Thema.

          Tschö, Auge

          --
          Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
          Hohle Köpfe von Terry Pratchett
    2. Hi,

      			**> echo '<img width="1" height="1" src="https://track.adcocktail.com/tracking_sale.php?kid=10389&lv=0&bestid=<?php echo $username ?>&wert=<?php echo $service_amount ?>&beschreibung=VIP" />';**
      

      So geht Stringverknüpfung nicht. Das <?php... wird nicht als Code interpretiert, sondern als Zeichen, weil am Anfang mit ' eine Zeichenkette eröffnet wurde, die erst am Ende geschlossen wird.

      Auch wenn der String mit " eingeschlossen wäre, hätte das <?php... doch auch nicht funktioniert - das echo ist ja bereits PHP, ein Wechsel nach PHP ist damit nicht sinnvoll, also müßte das doch als normaler Zeichensalat ausgewertet werden …

      cu,
      Andreas a/k/a MudGuard

      1. Tach!

        Auch wenn der String mit " eingeschlossen wäre, hätte das <?php... doch auch nicht funktioniert - das echo ist ja bereits PHP, ein Wechsel nach PHP ist damit nicht sinnvoll, also müßte das doch als normaler Zeichensalat ausgewertet werden …

        Zumindest wären einige Variablen aufgelöst worden, aber das Resultat gibt wohl in keinem Fall das gewünschte Ziel für img-src.

        dedlfix.

  3. 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
    1. Tach!

      *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.

      Das wird so krass nicht sein. Ein SQL-Statement ist ein String. Zahlen darin werden als Literal in Form von mehreren Ziffernzeichen geschrieben (zuzüglich Dezimalpunkt etc.). Sie müssen also auf alle Fälle geparst werden. Das wird sich nur im Zeitpunkt unterscheiden, zu dem das passiert. Als Zahlenliteral kann es gleich beim Parsen konvertiert werden, als Stringliteral muss es erst dann konvertiert werden, wenn der Kontext INT oder DECIMAL heißt. Je nach Typ ist das auch noch unterschiedlich, so dass eine Zahl in interner Darstellung nach dem Parsen vielleicht nochmal umkodiert werden muss. Es lohnt sich aber hier keinen großen Aufwand zu betreiben, das bekommt das DBMS ganz gut hin, und es wird sich nur bei sehr großen Datenmengen bemerkbar machen, wenn überhaupt. Viel wichtiger ist an dieser Stelle der menschliche Leser, dass der eine verstehbare Semantik vorfindet. Und noch wesentlicher ist, dass der Code keine technischen Fehler enthält. Anfällig für SQL-Injection ist ein solcher Fehler.

      Mein Vorschlag wäre, das so zu coden:

      Als Prinzipdarstellung, aber nicht als kopierbare Codevorlage. Da fehlt wie im OP sämtliche Kontextbehandlung. Wenn man ein Zahlenliteral schreiben möchte, muss man sicherstellen, dass es ein solches ist und nicht durch eine falsche Nutzereingabe zu Syntaxfehlern oder ungewollten Statementerweiterungen kommt. PHPs intval() erzwingt eine Integerzahl, notfalls 0. Notiert man die Zahl als Stringliteral (in Anführungszeichen) gelten dessen Regeln, die aber auch mit intval() und Kollegen eingehalten werden.

         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'";
         }
      

      Wenn der Nutzer so einen komischen Namen hat, wie hans' OR (username='allesmeins' AND betrag > 0) -- dann freut sich allesmeins.

         $succPlayer = mysqli_query($connect,
                                    "UPDATE `players` SET $update WHERE `username`='$username'");
      

      dedlfix.

      1. Hallo dedlfix,

        beim $username hast Du recht. Da muss noch eine kontextgerechte Behandlung hin - entweder prepare oder mysqli_real_escape_string().

        Die $txn_id ist hoffentlich vom Code generiert und nicht vom User gelesen.

        Die übrigen Daten kommen, wie es aussieht, aus einer anderen DB Abfrage, deswegen erwarte ich, dass sie bereits plausibilisiert und vom Schabernack der Nutzer befreit sind. Deswegen auch meine Forderung nach einer fachlich sinnvollen Typisierung von Datenbankspalten. In eine INT oder DECIMAL Column bekommst Du keine SQL Injection hinein.

        Rolf

        --
        sumpsi - posui - clusi
        1. Tach!

          die Daten kommen aus einer anderen DB Abfrage, deswegen erwarte ich, dass sie bereits plausibilisiert und vom Schabernack der Nutzer befreit sind. Deswegen auch meine Forderung nach einer fachlich sinnvollen Typisierung von Datenbankspalten. In eine INT oder DECIMAL Column bekommst Du keine SQL Injection hinein.

          Gut, das wäre zumindest bei den Zahlen ein Vertrauenskriterium, solange man sicherstellt, dass der Feldtyp der vorhergehenden Abfrage ein Zahlentyp ist. Aber muss man dann überhaupt den Wert über PHP schleifen? Da würde ich doch viel lieber bei umfangreichen Befehlsabfolgen eine Stored Procedure nehmen. Und eine Transaction drumherum, um im Fehlerfall halb durchgeführte Änderungen zu vermeiden.

          Beim Usernamen, beziehungsweise Strings im Allgemeinen, bleibt aber die Notwendigkeit der korrekten Maskierung.

          dedlfix.

        2. Die übrigen Daten kommen, wie es aussieht, aus einer anderen DB Abfrage, deswegen erwarte ich, dass sie bereits plausibilisiert und vom Schabernack der Nutzer befreit sind.

          Auch hygienische Daten können SQL-Sonderzeichen enthalten und eine Query so kaputt machen.

          Deswegen auch meine Forderung nach einer fachlich sinnvollen Typisierung von Datenbankspalten. In eine INT oder DECIMAL Column bekommst Du keine SQL Injection hinein.

          Du bekommst keinen SQL-Code aus diesen Spalten heraus. Bei Schreib-Vorgängen müssen die Werte trotzdem maskiert werden.

    2. Wichtige Dinge zuerst: Es wäre hilfreich, wenn du dedlfix Hinweise zum Kontextwechsel in deine Antwort einarbeitest.

      Zum anderen solltest du nicht so viel Code kopieren. Es ist besser, gemeinsame Komponenten nur einmal zu programmieren.

         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'";
         }
         $succPlayer = mysqli_query($connect,
                                    "UPDATE `players` SET $update WHERE `username`='$username'");
      

      Ich gebe dir Recht, was die Code-Duplikation angeht. Dein Gegenvorschlag hat aber das Problem, dass die MySQL-Fetzen in $update von Programmier-Werkzeugen nicht mehr als MySQL erkannt werden. Das führt zum Beispiel dazu, dass kein Syntax-Highlighting und -Checking für diese Fetzen stattfindet. Ich würde hier zu Gunsten des Toolings abwägen und die Code-Duplikation in Kauf nehmen.

      1. Hallo 1unitedpower,

        Es wäre hilfreich, wenn du dedlfix Hinweise zum Kontextwechsel in deine Antwort einarbeitest.

        Done.

        SQL ... Syntax-Highlighting ... Tooling

        Ok, mein PHP Tooling ist suboptimal. Sowas habe ich bisher nur unter Visual Studio mit Resharper gesehen.

        Aber wenn man nur eine Klausel injiziert, sollte das verschmerzbar sein. SQL-Selbstmontage ist etwas, was ich öfter mal mache.

        Aber man muss ja nicht.

        Rolf

        --
        sumpsi - posui - clusi
        1. Es wäre hilfreich, wenn du dedlfix Hinweise zum Kontextwechsel in deine Antwort einarbeitest.

          Done.

          Super, aber da hast du dir jetzt ins eigene Knie geschossen, du hast ausgerechnet an der Stelle vergessen zu escapen, wo du refaktorisiert hast 😝 Und beim Insert-Statement fehlt die Maskierung auch noch.

          SQL ... Syntax-Highlighting ... Tooling

          Ok, mein PHP Tooling ist suboptimal. Sowas habe ich bisher nur unter Visual Studio mit Resharper gesehen.

          Aber wenn man nur eine Klausel injiziert, sollte das verschmerzbar sein. SQL-Selbstmontage ist etwas, was ich öfter mal mache.

          Ich auch, aber dann nicht über String-Verkettung, sondern über einen Builder oder vorzugsweise eine EDSL.

          1. Hallo 1unitedpower,

            Super, aber da hast du dir jetzt ins eigene Knie geschossen,

            Wie im Posting geschrieben - ich habe nur den username escaped (einmal für SQL, einmal für URL), und ob das für die übrigen Elemente nötig ist hängt von ihrem Wertebereich ab. Das ist dann als leichte Übung dem Leser überlassen 😉

            Rolf

            --
            sumpsi - posui - clusi
            1. Super, aber da hast du dir jetzt ins eigene Knie geschossen,

              Wie im Posting geschrieben - ich habe nur den username escaped (einmal für SQL, einmal für URL), und ob das für die übrigen Elemente nötig ist hängt von ihrem Wertebereich ab.

              Ich verstehe das Argument, stelle mich aber auf einen anderen Standpunkt. Programmieren erfordert enorme Konzentration, wir müssen ein mentales Modell der Problemstellung, des Lösungswegs und der Programmiersprache im Kopf halten, die Dinge irgendwie zusammenführen und in die Tasten hauen. Da bin ich froh über jede kognitive Einsparung, die es mir erlaubt mich auf das eigentliche Problem zu konzentrieren und administrative Banalitäten auszublenden. Kontextwechsel-Probleme, wie diese hier, birgen diesbezüglich ein gewisses Einsparungspotenzial. Ich kann mir natürlich bei jedem Kontextwechsel die Frage stellen, ob ein Datum nun eine kontextgerechte Behandlung braucht, oder ob der Wert durch eine glückliche Fügung unbehandelt weiter gereicht werden darf. Das selbe Problem kann ich aber auch im Autopilot lösen, indem ich diese Fragen ignoriere und jedes Datum stumpf immer entsprechend dem Kontext behandle. Die erste Variante raubt mir unnötige Konzentration und ist auch noch fehleranfälliger, da ich auch immer den falschen Schluss ziehen kann, dass ein Datum nun nicht maskiert werden müsse. Die zweite Variante erlaubt mir in Gedanken bei meinem eigentlichen Problem zu bleiben während meine Finger die mechanische Arbeit erledigen.

              1. Tach!

                Ich kann mir natürlich bei jedem Kontextwechsel die Frage stellen, ob ein Datum nun eine kontextgerechte Behandlung braucht, oder ob der Wert durch eine glückliche Fügung unbehandelt weiter gereicht werden darf. Das selbe Problem kann ich aber auch im Autopilot lösen, indem ich diese Fragen ignoriere und jedes Datum stumpf immer entsprechend dem Kontext behandle.

                Ich seh das etwas anders in dem Punkt. Wenn man das Denken durch Prinzipien ersetzt und vor allem irgendwann soweit ist, deren Einsatz nicht mehr zu hinterfragen, dann besteht auch die Gefahr, dass man nicht mehr erkennt, wenn die Anwendung ungünstig bis fehlerhaft ist.

                $sql = sprintf("SELECT * FROM table WHERE id=%s", string_escape($id));
                

                Prinzipiell sieht das nach Kontextbehandlung aus. Ist aber die falsche für den vorliegenden Kontext, wenn die IDs Zahlen sind. Man muss also zuindest darüber nachdenken, die richtige Behandlung zu verwenden. Gut, das sagtest du mit "entsprechend dem Kontext". Aber das verlangt eben doch mehr Aufmerksamkeit als eine "stumpfe" mechanische Arbeit. Letztere kann man sich zu einem guten Teil von der IDE abnehmen lassen, um so mehr Kapazitäten für den Inhalt freizubekommen.

                dedlfix.

                1. Ich seh das etwas anders in dem Punkt. Wenn man das Denken durch Prinzipien ersetzt und vor allem irgendwann soweit ist, deren Einsatz nicht mehr zu hinterfragen, dann besteht auch die Gefahr, dass man nicht mehr erkennt, wenn die Anwendung ungünstig bis fehlerhaft ist.

                  $sql = sprintf("SELECT * FROM table WHERE id=%s", string_escape($id));
                  

                  Prinzipiell sieht das nach Kontextbehandlung aus. Ist aber die falsche für den vorliegenden Kontext, wenn die IDs Zahlen sind. Man muss also zuindest darüber nachdenken, die richtige Behandlung zu verwenden. Gut, das sagtest du mit "entsprechend dem Kontext". Aber das verlangt eben doch mehr Aufmerksamkeit als eine "stumpfe" mechanische Arbeit. Letztere kann man sich zu einem guten Teil von der IDE abnehmen lassen, um so mehr Kapazitäten für den Inhalt freizubekommen.

                  Da bin ich voll und ganz bei dir, rein mechanisch ist das zugebenermaßen nicht. Dennoch ist es eine spürbare Entlasung nur die Frage zu stellen "Was ist der Zielkontext?" als sich zusätzlich noch zu fragen "Was ist der Wertebereich von x?" und "Können in dem Wertebereich SQL-Sonderzeichen vorkommen?". Vorallem in dynamisch typisierten Sprachen, wo eine IDE nur eingeschränkte Hilfestellungen im Umgang mit solchen Fragen leisten kann, ist das m.M.n. ein großer Gewinn.

                  Manchmal kann man auch die Frage nach dem Zielkontext noch ausblenden, im Falle von MySQL bspw. durch den Einsatz von Prepared-Statements.

  4. Von verwechslungsträchtigen Variablennamen if ($countsv > 0 && $countsvu > 0) mal abgesehen: Deinem Code fehlt jegliche Fehlerbehandlung! Einem Vergleich if ($service_type == 'getmoney') sollte eine Prüfung vorausgehen, ob diese Variable überhaupt definiert ist. Deine DB Abfrage kann nämlich auch schiefgehen!

    MFG

    1. Tach!

      Einem Vergleich if ($service_type == 'getmoney') sollte eine Prüfung vorausgehen, ob diese Variable überhaupt definiert ist.

      Reicht es nicht, wenn die Initialisierung drei Zeilen weiter oben stattfand?

      dedlfix.

  5. Moin,

    neben den ganzen anderen wichtigen Punkten meiner Vorredner noch ein paar Dinge, die im Zweifelsfall helfen weitere Fehler einzudämmen:

            if ($service_type == 'getmoney') {
    

    PHP kennt auch den Vergleich mit ===, dabei wird der Typ und der Inhalt geprüft. Beim Vergleich mit == findet stattdessen eine Typkonvertierung vor dem Vergleich statt.

                echo '<meta http-equiv="refresh" content="1; url=home.php" />';
    

    Wenn du eh schon in PHP bist, dann sende doch einen HTTP-Redirect anstatt auf die Interpretation dieses HTML-Tags zu vertrauen.

    Viele Grüße
    Robert

    1. Tach!

              if ($service_type == 'getmoney') {
      

      PHP kennt auch den Vergleich mit ===, dabei wird der Typ und der Inhalt geprüft. Beim Vergleich mit == findet stattdessen eine Typkonvertierung vor dem Vergleich statt.

      Da vermisse ich ein gegebenenfalls nach dem stattdessen. Zudem sei die Frage gestattet, warum in diesem Ausdruck eine Typsicherheit garantiert werden müsste. Der Wert kommt aus einem String-Feld, ist also ein String und wird mit einem String vergleichen. Ich seh da keinen Bedarf für eine Prüfung, und eine automatische Konvertierung findet auch nicht statt.

      Ich bremse beim Code-Lesen immer bei strikten Typvergleichen, versuche herauszufinden, warum das an der Stelle wichtig sei. Meist sehe ich den Grund nicht, besonders wenn sich das Ergebnis nicht von dem eines ==-Vergleichs unterscheidet, danke für nichts, weiter gehts. Wenn Typsicherheit so wichtig ist, dass man das prinzipiell verwendet, hat man eigentlich die falsche Sprache verwendet.

      dedlfix.