Reservierungstabellen - Suche Ideen/Hilfe [PHP/MySQL]

Hab mein vorheriges Problem gelöst.
Nun hab ich einfach immer Zimmernummer und Datum angegeben.

Also, soweit habe ich es:
[php]

Einzelzimmer

<?php echo'
Zimmer: Nr. 1 Nr. 2 Nr. 3 Nr. 4 Nr. 5
'.//hierwas.' './/dawas.' '..' '..' '..' '..'
'; ?>[/php] Also es hat immer eine neue Zeile in der Tabelle, pro Datum ausgegeben. (Woche 31 z.B.) Nun sollte das nun eine while() Schleife haben und die Tabelleneinträge von der MySQL Datenbank soll rein.

Aber:
Wie kann ich eine while schleife machen, die in mehreren Tabellensätzen ist?

Ich dachte iwie so:
[php]

Einzelzimmer

<?php echo' '.$tabelle="";. //hier iwie while einsetzen '
Zimmer: Nr. 1 Nr. 2 Nr. 3 Nr. 4 Nr. 5
'.//hierwas.' './/dawas.' '..' '..' '..' '..'
'; ?>[/php] Ich habe vorher noch nie richtig mit Schleifen gearbeitet, ausser kleine Sachen mit MySQL (einzelne Tabelleninhalte) habe ich ausgegeben mit PHP.

Ich hoffe, jemand kann mir da helfen.

MfG, matibaski

schreib doch anstatt von x ‚noch 2 Häuser frei‘ bzw. ‚5 Häuser reserviert‘

Danke!
Gute Idee, werd’s mal umändern, sobal ich einen Ansatz für meine MySQL-Einsätze habe :wink:

MfG, matibaski

schreib doch mal pls die struktur deiner MySQL Tabelle

Ich arbeite nicht mit PHPMyAdmin.
Aber so sollte sie aussehen:

+-----+----+----+----+----+----+ |Datum|Nr.1|Nr.2|Nr.3|Nr.4|Nr.5| +-----+----+----+----+----+----+ | | | | | | | +-----+----+----+----+----+----+Etwa so sieht sie aus…
Sie ist mit den Zimmernummern gemacht.
Aber ich muss wohl eine neue anfertigen, da deine Idee viel besser ist :wink:

Zu deinem „Kalender“
Mein Auftraggeber mailte mir gerade zurück und sagte, dies wäre eine gute Idee. Die vorherige von mir und deine haben einen Haken.
Da müsste man Tausendlange scrollen… :wink:
Hättest du 'ne Idee, wie man das darstellen kann, dass die Woche 20 zum Beispiel angezeigt wird, und dann die einzelnen Daten und Wochentagnamen?

Er sagte, so könne man es machen:
http://www.gruppenhaus.ch/index.cfm?nav=1&page=detail&id=253&mypage=1&CFID=1173418&CFTOKEN=45020115&NoNewSelection=nein&nachDatum=nein&sheet=4&record=0
Da sind die Monate drauf, und oben die Tage des Monat’s :wink:

Wäre also deine Theorie so umsetzbar?

----------+---+---+---+---+---+---+---+---+---+---+---+---+ |01 |02 |03 |04 |05 |06 |07 |08 |09 |10 |11 |12 | ----------+---+---+---+---+---+---+---+---+---+---+---+---+ Jauar |1/5|2/5|5/5|0/5|5/5|5/5|5/5|5/5|5/5|3/5|1/5|1/5| Februar | | | | | | | | | | | | | März | | | | | | | | | | | | | April | | | | | | | | | | | | | Mai | | | | | | | | | | | | | Juni | | | | | | | | | | | | | Juli | | | | | | | | | | | | | August | | | | | | | | | | | | | September | | | | | | | | | | | | | Oktober | | | | | | | | | | | | | November | | | | | | | | | | | | | Dezember | | | | | | | | | | | | | ----------+---+---+---+---+---+---+---+---+---+---+---+---+Das müsste man natürlich erweitern bis auf 30 :wink:

MfG, matibaski

edit:
Frage vergessen!
Wie sollte dann die MySQL Tabelle zu diesem Beispiel aussehen?
Ich habe kein Plan :wink:

MfG, matibaski

