Zur Navigation

Preisberechnung für Übernachung

1 webuser (Gast)

Hallo,
ich habe die Preise für eine Ferienwohnung in einer Tabelle
abpreisdatum
bisbreisdatum
preis

Die entsprechenden Zeiträume hole ich mir mit
 $result = mysql_query("SELECT abpreisdatu, bispreisdatum, preis FROM preise where bispreisdatum >= '".$startdate."' and abpreisdatum <= '".$endedate."' order by abpreisdatum" )

Ich will jetzt die Preise für die Übernachtungen berechnen.

So solls dann aussehen:
12.4.2011 - 16.4.2011 : 4 Nächte a €60,00 = €240,00
16.4.2011 - 22.4.2011 : 6 Nächte a €70,00 = €420,00
Gesamt €660,00

folgendenOriginal Code habe ich als Ausgangspunkt gefunden:
$total=0; 
$dayOffset=0;
$bookingStart='Anfangsdatum der Belegung'; 
$bookingEnd='Enddatum der Belegung'; 
/* Sei $possiblePrice ein Array/Listenobjekt mit Objekten,  
   die die folgenden Eigenschaften haben: 
   validFrom: Startdatum der Rate 
   validUntil: Enddatum der Rate 
   price: Preis in diesem Zeitraum 
   Die Liste selbst sei aufsteigend sortiert nach "validFrom"
 */ 
foreach($possiblePrices as $currPrice) 
{ 
  if(($currPrice->validFrom>=$bookingStart && $currPrice->validFrom <=$bookingEnd) 
     || ($currPrice->validUntil>=$bookingStart && $currPrice->validUntil <=$bookingEnd))
  {
    // Anzahl Tage mit der aktuellen Rate ermitteln: 
    $currPeriodDays=(max(differenceInDays($bookingStart,$currPrice->validUntil),0)  
                     -max(differenceInDays($bookingStart,$currPrice->validFrom),0)  
                     -max(differenceInDays($bookingEnd,$currPrice->validUntil),0)); 
    // Startdatum der aktuellen Buchungsperiode ermitteln
    $currPeriodStart=dateAddDays($bookingStart,$dayOffset);
    // Zähler mit den schon bepreisten Tagen d. Buchung erhöhen:
    $dayOffset+=$currDays;
    // Enddatum der aktuellen Buchungsperiode ermitteln:
    $currPeriodEnd=dateAddDays($bookingStart,$dayOffset);
    // Preis=Anz. Tage * akt. Rate
    $currPeriodPrice=$currPeriodDays*$currPrice->price;
    // Gesamtwert aufaddieren:
    $total+=$currPeriodPrice;
    // Ausgabe:
    echo $currPeriodStart,' - ',$currPeriodEnd,' : ',$currPeriodDays,' Nächte a €',$currPrice->price,' = €',$currPeriodPrice,"<br />\n";
  }
} 
echo 'Gesamtpreis für den Zeitraum ',$bookingStart,' bis ',$bookingEnd,': ',$total; 

Ich habe den für mich umgebaut in
$total=0;
$dayOffset=0;
$bookingStart= $startdate ;
$bookingEnd= $endedate ;
/* Sei $possiblePrice ein Array/Listenobjekt mit Objekten,
   die die folgenden Eigenschaften haben:
   abpreisdatum: Startdatum der Rate
   bispreisdatum: Enddatum der Rate
   preis: Preis in diesem Zeitraum
   Die Liste selbst sei aufsteigend sortiert nach "abpreisdatum"
 */
foreach($preis as $currPrice)
{
//Hier kommt jetzt die Fehlermeldung 
  if(($currPrice->abpreisdatum>=$bookingStart && $currPrice->abpreisdatum <=$bookingEnd)
     || ($currPrice->bispreisdatum>=$bookingStart && $currPrice->bispreisdatum <=$bookingEnd))
  {
    // Anzahl Tage mit der aktuellen Rate ermitteln:
    $currPeriodDays=(max(differenceInDays($bookingStart,$currPrice->bispreisdatum),0)
                     -max(differenceInDays($bookingStart,$currPrice->abpreisdatum),0)
                     -max(differenceInDays($bookingEnd,$currPrice->bispreisdatum),0));
    // Startdatum der aktuellen Buchungsperiode ermitteln
    $currPeriodStart=dateAddDays($bookingStart,$dayOffset);
    // Zähler mit den schon bepreisten Tagen d. Buchung erhöhen:
    $dayOffset+=$currDays;
    // Enddatum der aktuellen Buchungsperiode ermitteln:
    $currPeriodEnd=dateAddDays($bookingStart,$dayOffset);
    // Preis=Anz. Tage * akt. Rate
    $currPeriodPrice=$currPeriodDays*$currPrice->preis;
    // Gesamtwert aufaddieren:
    $total+=$currPeriodPrice;
    // Ausgabe:
    echo $currPeriodStart,' - ',$currPeriodEnd,' : ',$currPeriodDays,' Nächte a €',$currPrice->preis,' = €',$currPeriodPrice,"<br />\n";
  }
}
echo 'Gesamtpreis für den Zeitraum ',$bookingStart,' bis ',$bookingEnd,': ',$total;

