php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 23-10-2008, 02:43
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard Mehrfache Zeitberechnung

Hallo Prog-Profis...
ich habe mir ein kassenprogramm geschrieben.
ziel ist es die gespielte zeit an einem billardtisch zu erfassen.
nicht so schwer... doch es sind unterschiedliche preise zu bestimmten zeiten.

ALSO:
Preis für Billard von 16:00 Uhr bis 18:00 Uhr 3,50 €
Preis für Billard von 18:00 Uhr bis 20:00 Uhr 4,50 €
Preis für Billard von 20:00 Uhr bis 2:00 Uhr 5,50 €

Spielzeit, z.B. von 16:30 bis 21:00
oder
Spielzeit, z.B. von 18:00 bis 21:25
oder
Spielzeit, z.B. von 16:00 bis 21:25

Startzeit und Endzeit werden in mysql Datenbank gespeichert.
der Stundenpreis wird aus einer Datenbank abgefragt.
nun muss nur noch berechnet werden
wenn startzeit < 18:00 und endzeit < 18:00
wenn startzeit < 18:00 und endzeit < 20:00
wenn startzeit < 20:00 und endzeit < 22:00 und endzeit > 20:00
usw...

hat jemand eine idee wie man das umsetzen kann?
habe bisher die ganze kasse selber geschrieben... aber hier bin ich am ende.
bekomme es einfach nicht hin...
wäre suuuper nett, wenn mir da einer helfen könnte...
danke schon mal vorab
Mit Zitat antworten
  #2 (permalink)  
Alt 23-10-2008, 08:53
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also ich würde einfach die Anteile der zeiten in den jeweilig festgelegten Zeitclustern ausrechnen und dann mit dem Stundensatz versehen, heisst Du zerlegst die Zeitfenster in der Berechnungslogik

Spielzeit, z.B. von 16:30 bis 21:00
entspricht dann
1,5 Std 3,50 €
2 Std 4,50 €
1 Std 5,50 €
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #3 (permalink)  
Alt 23-10-2008, 17:55
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard Zeiberechnung

Hallo MelloPie,
erst mal danke für die rasche antwort...

so hab ich das auch versucht aber ich bin an den vielen möglichkeiten gescheiter die sich da ergeben...

hättest du da ein beispiel ?

denn alleine das zerlegen der zeitabschnitte ist ja schon recht aufwendig.

hinzu kommt:
mann kann 3 tische zusätzlich starten in einer tischabrechnung.
Bs. tisch 8 wird gestartet und die kundenseite für den Tisch wird automatisch geöffnet.
dann kann man auf der seite noch z.B. Tisch 9, 10 und 11 starten.
alles wird dann am ende bei tisch 8 abgerechnet.

bisher funktioniert das alles auch ganz prima, nur halt immer mit dem selben preis. (nur tisch 11 ist etwas teurer weil das Snooker ist.)
wird aber alles berechnet.

soll ich mal meine berechnung hier posten?
falls jemand da durchsteigt. (anfänger-PHP)
Mit Zitat antworten
  #4 (permalink)  
Alt 23-10-2008, 18:51
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du hast eine Tabelle prices(start, end, price). Desweiteren hast du eine Tabelle tables(id, name), in der die Tische abgelegt sind und eine Tabelle rents(id, tid, start, end). Was du wahrscheinlich noch nicht hast, ist eine Tabelle bills(id, rid).

Wenn jetzt ein Kunde einen Tisch mietet, erzeugst du einen Eintrag in bills mit irgendeiner eindeutigen ID und einem Verweis auf einen Eintrag in rents. Den mußt du natürlich auch noch anlegen (es sei denn es wurde vorbestellt, aber das lassen wir mal außen vor). Der Eintrag in rents gibt an, welcher Tisch (tid) ab wann (start) gemietet wurde. rents.end bleibt erstmal leer.

Jetzt wird ein weiterer Tisch vom selben Kunden, also auf die selbe Rechnung gemietet. Du schreibst einen neuen Eintrag in bills, und zwar mit der selben bills.id und einer rid, die auf den neuen Ausleihvorgang verweist.

Wenn ein Kunde bezahlen möchte, mußt du nur seine Rechnungsnummer (bills.id) wissen. Damit ziehst du aus bills alle rid's, also alle "Ausleihen", die er hatte. Jetzt setzt du erstmal bei jeder dieser Ausleihen den end-Wert auf NOW().

UPDATE rents SET end = NOW() WHERE id IN (SELECT rid FROM bills WHERE id = $id)

