Preisstaffelung bei Onlineshop

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

  • Preisstaffelung bei Onlineshop

    Hallo Leute,

    ich stecke gerade total fest mit meinem shop.
    Und zwar habe ich folgendes Problem: Wenn der Kunde z.B. Flyer in seinen Warenkorb legt, dann sollen sich der Preis bei erhöhter Anzahl pro Stück verringern.

    Also: Autoflyer:Einzelpreis: 0.23, ab 200=> 0.19, ab 500 => 0,17

    Das Problem ist, dass ich andere Waren in dem shop haben, die eine andere Staffelung haben:

    Atlas: Einzelpreis: 6.20 ab 50 Stück =>5.90, etc.

    Die Waren die in den Warenkorb angezeigt werden werden per Schleife aus einem Formular ausgelesen.

    Hier ein Auszug des Codes:

    foreach ($waren as $index => $zusammen)
    {
    echo "<br>$index => $zusammen<br><br>";
    $res = mysql_db_query($dbase, "select * from artikel where artikel_id = '$index' order by artikel_id");
    $num = mysql_num_rows($res);


    for ($i=0; $i<$num; $i++)
    {
    $isbn = mysql_result($res, $i, "isbn");
    $titel = mysql_result($res, $i, "titel");
    $kurztext = mysql_result($res, $i, "kurztext");
    $langtext = mysql_result($res, $i, "langtext");
    $preis = mysql_result($res, $i, "preis");
    $image = mysql_result($res, $i, "image");
    $artikel_id = mysql_result($res, $i, "artikel_id");

    Klar, die Schleife wird dann nach dem Formular wieder geschlossen, dass dann eben weiter unten kommen würde, will hier aber nicht alles voll laden...

    Natürlich kann ich sagen, wenn $titel="Flyer" AND $anzahl>= 200 $preis=0.23....
    Aber da ändern sich natürlich alle Preise der anderen Artikel auch, wenn die eine Bedingung( $titel="Flyer) eintritt.

    Ich habs auch versucht die verschiedenen Staffelungen in eine extra Tabelle meiner MySQL-Datenbank zu legen, aber das hat auch nicht funktioniert.

    Wie kann ich dem Computer sagen, dass er den Preis dann nur bei der einen Ware ändert, wenn man eben nur ein Formular ausliest.

    Ich hoffe, Ihr könnt mir helfen, weil ich das irgendwie hinkriegen muss für die Arbeit.

    Viele Grüsse,

    Humu

  • #2
    Aber da ändern sich natürlich alle Preise der anderen Artikel auch, wenn die eine Bedingung( $titel="Flyer) eintritt.
    Hmmm? Dafür verwendest Du selbstverständlich die eindeutige ID, die Du für jeden einzelnen Artikel abgelegt hast. Oder von nun an ablegen wirst, denn das ist unbedingt notwendig.

    Ich habs auch versucht die verschiedenen Staffelungen in eine extra Tabelle meiner MySQL-Datenbank zu legen, aber das hat auch nicht funktioniert.
    Warum nicht?

    Ich würds in einer eigenen Text-Spalte "staffelpreis" machen, die ungefähr so aufgebaut sein kann:

    0-200:0,50;201-500;0,45;501-1000:0,40 und so weiter.

    Also Staffel 1 50 cent; Staffel 2 45 cent; Staffel 3 40 cent.

    Diese Spalte nimmst Du dann mit explode() auseinander (Erst nach Semikola, dann nach Doppelpunkten). Und schon hast Du für jede denkbare Stückzahl einen Preis, und das für jeden einzelnen Artikel.
    Zuletzt geändert von pekka; 12.01.2005, 10:48.

    Kommentar


    • #3
      Hallo!

      Habe mir deinen Code nicht genauer angeschaut, ist zu anstengend so ohne bunt... Tipps
      Habe es bei mir so gelöst, dass die Preisstaffelung in einer Tabelle sind.

      Also etwa so:

      Prod_ID | Einzelpreis | Rabattmenge_1 | Preis_1 | Rabattstufe_2 | Preis_2

      Wenn dann der Artikel im Warenkorb ist, schaue ich in der DB nach:
      Ist die Bestellmenge > Rabattstufe_2 usw.
      Geht natürlich auch mit pekkas Methode, hatte aber keine Lust auf explode

      OffTopic:
      Oder habe ich jetzt total am Thema vorbeigeredet?

      Kommentar


      • #4
        Vielen Dank für Eure Hinweise!! Auch dank an den Tip

        So hier nochmals der Code, etwas übersichtlicher.
        Ich hätte mich früher gemeldet, wollte eben erstmal weiter machen, bevor ich sofort wieder frage.

        Ich hab das genauso wie Heini schon angelegt. Eben in meiner Tabelle artikel:

        Artikel:

        artikel_id | titel | Preis | Preis1 | Preis2 | usw.

        Ich steh wahrscheinlich grad einfach aufm Schlauch, weil ich vor lauter Bäumen den Wald nicht mehr sehe.
        Ich muss also die Abfrage, ob es sich um z.B. artikel_id = 18 nach der for-Schleife reinsetzten, weil diese ja bewirkt, dass alle Waren so lange aufgelistet werden bis $i=$num ist.

        Dennoch, wenn ich sage,

        PHP-Code:
        if($artikel_id=18 AND $anzahl>=200)

        {
        $preis=mysql_result($res$i"preis1");

        dann ändert er doch die Preise dennoch, weil er ja die Bedingung einmal erfüllt hat. Ich verstehe es net. Wenn ich die Lösung sehe oder noch selbst herausfinde, dann lauf ich sicherlich rot an. Ich versteh es von der Logik, weiss aber nicht wie ich das coden soll, wie ich ihm mitteile dass er nur bei Flyer mit id=18 bei Stückzahl>=200 eben den Preis senkt.

        Ich mach da schon seit gestern um 17uhr rum und ich denk auch, das kann nicht schwer sein.

        Ich hoffe, Ihr könnt mir nochmals den richtigen Schubs in die richtige Richtung geben.
        PHP-Code:

        <?php $res mysql_db_query($dbase"select * from artikel where artikel_id = '$index' order by artikel_id");

                            
        $num mysql_num_rows($res);
                    
                    
                            for (
        $i=0$i<$num$i++)
                                {
                                
        $isbn mysql_result($res$i"isbn");
                                   
        $titel mysql_result($res$i"titel");
                                   
        $kurztext mysql_result($res$i"kurztext");
                                   
        $langtext mysql_result($res$i"langtext");
                                
        $preis mysql_result($res$i"preis");
                            
                                   
        $image mysql_result($res$i"image");
                                
        $artikel_id mysql_result($res$i"artikel_id");
                                
                            
                            
                                if (
        $image == '')
                                    
        $image "dummy.gif";
                                if (
        $isbn != '')
                                    
        $isbn "ISBN: ".$isbn;
                                }
                                
                                echo 
        "<p class=inhaltText>Artikel: $titel<br>Anzahl: $zusammen</p><hr size=1>";
                                echo 
        $preis;
            
                    
                                
        //$preis = mysql_result($res, $i, "preis1");
                                
        }*/
                                
                                
        $einzelpreis $preis $zusammen;
                                
                                
        $einzelpreis sprintf('%.2f'$einzelpreis);
                                
                                
                                    
                                
        $gesamtpreis $gesamtpreis + ($preis $zusammen);



        ?>

        gruss,

        humu

        Kommentar


        • #5
          in der Datenbank muß du die Rabattmindestmenge ablegen; wie willst du denn sonst entscheiden, mit welchem Preis du rechnen sollst.

          Außerdem IMHO liefert dir die Abfrage nur einen Datensatz, falls dein artikel_id eindeutig ist (was aber sein muß), daher ist die for-Schleife über mysql_num_rows überflüssig. Verwende mysql_fetch_array anstatt mysql_result, weil schneller ist.

          Kommentar


          • #6
            In meinem Beispiel war es so, dass auch die Mindestanzahl für den Rabatt
            in der DB ist. Dann mache ich es so:
            PHP-Code:
            if ($bestellmenge >= $rabattstufe) {
                 
            $preis $preisstufe_1;

            Naja, und das alles ein bisschen verschachteln. Meine Methode ist aber
            nicht unbedingt empfehlenswert, wenn du mehr als 3 Rabattstufen hast,
            oder jedes Produkt eine unterschiedliche Anzahl von Rabattstufen hat.
            Dann wäre doch pekkas Vorschlag einfaher, weil du da nicht so
            eingeschränkt bist.

            Kommentar


            • #7
              Jo,

              das ist eben mein Problem, mit einer Staffelung für alle Waren kein Problem, nur eben verschiede Staffelungen den verschiedenen Waren zuweisen, das blick ich nicht.

              Mit explode habe ich noch nicht wirklich was gemacht... Aber da ist doch dann das gleiche Problem, wenn ich $preis einen neuen Wert zuweise, auch wenn per explode, dann wird doch dieser Preis jeder Ware zugeordnet, auch wenn ich mit
              PHP-Code:
              if $artikel_id=18 AND $anzahl>=200 
              unterscheide.

              Sorry, dass ich etwas genervt klinge, aber das macht mich verrückt und ich muss das irgendwie hinkriegen. Leider kann ich auch nicht eine Pause machen, das muss eben heut noch klappen, damit ich mich die anderen Dinge für die Arbeit machen kann.

              Trotzdem vielen Dank bisher für Eure schnellen Antworten!

              Gruss,

              Humu

              Kommentar


              • #8
                probier mal mit zwei ==, wie hier:
                PHP-Code:
                if $artikel_id==18 AND $anzahl>=200 
                Ansonsten weist du nämlich $artikel_id den Wert zu...

                Kommentar


                • #9
                  Ich versteh nicht, wo dein Problem liegt. Du ermittelst in der Schleife doch den Einzelpreis eines Artikels und multiplizierst ihn mit der bestellten Anzahl. Dann wird diese Summe auf den Gesamtpreis aufgeschlagen.

                  Das einzige, was sich mit meinem Vorschlag ändert, ist, daß die Einzelpreisermittlung etwas komplizierter wird. Die (Text-)spalte "staffelpreis" (Oder wie auch immer Du sie nennst) liest Du aus:

                  $staffelpreis = mysql_result($res, $i, "staffelpreis");

                  Dann nimmst Du den Text mit explode() auseinander. Explode() zersägt einen beliebigen String (2. Argument) an den Sollbruchstellen (1. Argument) und fügt die Einzelteile in ein Array.

                  $array_staffelpreise = explode(";", $staffelpreis);

                  Dann gehst Du jede Staffel mit foreach() durch und machst dort nochmal zwei Explodes, um die Start- und Endzahl sowie den Preis zu kriegen:

                  PHP-Code:
                  foreach ($array_staffelpreise as $staffel)
                   {
                     
                  $temp explode(":"$staffel);   // Zersäge zB. "101-500:0,50" in "101-500" und "0,50"

                     
                  $zahlen $temp[0];    // "101-500";
                     
                  $preis    $temp[1];    // "0,50"
                    
                     
                  $temp2 explode("-"$zahlen); // Zersäge "101-500" in "101" und "500"


                     // Wenn bestellte Stückzahl Größer oder gleich 101 *und* Kleiner oder gleich 500, gib 0,50 als Einzelpreis zurück.

                     
                  if (($bestellte_stueckzahl >= $temp2[0]) and ($bestellte_stueckzahl <= $temp2[1]))
                        
                  $einzelpreis $preis;

                   } 
                  // end foreach 
                  Das wars! Wenn die Bestellte Anzahl außerhalb der angegebenen Staffeln liegt, wird natürlich kein Einzelpreis ermittelt. Da mußt Du aufpassen - auch eine automatisch versandte Bestellbestätigung kann juristische Gültigkeit haben, und wenn da dann 0,00 EUR als Preis steht, kannst Du tief in der Scheisse stecken. Abhilfe schafft z.B., die letzte Staffel mit "9999999" enden zu lassen.
                  Zuletzt geändert von pekka; 12.01.2005, 13:54.

                  Kommentar


                  • #10
                    Sorry, dass ich mich erst so spät für all Eure Hinweise bedanke!

                    Nur ist bei uns heute in der Arbeit der komplette Server abgeraucht. Ich habs dank Euch gestern noch hinbekommen.

                    Danke!

                    Super Forum!

                    Humu

                    Kommentar


                    • #11
                      für die zukunft bitte lesen: http://www.php-resource.de/forum/sho...threadid=47906

                      Kommentar

                      Lädt...
                      X