MySQL-Abfrage für einen PHP-Terminkalender langsam

...komplette Frage anzeigen

3 Antworten

Hello there,

mir ist nicht ganz klar, was du dann bei deinen Querys überhaupt ausgeben lassen willst. Eins vorweg, die Ausrede, dass du Datum und Zeit getrennt verwertest, kann man eigentlich nicht zählen lassen ;) Du musst in jedem Fall erstmal kucken, dass du Startzeit und Startdatum bzw Ende jeweils in einem Timestamp oder einem DateTime-Objekt verpackst. Das spart schonmal zwei Spalten in der Datenbanktabelle. Du kannst dennoch isoliert auf Datum und Zeit zugreifen, nämlich so (beispielsweise):

SELECT Time(Start) FROM Kalender WHERE ID = 2;
SELECT Date(Ende) FROM Kalender WHERE ID = 19;

Ich bin mir aber noch nicht ganz sicher, was du machen willst. Wenn ichs richtig verstehe, machst du aber auf jeden Fall den Fehler, dass du für jede einzelne Zelle ne Abfrage laufen lässt. Das ist etwas komisch. Ich würde das eher so machen, dass du dir die ganzen Daten auf einmal holst und sie dann in ner while-Schleife in PHP abklapperst. Die werden ja dann über

while($row = $datenbank->fetch_array($result)
{

}

eh automatisch erstmal innem Array gespeichert

Kannst du mal zeigen, wie eine exemplarische Abfrage bei dir derzeit aussieht? Ganz steig ich noch nicht durch.

MfG

Alex

KingRhobar 13.03.2014, 11:12
$getTermin=mysql_query("SELECT * FROM termine WHERE standort='".$standort."' AND raum='".$_GET['raumid']."' AND startdate >= '".$kwDatumAnf."' AND startdate <= '".$kwDatumEnd."'");
while($res=mysql_fetch_array($getTermin, MYSQL_ASSOC))
$termine[]=$res;

Ich hab inzwischen schon einen Teil der Daten die ich benötige vorgeladen.

Zur kurzen Erläuterung: Im Kalender lasse ich mir immer eine bestimmte Kalenderwoche anzeigen. In der MySQL Abfrage hole ich alle Termine dessen Starttermin innerhalb der aktuellen Woche liegt.

Dazu noch anderer Kram, da es mehrer Standorte mit mehreren Räumen geben wird, an denen der Planer benutzt werden soll.

Hatte nicht erwartet das ich vorher so viel vorladen muss, da jeder Termin auch noch Daten aus anderen Tabellen anzeigen muss, die ich mit ID's referenziere

0
KingRhobar 13.03.2014, 11:52
@KingRhobar

andererseits sollte ich mich nochmal mehr mit den MySQL Grundfunktionen auseinandersetzen. Ich weiß das ich mit einer einzelnen SELECT-Abfrage Daten aus einer Tabelle basierend auf den Einträgen einer anderen (in meinem Fall die ID) holen kann, nur nicht mehr genau wie ^^"

0
KingRhobar 13.03.2014, 13:49
@KingRhobar

Habs raus, das wäre mein Ziel gewesen:

select terminCon.*, termine.lehrer as lid, lehrer.name as lehrer,  CONCAT(kunden.name, ", ", kunden.vorname) as name, termine.startdate, termine.enddate, termine.starttime, termine.endtime from terminCon 
INNER JOIN kunden on kunden.id = terminCon.kid 
INNER JOIN termine on termine.id = terminCon.tid 
inner join lehrer on termine.lehrer = lehrer.id;

MySQL abfragen ziehen sich ganz schön in die Länge hinaus :/

0
Alextoexplain 13.03.2014, 15:59
@KingRhobar

Ich will ja nicht unken, aber ich würd die Daten die du aus $_GET kriegst erstmal escapen bevor du sie in die Tabelle einträgst. Sonst machst du deine Datenbank anfällig für SQL-Injections >:O

0

Verstehe ich das richtig, dass du für jede Zelle ein entsprechendes Äquivalent in der Datenbank hast? Wie ist denn deine Datenbank und das Script aufgebaut?

Ohne diese Infos lassen sich nur wenige Infos zur optimierung geben.

Allgemein gilt:

  • Darauf achten, dass die PK-Felder gut gesetzt sind und indiziert werden.
  • Die Normalformen beachten und einhalten.
  • nicht mehr abfragen als man braucht

LG Sedd

KingRhobar 11.03.2014, 16:47

Ich habe einen Kalender, der von Montag bis Samstag jeweils von 10-22Uhr in 15 Minuten Schritten als Tabelle dargestellt wird, das geschieht ganz ohne Datenbank

+-----------+---------+------+-----+---------+----------------+
 Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
 id        | int(11) | NO   | PRI | NULL    | auto_increment |
 startdate | date    | YES  |     | NULL    |                |
 enddate   | date    | YES  |     | NULL    |                |
 starttime | time    | YES  |     | NULL    |                |
 endtime   | time    | YES  |     | NULL    |                |
 standort  | int(11) | YES  |     | NULL    |                |
 lehrer    | int(11) | YES  |     | NULL    |                |
 raum      | int(11) | NO   |     | 0       |                |
+-----------+---------+------+-----+---------+----------------+

standort, lehrer und raum referenzieren die IDs anderer Tabellen, FK hab ich bis jetzt noch nicht gesetzt, MySQL ist nicht mein Hauptgebiet, und wenn es so funktioniert wie ichs mache, halte ich mich daran

In meiner im Script generierten Tabelle habe ich das Datum jedes einzelnen Wochentages, und die Zeit jeder Zelle zur verfügung.

In jeder Zelle etwas abzufragen war nicht so intelligent, deswegen mache ich grade den umweg das ich erst einmal alles in einem Array speicher, und dieses dann in jeder Zelle auswerten lasse.

Hoffe das war jetzt etwas deutlicher.

0

du solltest dir einfach alle termine in der woche holen und dann nach den Terminen deine Tabelle aufbauen.

außerdem solltest du wohl deine speicherung der Termin auf das Format datetime umstellen.

PS: du bist nicht der einzige der diesen logikfehler gemacht hat, ich hatte bei meinem 1. Sendeplan den ich für ein Internetradio geschrieben hab, dasselbe problem ;-)

allerdings nur stundenweise :D

KingRhobar 11.03.2014, 16:50

Da ich das Datum und die Zeit getrennt verwerte, habe ich sie auch getrennt abgespeichert. Wollte nicht unbedingt erst die Ausgabe splitten um an die Zeit ranzukommen.

Es geht ja um die Zeitraum jedes Tages des gesamten Zeitraums des Serientermins. Sprich jeweils Montag Dienstag Mittwoch soll von 14:30-15:30 ein Event stattfinden

0
cat64k 13.03.2014, 06:51
@KingRhobar

und was machst du wenn du zum Beispiel einen Termin eintragen willst der in etwa so aussieht:

Startzeit: mittwoch, 31.12.2014 21:00 Uhr Endzeit: Donnerstag 01.01.2015 06:00 Uhr Was: Silvesterparty bei Hans Müller

0
KingRhobar 13.03.2014, 10:46
@cat64k

Hm, solche Sachen werden bei mir nicht passieren, deswegen hab ichs auch nicht beachtet.

In dem Kalender sollen Unterrichtstermine eingetragen werden, die können nur von 10:00-22:00 stattfinden, dafür aber auch an mehreren Tagen zur gleichen Uhrzeit.

0

Was möchtest Du wissen?