Jetzt bestimmst du den minimalen start- und maximalen end-Wert aller dieser Ausleihen und ziehst dir aus prices alles, was in diesen Bereich fällt.

SELECT * FROM prices
WHERE end < (SELECT MIN(start) FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id))
OR start > (SELECT MAX(end) FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id))

Die Preisermittlung würde ich der Einfacheit halber in PHP machen. Dazu brauchst du noch die Ausleihen.

SELECT * FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id)

Nun iterierst du über alle Ausleihen, zerlegst sie in Zeitspannen entsprechend der Preisbereiche, multiplizierst ein wenig und summierst am Ende. Fertig.
Mit Zitat antworten
  #5 (permalink)  
Alt 24-10-2008, 04:18
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo onemorenerd...

nun...
das ist alles auch nicht so das Problem.
ich habe ausschließlich ein Problem mit den Berechnungen wenn der Preis zu gewissen Zeitabschnitten unterschiedlich ist.

______________________________________________
Tisch 1 wird angeklickt:
in Tabelle abr wird die Tischnummer (1), Startzeit und pool eingetragen

nun starte ich bei Tisch 1 auch noch Tisch 4:
in Tabelle abr wird die Tischnummer (4), Startzeit und pool eingetragen
bei Tisch 1 (ID 1) wird der Zusatz 4 eingetragen.
(Damit beim abrechen erkannt wird das Tisch 4 nur unter der Abrechnung von Tisch 1 zu stoppen ist. Tisch 4 kann jetzt nicht auf der Abrechnungsseite von Tisch 4 gestoppt werden.)

Alle Tische die von Tisch 1 aus nun geführt werden kann ich jederzeit stoppen und auch so oft ich will.
Bezahlte Zwischenbeträge werden von der Endabrechnung abgezogen.
( kann ja sein das ein Gast schon eher gehen will und seinen Tischanteil schon bezahlt.)

Bis hierher funktioniert das Programm einwandfrei !!

ist aber jetzt der Preis zu gewissen Zeitabschnitten unterschiedlich,
gerate ich an meine Grenzen.

Lass uns mal die Zusatztische vergessen und nur von einem Tisch ausgehen.

>>>Beispielberechnung<<<

Alle Zeiten und Preise werden aus der sql-datenbank abgefragt,


Tisch 1 läuft von 16:12 ($starttime) Uhr bis 21:33 ($endtime)
Preis1 = 3,50 € 16:00 ($time_a) bis 18:00 ($time_b) Uhr
Preis2 = 4,50 € 18:01 ($time_b) bis 20:00 ($time_c) Uhr
Preis3 = 5,50 € 20:01 ($time_c) bis 2:00 ($time_d) Uhr
$preis1=3,50/60; // Minutenpreis
$preis2=4,50/60;
$preis3=5,50/60;

if ($startime > $time_a and $startime < $time_b and and $endtime > $time_b and $endtime > $time_c)
{
$zeit1 = $time_b - $starttime/60; //Zeit in Minuten
$zeit2 = $time_c - $time_b / 60;
$zeit3 = $endtime - $time_c / 60;
$summe1 = $zeit1*$preis1;
$summe2 = $zeit2*$preis2;
$summe3 = $zeit3*$preis3;
$endsumme = $summe1+$summe2+$summe3;
}
echo $endsumme;

Doch wieviele Möglichkeiten gibt es da??

Es kommt ja immer wieder zu doppelten Möglichleiten die in den nächsten Abfragen wieder ausgeschlossen werden müssen.

Also wenn der Tisch nach 18:00 gestartet wird und nach 20:00 gestoppt
oder vor 18:00 start und vor 20:00 stopp usw.....
Mit Zitat antworten
  #6 (permalink)  
Alt 24-10-2008, 09:43
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja den gespielten zeitraum musst du eben zerschneiden und dann mit dem jeweiligen minutenpreis verrechnen.
Wobei Dein Beispiel irreführen ist denn entweder ist time_b 18:00 oder 18:01

Ich würde das ganze in ein array packen und dann durch eine Schleife gehen bei der ich prüfe ob die startzeit >= der Anfangszeit eines zeitclusters ist, wenn ja berechne ich die Anzahl der minuten, die meine mietdauer in dem jeweiligen zeitcluster hat und verrechne das mit dem minutenpreis...
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #7 (permalink)  
Alt 24-10-2008, 12:45
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von ostems
nun starte ich bei Tisch 1 auch noch Tisch 4:
in Tabelle abr wird die Tischnummer (4), Startzeit und pool eingetragen
bei Tisch 1 (ID 1) wird der Zusatz 4 eingetragen.
(Damit beim abrechen erkannt wird das Tisch 4 nur unter der Abrechnung von Tisch 1 zu stoppen ist. Tisch 4 kann jetzt nicht auf der Abrechnungsseite von Tisch 4 gestoppt werden.)
Ich frage mich zwar, wie du Tisch 4 ansehen willst, dass er nicht direkt gestoppt/abgerechnet werden kann. Diese Info steckt nur in Tisch 1. Aber du wirst es ja wissen.