Ich habe glaube ich einen Ansatz gefunden…

Vielleicht hilft es dir ja, ich werde morgen (heute) nocheinmal dran arbeiten, geh aber jetzt erstma schlafen ^^

[PHP]

<?php /*******************************/ /** Ergebnisse aus DB-Abfrage **/

$haus[mktime(0, 0, 0, 2, 4, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 2, 5, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 2, 6, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 2, 7, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 2, 8, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 29, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 28, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 27, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 28, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 29, date(„Y“))] = 1;
$haus[mktime(0, 0, 0, 12, 30, date(„Y“))] = 1;

/*******************************/

echo „

“;
echo „“;
for($tag=1;$tag<=31;$tag++)
{
echo „<td class="tage">“.$tag.„“;
}
echo „“;
for($monat=1;$monat<=12;$monat++)
{
echo „“;
echo „<td class="monate">“.$monat.„“;
for($tag=1;$tag<=31;$tag++)
{
if(checkdate($monat, $tag, date(„Y“)))
{
$besetzt = false;
foreach($haus as $k=>$v)
{
if($k == mktime(0, 0, 0, $monat, $tag, date(„Y“)) && $v == 1)
$besetzt = true;
}
if($besetzt)
{
echo „<td class="besetzt"> “;
}
else
{
echo „<td class="felder"> “;
}
}
else
{
echo „<td class="kein_tag"> “;
}
}
echo „“;
}
?>

 
[/PHP]

Hallo,

ich bin mir nicht sicher, ob ich dein bisheriges verstanden habe, aber du speicherst doch jeden Tag, oder?

Ich würde mit 2 Tabellen arbeiten.

1 Tabelle für die Häuser / Zimmer mit den Eigenschaften der Häuser

id | anz_zimmer, has_a, has_bund in der zweiten Tabelle die Buchungen mit Start und Ende

id | haus_id | start | endStart und Ende würde ich mit Unix-Timestamps speichern. Dann kannst du einfach abfragen, um wieviel Uhr und an welchem Tag ein Zimmer wieder frei wird.

N43

@Frank:
Danke!
Sowas brauche ich genau…

Doch kannst du mir den Aufbau mal erklären?
Mit folgenden habe ich noch nichts zu tun gehabt:
-mktime (diese nullen und so verwirren mich)
-for
-foreach

Kennst du 'ne Seite die <= oder so erklärt?

Und:
Was für eine Tabelle soll ich machen, für deine Tabelle?
Ich seh nirgends MySQL-Einsätze, die Tabellen hervorruft.

@N43

Wie soll die Tabelle deiner Meinung nach aussehen?
Ich hab da keine Vorstellung unter dieser definition

MfG; matibaski

Wenn ich es richtig verstanden habe hast du x Zimmer bzw. x Häuser.

Dann würde och in der ersten Tabelle die Daten über die Häuser speichern.

id | anz_zimmer | has_a | has_b Die id wird als Schlüssel für die Häuser verwendet und automatisch inkrementiert. In anz_zimmer speicherst du die Anzahl der Zimmer. has_a und has_b sind einfach zwei beliebige Eigenschaften, die ein Haus haben kann. So kann man die Tabelle später auch erweitern, wenn manche Häuser weitere Zusätze bekommen.

In der zweiten Tabelle würde ich Start und Ende einer Buchung speichern.id | haus_id | kunde_id | start | endid ist wieder autoincrement, dann können später Änderungen an der Buchung vorgenommen werden. In haus_id wird die id vom Haus, welches in dem Zeitraum Start-Ende gebucht ist eingetragen. kunde_id brauchste nur, falls du die Kunden auch in der DB verwaltest. In start speicherst du den Zeitpunkt der Anreise als UNIX-Timestamp (wird mit mktime generiert) und in Ende den Zeitpunkt der Abreise.

N43

Gute Idee, nur dass es ein Haus ist, dass mehrere „Wohnungen“ hat.
Ich frage später mal nach, wieviele Zimmer es sind.
Wie würde es da ausschauen?

Das Problem ist, ich verfüge über kein PHPMyAdmin, da ich eine Subdomain als Test verwende. Die richtige Domain hat mein Freund, der mir den Zugriff leider nicht geben will.
Also sollte ich alls über PHP selbst machen.

