CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos

|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP 
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |

10.04.2006, 13:51:18
|
Junior Member
|
|
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
|
|
AW: Nach zwei Werten in einer Spalte filtern
Hi,
ist kein Problem.
Du kannst mit PHP auch (fast) alles machen, aber es ist halt nicht immer ganz einfach.
Das Problem, das sehr sehr viele Leute bei DB gestützten Projekten haben, ist nicht die Programmierung an sich sondern eher das nicht (gut bzw. zu Ende) durchdachte Datenbank- Design.
Irgendwann während der Projektlaufzeit merken sie, daß sie Daten entweder nicht in die Datenbank bekommen oder diese nicht mehr (korrekt bzw. einfach) auslesen können.
Wenn dies kurz vor Ende geschieht ist es übel und es kommen nur halbgare Lösungen raus. Insofern hoffe ich, daß Du noch am Projektanfang bist.
Also: Kopf hoch und DB- Design anschauen bzw. ändern.
Wenn Du einen ersten (neuen) Entwurf hast kannst Du ihn ja posten und qualitätssichern lassen.
Gruß,
Andy
|

12.04.2006, 10:43:43
|
Junior Member
|
|
Registriert seit: Dec 2005
Alter: 50
Beiträge: 236
|
|
AW: Nach zwei Werten in einer Spalte filtern
Hy taucher,
also ich habe es nun etwas anders gelöst, funktiniert bis auf eine Kleinigkeit.
Aber erstmal der Code:
PHP-Code:
<?php
error_reporting(E_ALL);
include '../scripts/config.php';
include '../scripts/l_helpers.inc.php';
// if (logged_in()){ // Konfigurationsdatei laden
// parentmenu, menupunkt, menustart oder startmenu
if (isset($_GET['menupunkt']))
{
$Menupunkt=$_GET['menupunkt'];
}
$link=mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
$sql_query_flaeche = "select distinct MENUPUNKT from forminhalt where formular='inhalt_raumx.html' and FELDNAME='raumgrundflaeche';";
$sql_query_ort = "select distinct MENUPUNKT from forminhalt where formular='inhalt_raumx.html' and Wert='Alverskirchen';";
$sql_query_gebaeude = "select distinct MENUPUNKT from forminhalt where formular='inhalt_raumx.html' and Wert='Grundschule';";
$sql_query_etage = "select distinct MENUPUNKT from forminhalt where formular='inhalt_raumx.html' and WERT='KG';";
$ms_query_flaeche = mysql_query($sql_query_flaeche);
$ms_query_ort = mysql_query($sql_query_ort);
$ms_query_gebaeude = mysql_query($sql_query_gebaeude);
$ms_query_etage = mysql_query($sql_query_etage);
while ($ausgabe_flaeche = mysql_fetch_array($ms_query_flaeche))
$ausgabefeld_flaeche[] = $ausgabe_flaeche['MENUPUNKT'];
while ($ausgabe_ort = mysql_fetch_array($ms_query_ort))
$ausgabefeld_ort[] = $ausgabe_ort['MENUPUNKT'];
while ($ausgabe_gebaeude = mysql_fetch_array($ms_query_gebaeude))
$ausgabefeld_gebaeude[] = $ausgabe_gebaeude['MENUPUNKT'];
while ($ausgabe_etage = mysql_fetch_array($ms_query_etage))
$ausgabefeld_etage[] = $ausgabe_etage['MENUPUNKT'];
echo"<br><hr>Einzelarrayauswerung<hr><br>";
for($i = 0; $i < sizeof($ausgabefeld_flaeche);$i++)
{
echo "<br>".$i.". : ".$ausgabefeld_flaeche[$i];
}
echo "<hr><hr>";
for($i = 0; $i < sizeof($ausgabefeld_ort);$i++)
{
echo "<br>".$i.". : ".$ausgabefeld_ort[$i];
}
echo "<hr><hr>";
for($i = 0; $i < sizeof($ausgabefeld_gebaeude);$i++)
{
echo "<br>".$i.". : ".$ausgabefeld_gebaeude[$i];
}
echo "<hr><hr>";
for($i = 0; $i < sizeof($ausgabefeld_etage);$i++)
{
echo "<br>".$i.". : ".$ausgabefeld_etage[$i];
}
echo "<hr><hr>";
$newArray = array_intersect($ausgabefeld_flaeche,$ausgabefeld_ort,$ausgabefeld_gebaeude,$ausgabefeld_etage);
$aktuellerWert=0;
foreach($newArray as $value)
{
// bei jedem Schleifendurchlauf steht eine neue ID aus $newArray in $value
$sql_summe_schnittmenge = "SELECT WERT FROM forminhalt WHERE FELDNAME='raumgrundflaeche' AND MENUPUNKT='".$value."';";
$result = mysql_query($sql_summe_schnittmenge);
//$aktuellerWert += @mysql_result($result,0,"WERT");
$ausgabefeld_gesammtflaeche = mysql_fetch_array($result);
$flaechenfeld[] = $ausgabefeld_gesammtflaeche['WERT'];
}
$summenflaeche = array_sum($flaechenfeld);
echo "<br>Aktueller Wert: ".$summenflaeche;
Also grob gesagt, für die Fläche, das gebäude , den ort, die etage die $MENUPUNKTe in ein Array, aus den 4 Arrays die Schnittmenge und dann mit foreach mit den einzelnen MENUSTART als where bedingung die Flächen aus der DB holen. Tut auch. Habe mir die Arraywerte aus newArray ausgeben lassen => passt. Die Wert werden mir mit Echo korrekt angegeben. zB 12,34 45,62 9,8,...
Aber wenn ich dann summiere, schneidet er mir bei allen Werten die Nachkommastzellen ab. Das heisst er zeigt 12,34 45,62 9,8 an, summiert aber nur 12 + 45 + 9. Habe auch schon mit stringreplace und number_format versucht, die zahlen in die englische Schreibweise zu bringen, ohne Erfolg. Hast Du vielleicht einen letzten Hinweis und natürlich einen Qualitäts-Check zur Lösung. ;- ))
Vermute der Fehler liegt darin, dass ich die Wert-Spalte als Text definiert habe.
mfG
tsunamitsunami
Geändert von tsunamitsunami (12.04.2006 um 11:12:01 Uhr)
|