Zitat:
Doch wieviele Möglichkeiten gibt es da??

Es kommt ja immer wieder zu doppelten Möglichleiten die in den nächsten Abfragen wieder ausgeschlossen werden müssen.
Willst du wirklich alle Möglichkeiten hart im Code fixieren? Schau noch mal ins Pflichtenheft ... da steht sicher drin, dass die Preise und Zeiten veränderlich sein sollen und damit ändern sich auch die Möglichkeiten. Kannst du also gar nicht hart kodieren.

Mein Ansatz wäre wie folgt:
Sortiere die Preis-Zeitspannen nach ihrer Startzeit.
Iteriere über diese Liste.
... Iteriere über alle Ausleihen.
...... Wenn es eine Überdeckung von Ausleihe und Zeitspanne gibt,
......... addiere das Produkt von Überdeckung und Preis zur Gesamtsumme.

Wo klemmts da bei dir? Kannst du die Überdeckung nicht berechnen?
Mit Zitat antworten
  #8 (permalink)  
Alt 24-10-2008, 16:58
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von MelloPie
Wobei Dein Beispiel irreführen ist denn entweder ist time_b 18:00 oder 18:01
nur ein versehen... die zeiten sind Unterschiedlich benannt.



Zitat:
Original geschrieben von onemorenerd
Ich frage mich zwar, wie du Tisch 4 ansehen willst, dass er nicht direkt gestoppt/abgerechnet werden kann. Diese Info steckt nur in Tisch 1. Aber du wirst es ja wissen.
Ich brauch nicht zu Tisch 4, bzw dort steht auch die startzeit...
mann bekommt beim versuch den Zusatztisch zu stoppen eine Meldung das es nur unter Tisch 1 möglich ist.
Dort werden auch die Zeiten angezeigt.

Zitat:
Original geschrieben von onemorenerd
Wo klemmts da bei dir? Kannst du die Überdeckung nicht berechnen?
Die Anzahl der Möglichkeiten der Startzeiten :
Die Abfragen dürfen ja nicht so geschrieben sein, dass eine weitere Abfrage sich mit den anderen überschneidet also z.B. Möglichkeit 4 hebt Möglichkeit 1 auf... oder so...

schwer zu schreiben....
Mit Zitat antworten
  #9 (permalink)  
Alt 25-10-2008, 00:17
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von MelloPie


Ich würde das ganze in ein array packen und dann durch eine Schleife gehen bei der ich prüfe ob die startzeit >= der Anfangszeit eines zeitclusters ist, wenn ja berechne ich die Anzahl der minuten, die meine mietdauer in dem jeweiligen zeitcluster hat und verrechne das mit dem minutenpreis...

ich starre jetzt schon 10 minuten auf diesen Satz...
*grübel*

$start und $end Abfrage aus der Datenbank...

und nu?

Stelle ich mich ein wenig Dämlich an oder komm ich nur nicht drauf?

hättes Du Lust und Zeit für ein kleines Beispiel?

Muss evtl erklären das ich Anfänger bin was das Programmieren angeht.
Die Kasse ist mein erstet Objekt. Hat ein Jahr gedauert...

Wenn Du magst kannst Du sie dir ansehen. Habe sie Online gestellt .
Hier Klicken
Mit Zitat antworten
  #10 (permalink)  
Alt 25-10-2008, 20:24
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard Lösung?

Geht das auch kürzer?

PHP-Code:
include ("inc/opendb.inc.php"); // DB öffen

$actDate =date("H:i:s");
// Endzeit wird in die Datenbank geschreiben
$sql="Update abr SET    zeit2 = '$actDate' WHERE tischnr='$tischnr' ";
mysql_query($sql);
////////////////////////////////////////////////////////////////////////////////////////////////////////


// Hier wird der Preis für die jeweilige Spielart abgefragt