Ich bekomme aber die Fehlermeldung
Invalid argument supplied for foreach() in /var/www/clientsxxx/preisesql/test.php on line 130
Gesamtpreis für den Zeitraum 2011-08-08 bis 2011-09-19: 0

07.08.2011 17:00

2 Jörg Kruse

$preis muss ein Array sein (von daher wäre ein Name $preise wohl eher angebracht)

Wenn du $result weiter verarbeiten möchtest, würde ich hier mit einer while Schleife arbeiten:

while (list($abpreisdatum, $bispreisdatum, $preis) = mysql_fetch_row($result)) {
  if(($abpreisdatum>=$bookingStart && $abpreisdatum <=$bookingEnd)
     || ($bispreisdatum>=$bookingStart && $bispreisdatum <=$bookingEnd))
  {
    /* etc. */
  }
}

07.08.2011 17:22

3 webuser (Gast)

Hallo,
danke für den Hinweis.
Aber es wird nichts gerechnet. Nur die Zeile mit der Gesamtsumme wird angezeigt. Und diese Summe ist immer 0
  $total=0;
$dayOffset=0;
$bookingStart= $startdate ;
$bookingEnd= $endedate ;
/* Sei $possiblePrice ein Array/Listenobjekt mit Objekten,
   die die folgenden Eigenschaften haben:
   abpreisdatum: Startdatum der Rate
   bispreisdatum: Enddatum der Rate
   preis: Preis in diesem Zeitraum
   Die Liste selbst sei aufsteigend sortiert nach "abpreisdatum"
 */

 $result = mysql_query("SELECT  abpreisdatum, bispreisdatum, preis FROM preise where bispreisdatum >= '".$startdate."' and abpreisdatum <= '".$endedate."' order by abpreisdatum" )
 or die(mysql_error());

 while (list($abpreisdatum, $bispreisdatum, $preis) = mysql_fetch_row($result)) {
  if(($abpreisdatum>=$bookingStart && $abpreisdatum <=$bookingEnd)
     || ($bispreisdatum>=$bookingStart && $bispreisdatum <=$bookingEnd))
  {
     // Anzahl Tage mit der aktuellen Rate ermitteln:
     $currPeriodDays=(max(differenceInDays($bookingStart,$currPrice->bispreisdatum),0) -max(differenceInDays($bookingStart,$currPrice->abpreisdatum),0) -max(differenceInDays($bookingEnd,$currPrice->bispreisdatum),0));
    // Startdatum der aktuellen Buchungsperiode ermitteln
    $currPeriodStart=dateAddDays($bookingStart,$dayOffset);
    // Zähler mit den schon bepreisten Tagen d. Buchung erhöhen:
    $dayOffset+=$currDays;
    // Enddatum der aktuellen Buchungsperiode ermitteln:
    $currPeriodEnd=dateAddDays($bookingStart,$dayOffset);
    // Preis=Anz. Tage * akt. Rate
    $currPeriodPrice=$currPeriodDays*$currPrice->preis;
    // Gesamtwert aufaddieren:
    $total+=$currPeriodPrice;
    // Ausgabe:
    echo $currPeriodStart,' - ',$currPeriodEnd,' : ',$currPeriodDays,' Nächte a €',$currPrice->preis,' = €',$currPeriodPrice,"<br />\n";
  }
}
echo 'Gesamtpreis für den Zeitraum ',$bookingStart,' bis ',$bookingEnd,': ',$total;

 }
}
?>

08.08.2011 19:21

4 Jörg Kruse

$currPrice->bispreisdatum etc. musst du hier noch ersetzen durch $bispreisdatum etc. - entsprechend den Variablennamen, die in list() zugewiesen wurden.

08.08.2011 19:38 | geändert: 08.08.2011 19:39

5 webuser

Hallo,
leider hat sich nichts getan.
Es werden keine Angaben zu den einzelnen Zeiten gemacht.
Nur die Endzeile
Gesamtpreis für den Zeitraum 2012-11-01 bis 2012-12-04: 0