12.04.2006, 13:04:32
|
Junior Member
|
|
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
|
|
AW: Nach zwei Werten in einer Spalte filtern
Hi tsunamitsunami,
sorry, aber ich bezweifle (immer noch), daß Deine Lösung mit den im Posting vom 10-04-2006 um 08:38 genannten Werten funktioniert.
Dort hattest Du für den Raum EG 0.15 den Menupunkt 335, für den Raum EG 0.16 den Menupunkt 336.
Für den Ort Alverskirchen sowie das Gebäude Grundschule hast Du den Menupunkt 335 angegeben.
Wie willst Du den Raum EG 0.16 mit der Grundschule verknüpfen?? Über Menupunkt 335 geht es nicht.
Bei Deiner aktuellen Lösung liest Du, wie Du geschrieben hast, sämtliche IDs (Menupunkt) aus, die zu einer "Wertekategorie" ("Alverskirchen", "Grundschule",...) gehören. Anschließend holst Du Dir die Schnittmenge der Menupunkte raus, sprich die IDs, die in jeder der einzelnen "Wertekategorien" enthalten sind. Korrekt verstanden?
Falls ja: Die 336 für den Raum EG 0.16 darf eigentlich im Ergebnis nicht mehr dabei sein, da "Alverskirchen" nur den Menupunkt 335 hat.
Damit es funktioniert, muß "Alverskirchen" auch noch einen Eintrag mit dem Menupunkt 336 haben.
Sprich: Das, was Du so umständlich mit der Schnittmenge der Menupunkt-IDs machst, solltest Du eigentlich auch mit meinem SQL können, den ich Dir gepostet hatte. Falls nicht, was klappt dabei nicht??
Aber jetzt mal ein paar Fragen, die Du Dir auch stellen solltest:
- Was passiert, wenn Du zusätzlich zur Grundschule 1 in Alverskirchen eine zweite Grundschule im gleichen Ort hast?
Entweder Du speicherst dann wieder alle Daten für die neue Grundschule mit einer anderen Menupunkt-ID ab, oder es kommt zu Verwechselungen ("zu welcher Schule gehört noch mal der Raum 3.16??")
- Was passiert, wenn es im gleichen Ort eine andere Schule hat, z.B. eine Realschule? Auch hier musst Du den Ort nochmals abspeichern, oder Du bekommst wieder Probleme.
Kurz und gut: Bitte überlege Dir sehr sehr gut, ob Du mit diesem DB- Design weitermachen willst. Ich sowie (hoffentlich) die Meisten, die etwas mit Datenbanken zu tun haben, können Dir nur davon abraten.
Du hast eine n:m Beziehung zwischen Schule, Etagen und Zimmern (1 Schule kann mehrere Etagen haben, die wiederum mehrere Zimmer haben) und das legt man nicht in einer einzigen Tabelle ab. Sinnvoller sind 3 Tabellen, eine, in der Du die Grunddaten zur Schule wie Adresse (und eventuell Ort) ablegst, eine, in der Du die Zimmer (zusammen mit den Etagen) abspeicherst und eine dritte, über die Du Schule und Zimmer miteinander verbindest, indem Du dort für jedes Zimmer mindestens folgendes abspeicherst: id der Schule sowie id des Zimmers.
Du kannst dann noch die Orte (sowie Länder) sowie andere, immer wieder vorkommende Daten, in (eine) weitere Tabelle(n) auslagern, wenn Du es ganz genau machen willst, das ist aber nicht unbedingt nötig.
Wenn Du alles mit weniger Tabellen machen willst benötigst Du immer noch zwei, eine, in der Du die Grunddaten abspeicherst (id, feldname, wert) und eine, über die Du verknüpfst.
Bsp. hierzu:
grunddaten (felder id, feldname, wert)
1, ort, Alverskirchen
2, gebäude, Grundschule
3, gebäude, Realschule
4, Raum, 0.16
5, Grundfläche, 25.6
6, Raum, 3.18
beziehungen (id, bezug, id2)
1, hatgebaeude, 2
1, hatgebaeude, 3
2, hatraum, 4
4, hatflaeche, 5
3, hatraum, 6
Bzgl. des Additionsfehlers denke ich auch, daß es am falschen Datentyp liegt. Hier solltest Du mal nach entsprechenden (PHP)- Funktionen schauen, um aus einem CHAR- Typ einen INT- Typ zu machen. Hier kann ich Dir momentan leider auch nicht helfen, sorry.
Eventuell geht dies schon direkt aus MySQL heraus. Schau mal, ob es eine CAST- bzw. CONVERT- Funktion gibt und wende diese beim Auslesen der Raumgröße an.
HTH,
Andy, der Dir mit seinem Beharren auf korrekte(re)s Datenbank-Design nicht auf die Nerven gehen will, sondern Dich vor zukünftigen Problemen bewahren will ;-)
|