MfG, matibaski

Hallo,

die Tabelle kannste mit CREATE TABLE über mysql_query erstellen. Wenn du es dir einfach machen willst kannste auch phpMyAdmin bei dir aufm Rechner installieren und da erstmal die Tabelle erstellen. Dann wird dir der verwendetet Query angezeigt.

zu den Schleifen, die funktionieren relativ einfach:

[php]for (startwert; bedingung; schritt) {
// code to be executed
}[/php]In startwert kannst du ner Variablen ihren Startwert geben. Der wird im ersten Schleifendruchlauf verwendet.

In Bedingung gibst du die Bedingung an, wie lange die Schleife ausgeführt werden soll.

Und in schritt gibst du an, was nach jedem Durchlauf geacht werden soll. In der Regel wird hier die Zählvariable erhöht oder erniedrigt.

foreach ist sogar noch einfacher (funktioniert mit Arrays und Objekten):

[php]foreach ($array as $entry)
echo $entry;[/php]Das durchläuft alle Werte im Array der Reihe nach und gibt sie in dem Beispiel aus.

Mit [php]foreach ($array as $key => $entry)
echo $key . ': ’ . $entry;[/php]kannst du über $key auf den Schlüssel des Array-Elements zugreifen und in $entry wie oben auf den Inhalt.

Schau dazu am besten mal auf php.net/foreach und php.net/for

N43

mktime() erstellt aus einem Datum den dazugehörigen Unix-Timestamp. Die 0 sind für die Zeit 0 Sekunden, 0 Minuten, 0 Stunden → also $tag.$monat.$jahr um 0:00:00h

Naja wie gesagt es war ein Ansatz ^^. Das Script erstellt dir halt dynamisch diesen „Kalenderblock“ in dem du die Tage einsetzen kannst.

Da ich ehrlichgesagt die idee von N43 mit Start und End date gut finde, könnte es z.b. so aussehen

MySQL Struktur

id | haus | start | end

id - auto_increment Wert zur identifizierung der Einträge
haus - id zum zuordnen des Eintrages zu einem bestimmten Haus
start - Timestamp für Startzeit
end - Timestamp für Endzeit

Die Abfrage könnte dann z.b. so aussehen
[PHP]

<?php mysql_connect("host","user","pw"); mysql_select_db("database"); $haus_id = 1; //Anzeige für Haus mit der ID 1 zeigen $qry = mysql_query("SELECT start,end FROM table WHERE haus = {$haus_id}"); $i=0; while($row = mysql_fetch_assoc($qry)) { $start = $row["start"]; $end = $row["end"]; while ($start < $end) { $haus[$start] = 1; $start += 60*60*24; } $haus[$end] = 1; $i++; } ?>[/PHP]

BTW: <= heißt kleiner oder gleich

nun ja das script am ende könnte dann so aussehen

[PHP]

<?php mysql_connect("host","user","pw"); mysql_select_db("database"); $haus_id = 1; //Anzeige für Haus mit der ID 1 zeigen $qry = mysql_query("SELECT start,end FROM table WHERE haus = {$haus_id}"); $i=0; while($row = mysql_fetch_assoc($qry)) { $start = $row["start"]; $end = $row["end"]; while ($start < $end) { $haus[$start] = 1; $start += 60*60*24; } $haus[$end] = 1; $i++; } echo ""; echo ""; for($tag=1;$tag<=31;$tag++) { echo ""; } echo ""; for($monat=1;$monat<=12;$monat++) { echo ""; echo ""; for($tag=1;$tag<=31;$tag++) { if(checkdate($monat, $tag, date("Y"))) { $besetzt = false; foreach($haus as $k=>$v) { if($k == mktime(0, 0, 0, $monat, $tag, date("Y")) && $v == 1) $besetzt = true; } if($besetzt) { echo ""; } else { echo ""; } } else { echo ""; } } echo ""; } ?>
 ".$tag."
".$monat."   
[/PHP]

Danke @Frank und N43
Toll, dass ihr es so gut erklärt habt, obwohl ich schon viel über MySQL weiss :wink:
Soviel hättet ihr nicht erklären müssen, aber toll, das man sieht, dass sich noch einige einsetzen :D.