$result = mysql_query("SELECT abpreisdatum, bispreisdatum, preis FROM preise where bispreisdatum >= '".$startdate."' and abpreisdatum <= '".$endedate."' order by abpreisdatum" )
 or die(mysql_error());

 while (list($abpreisdatum, $bispreisdatum, $preis) = mysql_fetch_row($result)) {
  if(($abpreisdatum>=$bookingStart && $abpreisdatum <=$bookingEnd)
     || ($bispreisdatum>=$bookingStart && $bispreisdatum <=$bookingEnd))
  {
     // Anzahl Tage mit der aktuellen Rate ermitteln:
     $currPeriodDays=(max(differenceInDays($bookingStart,$currPrice->$bispreisdatum),0) -max(differenceInDays($bookingStart,$currPrice->$abpreisdatum),0) -max(differenceInDays($bookingEnd,$currPrice->$bispreisdatum),0));
    // Startdatum der aktuellen Buchungsperiode ermitteln
    $currPeriodStart=dateAddDays($bookingStart,$dayOffset);
    // Zähler mit den schon bepreisten Tagen d. Buchung erhöhen:
    $dayOffset+=$currDays;
    // Enddatum der aktuellen Buchungsperiode ermitteln:
    $currPeriodEnd=dateAddDays($bookingStart,$dayOffset);
    // Preis=Anz. Tage * akt. Rate
    $currPeriodPrice=$currPeriodDays*$currPrice->$preis;
    // Gesamtwert aufaddieren:
    $total+=$currPeriodPrice;
    // Ausgabe:
    echo $currPeriodStart,' - ',$currPeriodEnd,' : ',$currPeriodDays,' Nächte a €',$currPrice->$preis,' = €',$currPeriodPrice,"<br />\n";
  }
}
echo 'Gesamtpreis für den Zeitraum ',$bookingStart,' bis ',$bookingEnd,': ',$total;

10.08.2011 18:31

6 Jörg Kruse

"$currPrice->$bispreisdatum" macht hier keinen Sinn. Du hast kein Objekt "$currPrice" definiert.

Die Variablen werden innerhalb von list() definiert und dort steht ein bloßes "$bispreisdatum":

while (list($abpreisdatum, $bispreisdatum, $preis) = mysql_fetch_row($result)) {

10.08.2011 18:48 | geändert: 10.08.2011 18:49

7 webuser (Gast)

Hallo,
--Arrays sind wirklich nicht mein Ding - sorry.

Das Umstellen
von
   $currPeriodDays=(max(differenceInDays($bookingStart,$currPrice->$bispreisdatum),0) -max(differenceInDays($bookingStart,$currPrice->$abpreisdatum),0) -max(differenceInDays($bookingEnd,$currPrice->$bispreisdatum),0));
 
nach
  $currPeriodDays=(max(differenceInDays($bookingStart->$bispreisdatum),0) -max(differenceInDays($bookingStart->$abpreisdatum),0) -max(differenceInDays($bookingEnd->$bispreisdatum),0));
  

bringt nichts.
Gruss
Webuser

10.08.2011 22:01

8 Jörg Kruse

--Arrays sind wirklich nicht mein Ding - sorry.

Um Arrays geht es hier auch gar nicht. Und den Code, den du da jetzt produziert hast, kommentier ich lieber gar nicht erst ;)

Du hast doch einen fremden Codeabschnitt übernommen, den du so anpassen möchtest, dass die Variablen aus der Datenbankabfrage verwendet werden. Dieser Codeabschnitt enthält Objektvariablen, die du vermutlich nicht gebrauchen kannst, da du hier kein Objekt $currPrice definiert hast. Da die Variablen entsprechend meinem Vorschlag in list() definiert sind, musst du die Objektvariablen einfach nur durch die Variablen ersetzen, die innerhalb von list() aufgeführt sind. Ich habe das weiter oben doch schon geschrieben:

Zitat von Jörg
$currPrice->bispreisdatum etc. musst du hier noch ersetzen durch $bispreisdatum etc. - entsprechend den Variablennamen, die in list() zugewiesen wurden.

Du musst also folgenden Code:

$currPrice->bispreisdatum

... ersetzen durch:

$bispreisdatum

... und analog mit den anderen Objektvariablen verfahren.

10.08.2011 22:23

9 webuser (Gast)

Hallo,
danke --- jetzt hakt es nur noch an den Funktionen.
Ich bin von ausgegangen, das dateAddDays und differenceInDay
PHP Standard ist. Aber das wohl wohl nix.

Wie könnten die denn richtig aussehen?

Gruss
Webuser

function dateAddDays($bookingStart,$dayOffset)
        {
         //   $startDate = strtotime($startDate);
            dateAddDays ==  $bookingStart + $dayOffset;
             }

function differenceInDays($startDatex, $endDatex)   {
     $altx = strtotime($startDatex) ;
$aktuellx = strtotime($endDatex) ;

$differenzx = $aktuellx - $altx;
$differenceInDays = $differenzx / 86400;

//echo $differenceInDays  ;
            return ($differenceInDays);
        }

12.08.2011 23:41

10 Jörg Kruse

Wo hast du den Code denn her? dort sollten irgendwo auch die Funktionen definiert sein.

13.08.2011 16:12

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]