Array Problem, brauche hilfe :(

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array Problem, brauche hilfe :(

    Guten Tag.

    Ich habe hier ein Einkaufs script für meinen Server.

    Er ging bis vor kurzem einwandfrei, aber dann kam ein Plesk Update, und seit dem gehts nicht mehr

    Folgender fehler wird angezeigt:

    Warning: Invalid argument supplied for foreach() in C:\Inetpub\vhosts\domain-test.tk\httpdocs\Shop\purchase.php on line 18

    Warning: Invalid argument supplied for foreach() in C:\Inetpub\vhosts\domain-test.tk\httpdocs\Shop\purchase.php on line 80
    Also beide fehler verweisen auf: [foreach($purchase AS $key => $value);]

    Hier ein test zugang zum shop:
    http://domain-test.tk/Shop/mall_login.php

    User: demo
    Passwort: demo



    Ich habe hier mal das gesamte Porblem script gelistet:
    Es ist eine .php datei von mehreren, aber nur diese hat anscheinend das problem.

    Ich weiss, das ein array fehlt, oder benötigt wird, jedoch weiss ich nicht genau was, denn ich bin eher neu in der .php brange
    PHP-Code:
    <?php

    //SID Check ausfuehren => Datenbankverbindung wird aufgebaut und Sprachauswahl gesetzt  
    include "sid_check.php";

    //UserUID aus Sessions Tabelle holen  
    $query_UID "SELECT UserUID FROM MallSessions WHERE sid = '$cook_sid_escaped'";
    $result_UID mssql_query($query_UID);
    $array_UID mssql_fetch_array($result_UID);
    $user_UID $array_UID['UserUID'];

    //String mit den Einkaeufen wieder zum Array aufblaehen
    $purchase unserialize($_POST['purchase']);


    //Durchs Array turnen und aufloesen wo das Item ein Paket ist, das Ganze schoen aufgedroeselt in ein dreidimensionales Array eintueten
    $array_row 0;
    foreach(
    $purchase AS $key => $value);
      {
      
    $key ms_escape_string($key);
      
    $value ms_escape_string($value);
      
    $query_mall "SELECT * FROM GameMall WHERE ItemID = '$key'";
      
    $result_mall mssql_query($query_mall);
      while(
    $array_mall mssql_fetch_assoc($result_mall))
        {
        
    $is_pack $array_mall['PackID'];
        if (!
    is_null($is_pack))
          {
          
    $query_pack "SELECT * FROM ItemPacks WHERE PackID = '$is_pack'";
          
    $result_pack mssql_query($query_pack);
          while(
    $array_pack mssql_fetch_assoc($result_pack))
            {
            
    $amount $value $array_mall['ItemCount'] * $array_pack['ItemCount'];
            
    $buy_array[$array_row] = array(array('ItemID' => $array_pack['ItemID'], 'ItemCount' => $amount));
            
    $array_row++;
            }
          }
        else
          {
          
    $amount $value $array_mall['ItemCount'];
          
    $buy_array[$array_row] = array(array('ItemID' => $array_mall['ItemID'], 'ItemCount' => $amount));
          
    $array_row++;
          }
        }
      }

    //Schonmal pruefen ob in der GiftBox des Accs ueberhaupt genug freie Slots fuer den Einkauf vorhanden sind
    //Wenn nicht => Ausfuehrung beenden
    $query_free_slots "SELECT COUNT(Slot) AS slots FROM PS_GameData.dbo.UserStoredPointItems WHERE UserUID = '$user_UID'";
    $result_free_slots mssql_query($query_free_slots);
    $array_free_slots mssql_fetch_assoc($result_free_slots);
    $number_free_slots 240 $array_free_slots['slots'];
    $size count($buy_array);
    $slots_available $number_free_slots $size;

    if (
    $slots_available 0)
      {
      if (
    $lang_sel == 'en')
        {
        die(
    "Not enough free slots in Gift Box available. <br><br><a href=\"mall.php\">Showroom</a>");
        }
      else
        {
        die(
    "Nicht gen&uuml;gend freie Slots in der Gift Box verf&uuml;gbar. <br><br><a href=\"mall.php\">Verkaufsraum</a>");    
        }
      }

    if (
    $lang_sel == 'en')
      {  
      echo 
    "<h2>Shaiyaner WebMall - Purchase</h2><br><br>";
      }
    else
      {
      echo 
    "<h2>Shaiyaner WebMall - Einkauf</h2><br><br>";  
      }
      
    //Nochmal durchs 2D Array aus dem POST tanzen fuer die Einkaufshistorie mit den Preisen
    //Geht leider nicht beim Einfuegen in die GiftBox weil die Items aus den Pakten keinen eigenen Preis haben :/
    $complete_cost =0;
    foreach(
    $purchase AS $key => $value);
      {
      
    $key ms_escape_string($key);
      
    $value ms_escape_string($value);
      
    $query_mall "SELECT * FROM GameMall WHERE ItemID = '$key'";
      
    $result_mall mssql_query($query_mall);
      
    $array_mall mssql_fetch_assoc($result_mall);
      
    $withdraw = ($value $array_mall['PriceNow']);
      
    $query_point "SELECT Point, UserID FROM PS_UserData.dbo.Users_Master WHERE UserUID = '$user_UID'";
      
    $result_point mssql_query($query_point);
      
    $array_point mssql_fetch_assoc($result_point);
      
    $new_balance $array_point['Point'] - $withdraw;
      
    $buy_date date('d.m.Y H:i:s');
      
    //Nochmal testen ob nicht irgendein Schlauberger nach dem Zusammenstellen des Einkaufs aber vor dem Klicken auf "Kaufen"
      //im Warenkorb noch per Ingame Mall seine DP unter den Einkaufswert gedrueckt hat
      
    if ($new_balance 0)
        {
        if (
    $lang_sel == 'en')
          {
          die(
    "Not enough SP available <br><br><a href=\"mall.php\">Showroom</a>");
          }
        else
          {
          die(
    "Nicht gen&uuml;gend SP verf&uuml;gbar <br><br><a href=\"mall.php\">Verkaufsraum</a>");
          }
        }
      
    //Wenn SP noch ausreichend fuer Einkauf, Preis von den DP abziehen und Einkaufshistorie schreiben
      
    else
        {
        
    $update_points "UPDATE PS_UserData.dbo.Users_Master SET Point = '$new_balance' WHERE UserUID = '$user_UID'";
        
    mssql_query($update_points) or die("Withdrawing DP failed");
        
    $insert_history "INSERT INTO PurchaseHistory (UserUID, ItemID, Price, pdate) VALUES ('$user_UID', '$key', '$withdraw', '$buy_date')";
        
    mssql_query($insert_history) or die("Updating Purchase History failed"); 
        }
      if (
    $lang_sel == 'en')
        {
        echo 
    "Purchase of ".$value." ".$array_mall['ItemTitle']." for ".$withdraw." SP completed.<br>";
        }
      else
        {
        echo 
    "Kauf von ".$value." ".$array_mall['ItemTitle']." f&uuml;r ".$withdraw." SP abgeschlossen.<br>";
        }
      
    $complete_cost $complete_cost $withdraw;
      }

    //Nu aber wirklich einkaufen: Durch 3D Array hampeln, freien GiftBox Slot suchen und Item eintueten
    $userslot 0;
    for (
    $iterate 0$iterate $size$iterate++)
      {
      while(
    $userslot 240)
        {
        
    $query_slots "SELECT ItemID FROM PS_GameData.dbo.UserStoredPointItems WHERE UserUID = '$user_UID' AND Slot = '$userslot'";
        
    $result_slots mssql_query($query_slots);
        
    $array_slots mssql_fetch_assoc($result_slots);
        
    $is_slot $array_slots['ItemID'];
        if (empty(
    $is_slot))
          {
          
    $item_count $buy_array[$iterate][0]["ItemCount"];
          
    $item_id $buy_array[$iterate][0]["ItemID"];
          
    $buy_date date('Y-m-d H:i:s');
          
    //Opportunistisch einen Millisekundenwert faken und an den Timestamp kleben. Wer weiss schon wofuer es gebraucht wird ...
          
    $buy_date .= ".".rand(100,999);
          
    $insert_Item "INSERT INTO 
                            PS_GameData.dbo.UserStoredPointItems (
                            UserUID, 
                            Slot, 
                            ItemID, 
                            ItemCount, 
                            BuyDate)
                           VALUES (
                            '
    $user_UID', 
                            '
    $userslot',
                            '
    $item_id',
                            '
    $item_count',
                            '
    $buy_date')";
          
    mssql_query($insert_Item) or die("Inserting Items failed");
          break 
    1;
          }
        
    $userslot++;
        }
      }  

    //Gesamtpreis und neuen SP Kontostand anzeigen, freundlich bedanken und zu weiterem Einkauf animieren
    if ($lang_sel == 'en')
      {
      echo 
    "<br>Withdrew $complete_cost DP from your account ".$array_point['UserID'].". <br>Your new SP balance is $new_balance.<br><br>";
      echo 
    "<h2>Thank you for your purchase.</h2>";
      echo 
    "<br><br><input type=\"button\" onclick=\"window.location.href = 'mall.php'\" value=\"Continue Shopping\">";
      }
    else
      {
      echo 
    "<br>Es wurden insgesamt $complete_cost SP von Deinem Account ".$array_point['UserID']." abgezogen. <br>Dein neuer SP Kontostand ist $new_balance.<br><br>";
      echo 
    "<h2>Danke f&uuml;r Deinen Einkauf.</h2>";
      echo 
    "<br><br><input type=\"button\" onclick=\"window.location.href = 'mall.php'\" value=\"Weiter einkaufen\">";
      }
    mssql_close($conn);
    ?>
    So, das ist das Script (File), ich hoffe mir kann da jemand helfen.

    Liebe Grüße euch allen
    Zuletzt geändert von kalle801; 24.02.2011, 15:15.

  • #2
    unserialize() ist ganz ganz böse.

    NIEMALS unserialize() auf einen Wert anwenden, der von einem Browser kommt. NIEMALS! Dadurch wurden schon haufenweise Seiten und Server gehackt.

    Kommentar


    • #3
      Hmm, Vielen dank dafür, gibt es eine alternative die ich einbauen könnte?

      Wie gesagt, ich bin ein php anfänger, darum frage ich ja in einem Profi forum

      Kommentar


      • #4
        Dann lern bitte erstmal die Grundlagen und fang mit einfachen Sachen an.

        Willst du ein bestehendes Script repariert/erweitert haben willst, bist du hier falsch.

        Kommentar


        • #5
          Hallo,

          an irgendeiner Stelle (außerhalb des geposteten Codes) serialisierst du ja das Purchase und schickst es an den Client (denn ich kann mir nicht vorstellen, dass der Benutzer irgendwo selbst eine serialisierte Datenrepräsentation einhämmern muss). Dann gehst du davon aus, dass dieser diese Daten unmanipuliert wieder an den Server schickt, damit du sie wiederherstellen kannst. Meines Erachtens klingt das ganz klar nach einer Aufgabe, für die Sessions explizit erfunden wurden.

          Gruß,

          Amica
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Ich dachte nur, das jemand vieleicht weiss wo das problem ist.


            Es muss mir keiner nen neues Script erstellen. ^^

            Kommentar


            • #7
              Vermutlich hat der Provider unserialize aus Sicherheitsgründen deaktiviert. Deine Demoseite hab ich ausprobiert, aber da du keinen Vergleich zwischen erwartetem und tatsächlichem Ergebnis aufgestellt hast, kann ich nur sagen, es sieht aus, als ob es bei mir funktioniert.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar

              Lädt...
              X