13.04.2006, 08:45:15
|
Junior Member
|
|
Registriert seit: Dec 2005
Alter: 50
Beiträge: 236
|
|
AW: Nach zwei Werten in einer Spalte filtern
Hy,
erstmal ein fettes Dankeschön für Deine Mühen!!!
Zu Deiner sql-Lösung:
Ehrlich gesagt habe ich icht verstanden was da passiert. Zudem floß vielleicht auch etwas Ehrgeiz mit rein, da ich so meine Idee mit der Schnittmege etwas mit einfließen lassen konnte. Weil das habe ich verstanden.
Zum DBdesign:
Leider kann ich das nicht entscheiden. Zudem ist schon etliches drin. Des Weiteren habe ich sowas auch schon mal angemerkt, vor längerer Zeit schon, ob man das nicht ändern sollte. Mittlerweile bin ich aber der Meinung, das eine Umstellung fast unmöglich ist. Ich hatte auch mal vorgeschlagen, dass man die Spalten und Reihen vertauscht, so dass in einer Zeile dann zB
ID Raumname Raumnummer Raumfläche Raumhöhe Raumvolumen Personen Ort Gebäude Menupunkt Kunde Temperatur Stand Kommentar
stehen würde. Das heisst eine Tabelle nur für Räume. Nur dann kann ich diese Tabelle wirklich nur für Räume nehmen. Nur dann habe ich ein Problem mit meinen Formularen, welche die Daten generell an ein speichern.php übergeben sollen. Das speichern.php speichert so grundsätzlich in eine Tabelle forminhalt.
Wenn ich für jeden Form-Typ eine eigne Tabelle nehmen würde, ginge die Dynamik flöten. Denn dann müsste ich entweder massig ifs-abfragen (if typ=raum dann , if typ=fenster, dann , if typ=kunde, dann, if typ=gebäude dann, if typ=etage dann,....)
Und dann kommt ein neuer Typ und ich müsste wieder an die Scripte dran.
Packe ich alles in eine Tabelle, hab eich das Problem, dass die Formularfeldanzahöl variiert, bei Räumen brauche ich 12, beim Fenster 8, beim Gebäude nur 5.
Aber gut das primäre Ziel habe ich erreicht. Nun muß ich sehen, wie ichs einhänge, weil so muß ich Ort und Gebäude nach wie vor vorgeben.
Schöne Feiertage
tsunanmitsunami
der sich wege Deiner zahlreichen Hinweise zur DBNeustrukturierung keineswegs genervs fühlte, sonern eher beeindruckt, wg. der Mühe und Hartnäckigkeit" ;- )
|