$sql mysql_query("SELECT * FROM config");
$preisart mysql_fetch_array($sql);
$snooker1 =$preisart['snooker1'];         // Preis je Stunde
$snooker2 =$preisart['snooker2'];
$snooker3 =$preisart['snooker3'];
$pool1 =$preisart['billard1'];
$pool2 =$preisart['billard2'];
$pool3 =$preisart['billard3'];
$karam1 =$preisart['karam1'];
$karam2 =$preisart['karam2'];
$karam3 =$preisart['karam3'];
$internet1 =$preisart['pc1'];
$internet2 =$preisart['pc2'];
$internet3 =$preisart['pc3'];
$time3 =$preisart['zeit1'];           // Erste Zeitansetzung für Preiserhöhung
$time4 =$preisart['zeit2'];           // Zweite Zeitansetzung für Preiserhöhung



$tischnr=$_GET["tischnr"];
include (
"inc/opendb.inc.php");
// Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
$abfrage mysql_query("SELECT zeit1, zeit2, art, pers, bezahlt FROM abr WHERE tischnr='$tischnr'");
$time mysql_fetch_array($abfrage);
$time1 $time['zeit1'];            // Startzeit
$time2 $time['zeit2'];            // Stoppzeit
$bezahlt $time['bezahlt'];        // bereits gezahlter Betrag
$pp $time['pers'];                // Teilnehmer durch die der Gesamtbetrag aufgeteilt wird



// Nach Tischnummer die Spielart bestimmen  ( wegen Preisunterschied )  ////////////////////////////////

if ($tischnr 11)                          // Tisch 1 bis 10  (der Wert 11 wird noch in der Confic-Datei festgelegt
{
$art "pool";
}
if (
$tischnr 10 and $tischnr 13)        // Tisch 11 bis 12  (die Werte 10 u. 13 werden noch in der Confic-Datei festgelegt
{
$art "snooker";
}
if (
$tischnr 12)                          // PC 1 (13) bis 2 (14)  (der Wert 12 wird noch in der Confic-Datei festgelegt
{
$art "pc";
}                                           
// Die werte für Karambol folgen noch (werden noch nicht benötigt
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Spielart bestimmen und Berechnungspreis festlegen //////////////////////////////////////////////////////////////////////////
if ($art == "pool")
{
$wert_a $pool1/60;                            // Minutenpreis für Pool in Preiskategorie 1
$wert_b $pool2/60;                            // Minutenpreis für Pool in Preiskategorie 2
$wert_c $pool3/60;                            // Minutenpreis für Pool in Preiskategorie 3

}  else  {

if (
$art == "snooker")
{
$wert_a $snooker1/60;                          // Minutenpreis für Snooker in Preiskategorie 1
$wert_b $snooker2/60;                          // Minutenpreis für Snooker in Preiskategorie 2
$wert_c $snooker3/60;                          // Minutenpreis für Snooker in Preiskategorie 3

} else  {

if (
$art == "karam")
{
$wert_a $karam1/60;                            // Minutenpreis für Karambol in Preiskategorie 1
$wert_b $karam2/60;                            // Minutenpreis für Karambol in Preiskategorie 2
$wert_c $karam3/60;                            // Minutenpreis für Karambol in Preiskategorie 3

} else  {

$wert_a $internet1/60;                         // Minutenpreis für PC-Internet in Preiskategorie 1
$wert_b $internet2/60;                         // Minutenpreis für PC-Internet in Preiskategorie 2
$wert_c $internet3/60;                         // Minutenpreis für PC-Internet in Preiskategorie 3

        
}
}
        }


// aufsplitten der Zeiten  //////////////////////////////////////////////////////////////
list($std1$min1) = explode (":"$time1);      // Startzeit
list($std3$min3) = explode (":"$time3);      // bis erste Preissteigerung
list($std4$min4) = explode (":"$time4);      // bis zweite Preissteigerung
list($std2$min2) = explode (":"$time2);      // Endzeit

// Wenn vor 00:00 gestartet und nach 00:00 Uhr gesoppt wurde,
// ist die Endzeit kleiner als die Startzeit weil mit
//dem Zeitformat **** date("H:i:s");  gearbeitet wird
$zahl=0;
if (
$time['zeit1'] >= $time['zeit2'] )           // wenn Endzeit kleiner Startzeit
                 
{
$zahl "1440";  }                               // 24 Stunden in Minuten

//////////////// Berechnungen der Start und Stoppzeitdifferenzen  /////////////////////////////////////

// Berechnung 1 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Stopp vor erste Preissteigerung    ****************************************************************
if ( $time2 $time3)
  {
$differ2 =  abs ($std2*60 $min2);
$differ1 =  abs ($std1*60 $min1);
$diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_a;
$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin ;
  }
