Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Problem mit Verabeitung eines Arrays

Hallo, ich versuche mit folgendem Code die Anzahl von bestimmten Noten zu ermitteln:

Code:                   In Zwischenablage kopieren (nur IE)
1">

In der Tabelle "Ergebnisse" sind die Teilnehmer, die Noten und die UIDs von den Klausuren gespeichert. Der Datentyp für die Spalte "Noten" habe ich auf DECIMAL(2,1) gestellt.
In der Tabelle "Klausuren" sind neben Bezeichnung usw. auch das obere Array als Spalten angelegt, d.h. die Spalte, die zur Note 2.7 gehört heisst auch 2.7. Das Script läuft ohne Probleme durch, aber die Spalten für die Noten in der Tabelle "Klausuren" bleiben leer. Woran kann das liegen?

Wenn ich folgendes:
Code:                   In Zwischenablage kopieren (nur IE)
2">

vor die Query packe liest er komischerweise nur die ganzzahligen Noten aus ... muss wohl doch ein Fehler im Datentyp sein?
Hier gehts zum Orginal Eintrag "Problem mit Verabeitung eines Arrays" im Forum

Antworten

MySQL verwendet einen Punkt um Datenbankname, Tabellenname und Spaltenname voneineander zu trennen. Du verwendest einen Punkt in deiner UPDATE-Anweisung als Spaltennamen. Um das daraus resltierende Problem zu beheben kannst du entweder vernünftige Spaltennamen verwenden, oder Splatennamen in Backticks (`) einschließen.


2.

Hmm .... und wie löse ich das Problem dann? Die Dezimalwerte werden in der DB eben auch mit einem Punkt gespeichert.
Ausserdem erklärt das nicht, warum er den bei dem echo-Befehl nur die ganzzahligen Werte ausliest.


3.

abgesehen davon kannst du aus der tabelle doch direkt die anzahl der einzelnen noten ausgeben lassen:
Code:                   In Zwischenablage kopieren (nur IE)
3">




4.

Zitat:
n der Tabelle "Klausuren" sind neben Bezeichnung usw. auch das obere Array als Spalten angelegt, d.h. die Spalte, die zur Note 2.7 gehört heisst auch 2.7.
1) In Deinem Query gibt es KEINE Tabelle Klausuren, sondern nur $prefix."Klausuren" - schon mal Scheiße.
2) "neben Bezeichung" - wie wo wer was ist "neben Bezeichnung"? Welche Bezeichung wo wann wieso gegen wen warum? Also auch Schrott.
3) Spalten mit Namen a la 2.3 oder so - grauenhaftest! Welche Semantik steckt dahinter? Keine - auch Schrott!
4)
Zitat:
"Das Script läuft ohne Probleme durch, aber die Spalten für die Noten in der Tabelle "Klausuren" bleiben leer. Woran kann das liegen?"
Das liegt daran, dass es keine Tabelle "Klausuren" gibt (s.o.) und auch daran, dass das ganze Design für die Mülltonne ist.

Erzähl uns doch besser mal, was Du in Wirklichkeit gerne hättest, vielleicht bekommen wir es ja noch umgebogen - im Moment ist es gruselig ... gruselig schlecht!


5.

Danke für den Tipp alexander ... ich hab gar nicht gewusst, dass es so eine Funktion gibt, darum hab ich es auf die umständliche Art gemacht.

@ Rana: Sei mal nicht so gemein ... jeder muss mal anfangen mit dem Kram. Ich weiß selber, dass mein Stil nicht der Bringer ist, aber für eine Woche autodidaktisches PHP-lernen finde ich es nicht schlecht. Zum Script:
Der gepostete Code war natürlich nur ein Auszug aus dem Script, d.h. die Variable $prefix wurde schon definiert und die Tabelle heisst auch ensprechend. Ich poste jetzt einfach mal meine 2 Scripte und bin für Verbesserungen sehr dankbar:

ergebnisse.php:
Code:                   In Zwischenablage kopieren (nur IE)
4">

klausuren.php:
Code:                   In Zwischenablage kopieren (nur IE)
5">

In der includes/config.php sind logischerweise die DB.Daten und der Tabellen-Präfix gespeichert.
Hier noch die Datenbankstruktur:
Code:                   In Zwischenablage kopieren (nur IE)
6">

Wie ihr seht, ist das Script noch nicht wirklich fertig. Ein paar Fragen hätte ich noch zum Verständnis unabhängig von Euren Tipps: Wie bekomme ich die Anzahl der nicht erschienenden Teilnehmer heraus? Wie ihr sehr habe ich diesen Teil im ersten Script auskommentiert ... ich habe nicht wirklich eine funktionierende Funktion dafür gefunden. Ausserdem wäre es super, wenn das zweite Script erkennen würde, welche Klausur es schon geparst hat. Daran habe ich mich noch nicht probiert. Ich kann das ja nicht anhand der UIDs der Klausuren machen, da die Daten ja von einem externen Webserver kommen. Nur anhand der Prüfungs-ID geht auch nicht, weil die sich jedes Semester wiederholen. Bleibt nur noch die Möglichkeit eine Kombination aus ID und Prüfungsdatum zu verwenden - allein an der Umsetzung hapert ;-)
Als letztes wäre auch noch interessant, wie man das Script vollautomatisiert dazu bringt Übersichtsseiten zu laden. Bis jetzt habe ich das ja in die Variablen $semester und $semester_short geschrieben. Man könnte das natürlich dann auch in ein Array packen und dann durch ne Schleife jagen, aber das muss doch auch anders gehen. Vielleicht nocht ein Hinweis: Das ganze Ding soll irgendwann mal per Cronjob einmal täglich angestoßen werden. Das Frontend kommt irgendwann später mal ;-) Soll dann ungefähr folgende Funktionalität erfüllen ... vielleicht noch mit ner grafischen Auswertung: http://noten.linge.net/index.php <-- da finde ich leider den Autor des Scripts nicht - sonst wäre vieles leichter ;-)
Hoffentlich habt ihr ein paar gute Tipps für eine PHP-Einsteiger wie mich. Der grottige Syntax und die "gruslige" Semantik sei mir verziehen - aber auch hier bin ich natürlich dankbar für Verbesserungsvorschläge.


6.

Es ist und bleibt gruselig.

Leider erklärst Du nach wie vor nicht den Sinn von $prefix - macht es für Außenstehenden noch einmal unnötig schwerer.

Fakt ist, dass eine Tabelle mit diesen Feldern (1.0,1.3 usw.) der ABSOLUTE SUPERMÜLL ist und es ist dringend erforderlich, dass Du uns "erzählst", was eigentlich Sinn des Scripts sein soll. So oder so ist die o.g. Tabelle wirklich vollständig "daneben".

Das Problem ist dabei weniger der PHP-Code, sonder mehr das total kaputte Datendesign - letzteres gilt es zu korrigieren, das PHP Script ergibt sich dann automatisch.


7.

Ein Prefix ist ein Prefix ... der macht nix, der tut keinem was, der exisitiert nur ;-) Den habe ich nur definiert, damit ich in die eine Datenbank noch andere Tabellen (z.B. von anderen Scripten) anlegen kann ohne durcheinander zu kommen. Der Prefix ist in diesem Fall "uni_" ... d.h. die Tabellen heissen "uni_klausuren" und "uni_ergebnisse", wie man auch oben sehen kann. Das mit den komischen Spalten (1.0,1.3, usw.) ist ja mittlerweile bei mir angekommen, dass es wohl nicht ganz optimal gelöst ist. Die Frage ist, wie kann ich es besser machen? Und den Sinn des Scripts habe ich doch eben erläutert und sogar noch einen Link dazu gepostet, wo Du meine Zielstellung siehst. Aber erstmal brauch ich den ganzen Datensumpf in der DB, bevor ich mich ans Frontend mache - das wird aber wohl weniger eine Schwierigkeit sein, da ich ja dann nur noch die Daten auslesen und in ein Design pressen muss.


8.

Machs doch so:
eine Tabelle mit den Userdaten - mit Spalten für Name, ID, Klausuranmeldungen,
und eine Tabelle mit den Klausurergebnissen, je eine Spalte für die KlausurID,
alle angemeldeten User, alle teilgenommenen User und die Noten.

So hast Du zwei Tabellen die miteinander verknüpft sind und kannst alles Abfragen.

Es läßt sich sio auch leicht der Notendurchschnitt je Klausur, je User etc. berechnen.


9.

Zitat:
Ein Prefix ist ein Prefix ... der macht nix, der tut keinem was, der exisitiert nur ;-)
Du musst lernen, richtige Problembeschreibungen abzuliefern, Du kannst Dir offensichtlich nicht im Ansatz vorstellen, wie schwer es ist, einen Code zu debuggen, den man nicht sieht, dessen Funktion man nicht kennt und dessen technische Umsetzung man nicht kennt. Wir kennen nichts - Du kennst alles und kannst es dennoch nicht lösen!

Wenn der $prefix eine Rolle spielt (und das tut er - ein $prefix ist nicht "nur" ein Prefix, sondern Du hast also schon einmal n Tabellen anstatt einer einzigen Tabelle - das kann bereits eine Fehlerursache sein), dann mußt Du das auch schreiben. Wenn Problembeschreibung und der gezeigte Code NICHT übereinstimmen (wie hier!), dann ist es vollständig unmöglich, Hilfe zu geben.
Zitat:
Und den Sinn des Scripts habe ich doch eben erläutert
Ne, leider nicht. Dir mag (wie üblich) alles selbstverständlich erscheinen - wir wissen nach wie vor nicht, was Sinn Deiner Anwendung ist. Zeige mir die Stelle, wo der Sinn erklärt wird (nicht die Stelle mit dem Cronjob - das ist nicht der Sinn, sondern eine technische Umsetzung).

Ich rate jetzt: Du möchtest eine irgendwie geartete Statistik führen, wie irgendwelche Klausurergebnisse ausgefallen sind? In der Tabelle "uni_klausuren" scheint irgendwie bereits eine Statistik drin zu stehen (wie auch immer sie ermittelt wurde) - ist das richtig?

Das wäre dann im Prinzip der erste Kardinalfehler, denn gerade die statistische Betrachtung erfolgt dynamisch (wie SELECTs mit entsprechenden Gruppierungen etc.) und nicht "statisch" in einer Tabelle.

Ich rate weiter und erstelle ein Datenmodell:

1) Die erste Entität ist (wie anders) der Student. Mit Adressdaten, Alter, Schönheit, Matrikelnummer usw.
2) Die zweite Entität ist (abstrakt) "Dozent" - dort werden die Profs, Assessoren, akademischen Räte usw. aufgeführt, die Vorlesungen halten.
3) Die dritte Entität ist "Vorlesung" (vielleicht auch Fach?) - da stellt sich bereits die Frage, ob man in diese Tabelle bereits das Semester aufnimmt (als Attribut), oder ab man abstrakt ein Fach definiert und eine weitere Relation (sprich man braucht noch eine Entität "Semester" o,ä.) definiert. Das muss man entscheiden daran, ob es ggf. noch mehr Entitäten gibt, die ggf. auch einen Verweis auf die Entität "Semester" benötigen.
Zunächst würde ich es mit einem Attribut versuchen - ein weiteres Attribut ist dann ein Verweis auf den Dozent.
4) Studenten haben eine m:n Relation zu Vorlesung - jeder Student besucht n Vorlesungen und in jeder Vorlesung sitzen m Studenten. Dazu benötigen wir eine Entität "Vorlesungsstudent" - nennen wir sie einfacher "Teilnehmer". Über diese Entität wird gesteuert, welcher Student in welcher Vorlesung sitzt.
5) Gibt es zu jeder Vorlesung genau eine Klausur, kann man in die Tabelle "Teilnehmer" das Ergebnis mit aufnehmen, welches der Student erziehlt hat (nicht Erscheinen ließe sich ebenfalls in der gleiche Spalte ablegen - durch einen negativen Wert oder eine 0). Bei mehr Klausuren muss man eine neue Entität definieren - das kann ich jetzt nicht beurteilen.

Das ist im groben das Gerüst (klingt nach mehr als es ist) und das muss nun mit Daten gefüllt werden. Alles weitere (Durchschnittsnoten pro Vorlesung, pro Semester, pro Student etc.pp.) wird dann grundsätzlich dynamisch ermittelt mit entsprechenden SELECTs. Ggf. braucht man auch ein wenig PHP Arithmetik, aber das meiste wird mit SQL-Bordmitteln zu machen sein.


10.

Jetzt reite doch nicht immer auf dem prefix rum. Ich hätte genauso gut auch "uni_" statt der Variable "$prefix" nehmen können. Das ist schlicht ne Variable und kein Array und daher sind es auch nicht n Tabellen sondern wirklich nur jeweils eine.

Wieder zum Script:
Dein Datenmodell ist wirklich ne gute Überlegung führt aber leider nicht zum Ziel. Wie bei meinem angegeben Link (!) liegen mir auch nur Prüfungsnummer, Note, Punktzahl, Prüfungsdatum und Prüfungs-ID vor. Das heisst im Umkehrschluss, dass ich keinerlei Daten (außer eben der Prüfungsnummer) der Studenten habe. Wie man oben sieht lese ich die Daten direkt von HTML-Seiten der Uni aus - ich habe ja logischerweise keinen Zugriff auf die DB des Prüfungsamts ;-) Das ganze wird dan mit unterschiedlichen preg_matches verabeitet und in meine eigene DB gepackt.

Der jeweilige Student soll also am Ende seine Prüfungsnummer eingeben können und das Script soll ihm dann alle Noten der Klausuren, an denen er teilgenommen hat, ausgeben. Zu dem soll noch eine Statistik zu jeder einzelnen Klausur erstellt werden, sodass man eben einen Referenzwert hat, wie die anderen so abgeschnitten haben.

Ich habe jetzt testweise ein Semester des Grundstudiums eingelesen und verarbeiten lassen. Das sind jetzt alleine 6000 Datensätze. Wenn man das jetzt hochrechnet (Ergebnisse des Hauptstudiums dazu; mehrere Semester usw.) kommt man auf einen riesen Haufen Datensätze. Darum habe ich mir überlegt, alle relevanten Daten, die ich für die Auswertung der Klausuren brauche, direkt mit in die entsprechende Tabelle zu schreiben. Dann brauche ich nämlich nur noch einen SELECT-Befehl und muss das Script nicht jedes Mal die Unmengen von Daten der Tabelle "uni_ergebnisse" durchgehen lassen. Und da die Daten eigentlich am Ende statisch und nicht dynamisch sind (die Ergebnisse ändern sich ja nicht im nachhinein ständig) schien mir diese Überlegung auch ganz logisch, oder?


11.

Mit diesen Angaben als Tabellenspalten kannst doch alles aus der db auslesen:
(Prüfungsnummer, Note, Punktzahl, Prüfungsdatum und Prüfungs-ID).

Da brauchst doch keine Noten als Spaltennamen.

Und 6000 Datensätze sind nicht viel, da hab ich hier schon von ganz anderen Dimensionen gelesen.


12.

Hallo,

ich wollte mich nur mal melden und mich noch einmal fü die Hilfe bedanken. Mittlerweile steht das Script und läuft auch ohne Probleme.
Wen es interessiert, der besucht einfach mal http://noten.unimanie.de

Meinungen und Verbesserungsvorschläge sind immer willkommen.


Hier gehts zum Orginal Eintrag "Problem mit Verabeitung eines Arrays" im Forum
 
phpforum.de | Impressum