Ich brauchte ja nur einige erklärungen zu Codeteils und die MySQL Tabelle, aber trotzdem danke.

Ich werde den Code heute Abend ausprobieren, und gebe dann noch ein Feedback.

MfG, matibaski

wenn du es heute abend mit einer mysql-tabelle ausprobierst, denk bitte daran, dass die Spalten start und end den jeweiligen timestamp des Datums um 0:00:00 uhr enthalten müssen.

Fragen:
haus - Soll ich da VARCHAR benutzten?
start/end - wie soll das mit timestamp aussehen?
Etwa so? timestamp()

Also es sieht etwa so aus:
[php]

<?php ############################### $host = "localhost"; $user = "---"; $passwort = "---"; $db = "---"; ############################### mysql_connect($host,$user,$passwort) OR die("Verbindung fehlgeschlagen"); mysql_select_db($db) OR die(mysql_error()); $sql = "CREATE TABLE Haus ( ID INT AUTO_INCREMENT PRIMARY KEY, Haus VARCHAR(10), Start TIMESTAMP, End TIMESTAMP ); "; ?>[/php]Mach ich das richtig mit TIMESPTAMP?

Wieso um 0:00:00 Uhr?
Heisst das, dass ich bei jedem Eintrag dies um 0:00:00 Uhr eintragen muss, oder meinst du nur die Tabelle bei der erstellung?

Mfg, matibaski

Die id vom Haus aus der Tabelle mit den Häusern bzw. Wohnungen, also INT

start/end - wie soll das mit timestamp aussehen?
Etwa so? timestamp()
Mit mktime[php]int mktime ($hour, $minute, $second, $month, $day, $year)[/php]zu 0:00:00 Uhr: Wüsst ich auch net warum, kann ja sein, dass die einen um 2 Uhr abreisen und die nächsten um 6 Uhr schon wieder einziehen.

N43

Supper.
Da würde ich nur gerne wissen, für was du die Variablen eingeschrieben hast bei mktime(). Ich lasse sie mal vorläufig da.
Und soll ich bei Haus nur INT schreiben?

[php]
$sql = "CREATE TABLE Haus
(
ID INT AUTO_INCREMENT PRIMARY KEY,
Haus INT,
Start INT mktime ($hour, $minute, $second, $month, $day, $year),
End INT mktime ($hour, $minute, $second, $month, $day, $year)
);
";[/php]MfG, matibaski

edit:
Kannst du mir mal den Code so schreiben, damit er vollständig ist?
So lerne ich übrigens schneller :wink:

Hallo,

beim Erstellen der Tabelle für Start und End einfach nur INT(11) nehmen, bei der id auch. Die 11 gibt die Anzahl der Stellen an (muss glaube ich mit angegeben werden) und der Timestamp hat maximal 11 Stellen, damit reicht er bis 2030 oder so.

N43

zu 0:00:00 Uhr: Wüsst ich auch net warum, kann ja sein, dass die einen um 2 Uhr abreisen und die nächsten um 6 Uhr schon wieder einziehen.

naja so ausgeklügelt ist das script nun auch wieder net das script vergleicht den timestamp des feldes mit den timestamps aus der Datenbank.

Dieser timestamp der verglichen wird, muss exakt gleich sein mit dem aus der db damit das feld als besetzt markiert wird. Und der Timestamp des Datums wird erstellt und zwar für 0:00:00h

wenn du also den timestamp nimmst der aber von der Uhrzeit her um z.b. 14:00:00h ist, so wird das feld nicht markiert

er würde dann nämliches folgendes machen
[PHP]
if(„27.03.2007 0:0:0 uhr“ == „27.03.2007 14:0:0 uhr“)
[/PHP]
und das ergibt dann false

Ja ich könnte bei Start und End einfach nur Datum benutzen. und wenn man das Datum eingeschrieben hat, dann trägt sie der Verwalter in die DB per einem Tool (mache ich noch später).
Also wäre es eigentlich egal, was die Stunden und Minuten betrifft.
Ich mach’s dann irgendwie so, dass es heisst: Abreisetag (ein Bild), Anreisetag(anderes Bild).

MfG, matibaski