// Berechnung 1 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 2 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start und Stopp vor zweite Preissteigerung  ********************************************************
if ( $time1 $time4 and $time1 $time3 and $time2 $time4)
   {
$differ1 =  abs ($std1*60 $min1);
$differ2 =  abs ($std2*60 $min2);
$diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_b;
$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin ;
   }
// Berechnung 2 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 3 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start und Stopp nach zweite Preissteigerung   ******************************************************
if ($time1 "00:00:00" and $time1 "08:00:00" or $time1 $time4)
   {
$differ2 =  abs ($std2*60 $min2);
$differ1 =  abs ($std1*60 $min1);
$diffmin abs (($std2*60+$zahl $min2) - ($std1*60 $min1))*$wert_c;
$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin ;
}
// Berechnung 3 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 4 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
if ( $time1 $time3  and $time1 $time4 and $time2 $time4)
   {
$differ2 =  abs ($std2*60 $min2);
$differ1 =  abs ($std1*60 $min1);
$differ3 =  abs ($std3*60 $min3);
$differ4 =  abs ($std4*60 $min4);

$diffmin_x abs (($std4*60 $min4) - ($std1*60 $min1))*$wert_b;
$diffmin_y abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert_c;
$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin_x+$diffmin_y ;
     }
// Berechnung 4 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 5 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
if ( $time1 $time3  and  $time2 $time4 or $time1 $time3  and  $time2 "08:00:00")
   {
$differ2 =  abs ($std2*60 $min2);
$differ1 =  abs ($std1*60 $min1);
$differ3 =  abs ($std3*60 $min3);
$differ4 =  abs ($std4*60 $min4);

$diffmin_x abs (($std3*60 $min3) - ($std1*60 $min1))*$wert_a;
$diffmin_y abs (($std4*60 $min4) - ($std3*60 $min3))*$wert_b;
$diffmin_z abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert_c;

$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin_x+$diffmin_y+$diffmin_z ;
    }
// Berechnung 5 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 6 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Wenn alle Preis gleich sind wird Preisklasse 3 gewählt
if ($time3 == $time4)
   {
//$diffmin = abs (($std2*60 + $min2) - ($std1*60 + $min1))*$wert;
$differ2 =  abs ($std2*60 $min2);
$differ1 =  abs ($std1*60 $min1);
$diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_c;
$lauf1 abs (($std2*60+$zahl $min2) - ($std1*60 $min1));
$lauf $lauf1/60;
$summe $diffmin ;

   }
// Berechnung fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//Ende der Preisberechnung ***************************************************************************


//  Noch die Prozente und den bezahlten Betrag abrechnen /////////////////////////////////////////////
if ($prozente <> "") { $abzug1 $summe/100;  $abzug=$abzug1*$prozente;
$summe $summe-$abzug;
}
// Endsumme wurde ermittelt //////////////////////////////////////////////////////////////////////////


// Der errechnete Preis für die jeweilige Spielart wird in die Datenbbank geschrieben
$sql="Update abr SET    spiel = '$summe' WHERE tischnr='$tischnr' ";
$r_update=mysql_query($sql);

// ende der Berechnung 
Steigt da Jemand durch?