13.04.2006, 09:57:49
|
Junior Member
|
|
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
|
|
AW: Nach zwei Werten in einer Spalte filtern
Hi tsunamitsunami,
zuerst mal ein großes ACHTUNG: Ich hab' mich bei meiner Aussage bzgl. n:m- Beziehung (teilweise) vertan.
Es stimmt, daß es eine n:m- Beziehung zwischen Schule-Etage-Raum gibt, aber es macht keinen großen Sinn, dies wirklich in 3 Tabellen abzulegen.
Hier reicht es, zwei Tabellen, "schule" mit (Orts-) Daten zur Schule, und raeume mit Daten zum Raum MIT Etage zu speichern. Sprich das ganze als 1:n Beziehung zu designen. (Orte in eine dritte Tabelle auslagern, wenn möglich).
Soviel zur Klarstellung für alle die, die den Thread hier verfolgen!
Jetzt zur Erklärung meines SQLs:
Code:
SELECT t4.wert # eventuell geht hier sogar SUM(t1.wert), ausprobieren!!
FROM tabelle AS t1 # "tabelle" durch Tabellennamen ersetzten
INNER JOIN tabelle AS t2 ON t1.menupunkt = t2.menupunkt
INNER JOIN tabelle AS t3 ON t2.menupunkt = t3.menupunkt
INNER JOIN tabelle AS t4 ON t3.menupunkt = t4.menupunkt
WHERE t1.feldname = 'raumort' AND t1.wert = 'Alverskirchen'
AND t2.feldname = 'raumgebaeude' AND t2.wert = 'Grundschule'
AND t3.feldname = 'raumgeschoss' AND t3.wert = 'EG'
AND t4.feldname = 'raumgrundflaeche' # oder = 'raumquadratmeter'
Deine Werte sind über die Spalte "menupunkt" miteinander verknüpft, sprich: Alle Informationen, die zu einem Raum in einem Gebäude und einem Ort gehören, haben den selben "menupunkt". Dies ist nicht schön, da Du hierfür den Ort sowie Schulnamen etc. mehrfach abspeichern musst. Aber so ist es halt im Moment.
Um jetzt alle Rauminhalte in einem Gebäude und auf einer Etage zu bekommen fängt man damit an, daß man als Einstiegsbedingung (sprich im WHERE- Teil des SQLs) das Gebäude sowie die Etage definiert (WHERE t1.feldname = 'raumort' AND t1.wert = 'Alverskirchen' ... AND t2.wert = "Grundschule" ... AND...).
Da diese Werte aber nicht in unterschiedlichen Tabellen bzw. Spalten liegen muss man jetzt die Tabelle mehrfach(*) mit sich selber JOINen. Da die Datenbank bei mehreren gleichnamigen Spalten in einem SQL Befehl nicht wissen kann, zu welcher Tabelle diese gehört muß man für die jeweiligen Tabellen einen Alias (... AS t1 ... AS t2 ...) vergeben.
(*): Mehrfach: Man muss die Tabelle (mindestens) so oft mit sich selber JOINen, bis man sämtliche Ausgangswerte, die man zur Bestimmung des richtigen Gebäudes benötigt, eingeben kann.
Als Ergebnis des SELECTs kann man sich dann jeden in einer der verwendeten Tabellen vorkommenden Spaltenwert ausgeben lassen, wobei in diesem Fall nur der Wert der zuletzt verknüpften Tabelle (hier: t4) interessant ist.
Als allgemeinen Tip zum Testen von SQLs, die etwas komplizierter aussehen, kann ich Dir raten, zuerst zwei Tabellen miteinander zu JOINen und sich sämtliche Werte, die in diesen Tabellen enthalten sind, ausgeben zu lassen. Anschließend dann eine weitere Tabelle dazu nehmen etc. pp.
So, das wars jetzt aber von mir zu diesem Thread.
Dir ebenso Frohe Ostern und Viel Glück beim Überzeugen der Auftraggeber(?), daß es manchmal sinnvoller ist, ein falsches Datenbank- Design zu ändern, als weiter "ins Unglück" zu reiten.
Gruß,
Andy
P.S.: Alles in eine flache Tabelle zu tun ist auch nicht so intelligent, besser mindestens die Gebäude mit Orten in eine zweite Tabelle auslagern (was machst Du lieber, wenn sich der Name der Schule von "Hugo- Schule" in "Karl- Schule" ändert und diese 200 Räume hat? 200 Datensätze ändern oder nur einen?
Geändert von diver-network (13.04.2006 um 09:58:21 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 20:56:01 Uhr.
|