Geändert von ostems (25-10-2008 um 20:39 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 25-10-2008, 20:55
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Anscheinend tippt der Programmierer sehr gerne. Vieles ist mehrfach geschrieben, warum auch immer. Vielleicht weils nach "mehr" aussieht.

Ich hab mal ein Großteil zusammengefasst und einige Kommentare hinzugefügt. Vieles gibts noch zu tun, aber nicht von mir.

PHP-Code:
<?php

require 'inc/opendb.inc.php';

$sql "UPDATE abr SET zeit2 = NOW() WHERE tischnr = '$tischnr'";
// NOW() reicht, wenn die Spalte das richtige Datenformat hat (TIME).
// Woher kommt eigentlich $tischnr?

mysql_query($sql);


$sql mysql_query("SELECT * FROM config");
$preisart mysql_fetch_array($sql);
// Seh ich das richtig, dass in dieser Tabell nur eine einzige Zeile steht?
// Wozu dann überhaupt eine eigene Tabelle? Pure verschwendung.

// unnötige Variablenzuweisungen hab ich hier rausgenommen.

$time3 $preisart['zeit1'];           // Erste Zeitansetzung für Preiserhöhung
$time4 $preisart['zeit2'];           // Zweite Zeitansetzung für Preiserhöhung

// $time3? $time4? Was sind das für komische Variablennamen? Und wo ist $time1 und $time2?

$tischnr $_GET['tischnr'];
// Ahh hier ist $tischnr. Sollte das nicht oben sein? Und wo bleibt das mysql_real_escape()
// oder der Integer-Cast?

// include ('inc/opendb.inc.php');
// Moment mal, das hatten wir doch schon mal. Also auskommentiert.

// Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
$abfrage mysql_query("SELECT zeit1, zeit2, art, pers, bezahlt FROM abr WHERE tischnr = '$tischnr'");

// zeit1 und zeit2 sind natürlich suuuper namen für Startzeit und Endzeit. Da weiß jeder SOFORT
// was gemeint ist. Oder? Na immerhin ist es gnädigerweise kommentiert.

$time mysql_fetch_array($abfrage);
$time1 $time['zeit1'];            // Startzeit
$time2 $time['zeit2'];            // Stoppzeit
$bezahlt $time['bezahlt'];        // bereits gezahlter Betrag
$pp $time['pers'];                // Teilnehmer durch die der Gesamtbetrag aufgeteilt wird

// pp? person p.....?


// Nach Tischnummer die Spielart bestimmen  ( wegen Preisunterschied )

if ($tischnr 11) {                          // Tisch 1 bis 10  (der Wert 11 wird noch in der Confic-Datei festgelegt
    
$art 'billiard';
} elseif (
$tischnr 10 and $tischnr 13) {  // Tisch 11 bis 12  (die Werte 10 u. 13 werden noch in der Confic-Datei festgelegt
    
$art 'snooker';
} elseif (
$tischnr 12) {                    // PC 1 (13) bis 2 (14)  (der Wert 12 wird noch in der Confic-Datei festgelegt
    
$art 'pc';
}                                             
// Die werte für Karambol folgen noch (werden noch nicht benötigt

$wert = array();
for (
$i 1$i <= 3$i++)
    
$wert[$i] = $preisart[$art $i] / 60;

// Wieder mal ein Haufen Tipparbeit gespart. Was man mit For-Schleifen und Arrays alles bewirken kann...


// aufsplitten der Zeiten
for ($i 1$i <= 4$i++) {
    list(${
'std' $i}, ${'min' $i}) = explode(':', ${'time' $i});

// Eigentlich sollten das Arrays sein statt lustige durchnummerierte Variablen, aber mir
// ist das jetzt zu anstrengend alles zu ändern.

// Wenn vor 00:00 gestartet und nach 00:00 Uhr gesoppt wurde,
// ist die Endzeit kleiner als die Startzeit weil mit
// dem Zeitformat **** date("H:i:s");  gearbeitet wird
$zahl=0;
if (
$time['zeit1'] >= $time['zeit2'] )           // wenn Endzeit kleiner Startzeit
    
$zahl 1440;                                // 24 Stunden in Minuten

// Na juhu, die Variable $zahl enthält zu aller erstaunen eine Zahl. Aber welche und wofür?
// Das erfahrt man nur, wenn man die Kommentare absucht. Zum Glück sind nicht alle Leute
// so einfallsreich bei der Namensgebung, sonst würde ein Großteil der Menschen "Baby"
// oder "Kind" heißen.

//////////////// Berechnungen der Start und Stoppzeitdifferenzen  /////////////////////////////////////

// Die berechneten Variablen $differ1 und $differ2 werden _nirgendwo_ verwendet. Wozu dann berechnen?
// Ich lösch sie mal einfach raus.

// Berechnung 1 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Stopp vor erste Preissteigerung    ****************************************************************

// Kuhl. Ich hätte da außer /////, >>>>> und ***** noch ein paar Vorschläge:
// ----------------
// ################
// ::::::::::::::::
// ++++++++++++++++
// ~~~~~~~~~~~~~~~~
// So, Ende der Zeichenstunde.

$lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));

if ( 
$time2 $time3) {
    
$summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[1];
}
// Berechnung 1 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 2 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start und Stopp vor zweite Preissteigerung  ********************************************************
if ( $time1 $time4 and $time1 $time3 and $time2 $time4) {
    
$summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[2];
}
// Berechnung 2 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 3 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start und Stopp nach zweite Preissteigerung   ******************************************************
if ($time1 "00:00:00" and $time1 "08:00:00" or $time1 $time4) {
    
$summe abs (($std2*60+$zahl $min2) - ($std1*60 $min1))*$wert[3];
}
// Berechnung 3 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 4 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
if ( $time1 $time3  and $time1 $time4 and $time2 $time4) {
    
$summe  abs (($std4*60 $min4) - ($std1*60 $min1))*$wert_b;
    
$summe += abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert[3];

// Berechnung 4 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 5 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
if ( $time1 $time3  and  $time2 $time4 or $time1 $time3  and  $time2 "08:00:00") {
    
$summe  abs (($std3*60 $min3) - ($std1*60 $min1))*$wert[1];
    
$summe += abs (($std4*60 $min4) - ($std3*60 $min3))*$wert[2];
    
$summe += abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert[3];
}
// Berechnung 5 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Berechnung 6 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Wenn alle Preis gleich sind wird Preisklasse 3 gewählt
if ($time3 == $time4) {
    
$summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[3];
    
$lauf1 abs (($std2*60+$zahl $min2) - ($std1*60 $min1));
}
// Berechnung fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Ich bin jetzt auch völlig fertig.


$lauf $lauf1 60;
// Wieder mal so einfallsreiche Variablennamen.


//Ende der Preisberechnung ***************************************************************************

// Ist die Berechnung jetzt endgültig beendet, oder kommt noch ein Ende?


//  Noch die Prozente und den bezahlten Betrag abrechnen /////////////////////////////////////////////
if ($prozente != '') {
    
$abzug1 $summe 100;
    
$abzug $abzug1 $prozente;
    
$summe $summe $abzug;
}
// Endsumme wurde ermittelt //////////////////////////////////////////////////////////////////////////

// Wo kommt den $prozente plötzlich her?

// Der errechnete Preis für die jeweilige Spielart wird in die Datenbbank geschrieben
$sql "UPDATE abr SET spiel = '$summe' WHERE tischnr = '$tischnr'";
$r_update mysql_query($sql);

// ende der Berechnung

// Das war wohl das letzte Ende. Oder?

?>

Geändert von h3ll (25-10-2008 um 22:24 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 26-10-2008, 01:07
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hall0 h3ll...

zunächst einmal danke für das Beispiel es als array zu schreiben

Zitat:
Anscheinend tippt der Programmierer sehr gerne. Vieles ist mehrfach geschrieben, warum auch immer.
Hatte ich nicht geschrieben das ich noch Anfänger bin??

Zitat:
$time3? $time4? Was sind das für komische Variablennamen?
Und wo ist $time1 und $time2?
$time3 und 4 sind für mich variablen die ich wiedererkenne!
und was soll die frage, wo $time1 u. 2 sind?
stehen doch drin!

Zitat:
// unnötige Variablenzuweisungen hab ich hier rausgenommen.
hätte nicht gedacht das dafür nur eine variable reicht.
Dachte es müssen alle werte mit rangezogen werden...
schönes ding...

Zitat:
// Ahh hier ist $tischnr. Sollte das nicht oben sein?
Und wo bleibt das mysql_real_escape()
Im Originalscript ist oben noch einiges mehr drin. u.a. auch die $prozente=$POST["prozente"];
Es geht mir nur um die Berechnung des hier aufgeführten

Die Zeichenstunde habe ich auch nur hier,
weil ich dachte es wäre besser zu erkennen was alles berechnet werde muss.
ich fand es dann eher Überschaubar.

Zitat:
// Na juhu, die Variable $zahl enthält zu aller erstaunen eine Zahl. Aber welche und wofür?
Bitte ein Beispiel die erkennen läßt worum es sich handelt!
ich nehme alle Tips gerne an.

und wie berechne ich die differenz der startzeit und endzeit wenn die endzeit kleiner ist als die startzeit.


Aber ziehe das ganze bitte nicht mehr in Lächerliche.
Damit ist mir nicht geholfen.
Ich brauche Hilfe, habe venünftig darum gebeten und Besserwisserei kann ich nicht gebrauchen.
Danke

Das Du etwas davon verstehst, das merke ich schon...

Ach ja... differ1 sowie differ2 hatte ich vergessen zu löschen... die waren vorher von belang aber nun wie du ja auch bemerkt hast, nicht mehr nötig.

Zudem ist das mit der von Dir geschriebenen Variable
auch nur um die Art zu ermitteln und um die Zeit zu splitten...
Die Berechnung, um die hier geht hast du völlig außen vor gelassen...


um es nocheinmal auf den Punkt zu bringen...

$time1 ist die startzeit
$time3 ist die erste zeit wo auch der preis das erste mal steigt (18:00)
$time4 ist die zweite zeit wo auch der preis das zweite mal steigt (20:00)
$time2 ist die gestoppte endzeit


gehen wir davon aus das die

Möglichkeit 1:
startzeit vor 18:00 ist
und die endzeit vor 18:00 Uhr

Möglichkeit 2:
startzeit nach 18:00 ist
und die endzeit vor 20:00 Uhr

Möglichkeit 3:
startzeit nach 20:00 ist
und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

Möglichkeit 4:
startzeit vor 18:00 ist
und die endzeit vor 20:00 Uhr

Möglichkeit 5:
startzeit vor 18:00 ist
und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

Möglichkeit 6:
startzeit vor 20:00 ist
und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

noch was vergessen?


egal ob nun billard, snooker oder pc.
bitte denke aber daran, das zeitformat ist $actDate =date("H:i:s");

Geändert von ostems (26-10-2008 um 01:11 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 26-10-2008, 03:06
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
$time1 ist die startzeit
Und warum heißt sie dann nicht zB. $start_time statt $time1?

Zitat:
$time2 ist die gestoppte endzeit
Wie wärs mit $end_time?


Im folgenden Beispiel nehme ich übrigens an, dass in $prices alle Preise nach Startzeit chronologisch
angeführt sind. Ganz oben der Standardpreis, wenn man so will.

PHP-Code:
<?php

function time_to_hours($time) {
    list(
$h$m$s) = explode(':'$time);
    return 
$h $m 60 $s 3600;
}


// Das sind Beispielwerte. 'value' ist der Preis pro Stunde,
// 'time' ist die Uhrzeit, ab wann der Preis gilt.

$prices = array(
    array(
'value' => 10.0'time' => '00:00:00'),
    array(
'value' => 15.0'time' => '18:00:00'),
    array(
'value' => 20.0'time' => '22:00:00')
);

$start_time time_to_hours('17:30:00');
$end_time time_to_hours('01:00:00');
if (
$end_time $start_time)
    
$end_time += 24.0;

$sum 0.0;

for (
$i_cnt 0$i_max count($prices) - 1$i_cnt <= $i_max$i_cnt++) {
    
$current_time time_to_hours($prices[$i_cnt]['time']);
    
$next_time $i_max $i_cnt time_to_hours($prices[$i_cnt 1]['time']) : 48.0;

    if (
$start_time $next_time && $end_time >= $current_time) {
        
$diff_time  $end_time $next_time $end_time $next_time;
        
$diff_time -= $start_time $current_time $start_time $current_time;

        
$sum += $prices[$i_cnt]['value'] * $diff_time;
    }
}

echo 
$sum;
// 125

?>

Geändert von h3ll (26-10-2008 um 03:14 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 26-10-2008, 06:13
ostems
 Registrierter Benutzer
Links : Onlinestatus : ostems ist offline
Registriert seit: May 2008
Beiträge: 44
ostems ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich wusste das du mehr kannst als mich nur mekern...

Danke Danke... das ist prächtig und ich bin mehr als begeistert...
meine kenntnisse reichen für solche sachen halt noch nicht aus...

doch ein problem gibt es immer noch *duck*


$prices = array(
array('value' => 5.50, 'time' => '00:00:00'),
array('value' => 3.50, 'time' => '08:00:00'), // hab ich noch dazwischen gesetzt
array('value' => 4.50, 'time' => '18:00:00'),
array('value' => 5.50, 'time' => '20:00:00')
);

$start_time = time_to_hours($time1); mit meinen Variablen bestückt
$end_time = time_to_hours($time2);

funktioniert super

doch in dieser form nicht:

$time3 = "18:00:00"; // sind aus der Datenbank
$time4 = "20:00:00";
$time5 = "00:00:00";
$time6 = "08:00:00";
$wert_a ="3.50"; // sind aus der Datenbank
$wert_b ="4.50";
$wert_c ="5.50";

$prices = array(
array('value' => $wert_c, 'time' => $time5),
array('value' => $wert_a, 'time' => $time6),
array('value' => $wert_b, 'time' => $time3),
array('value' => $wert_c, 'time' => $time4)
);
$start_time = time_to_hours($time1); mit meinen Variablen bestückt
$end_time = time_to_hours($time2);

Was mag das script daran nicht?
habe mit array´s noch nicht so meine erfahrungen.
Mit Zitat antworten
  #15 (permalink)  
Alt 26-10-2008, 08:42
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von ostems
Was mag das script daran nicht?
habe mit array´s noch nicht so meine erfahrungen.
Debuggen. Lass dir alle Variablen ausgeben und überprüfe, welche nicht stimmen können. Arrays kannst du mit print_r() ausgeben.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:25 Uhr.