1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Problem mit Switch-Anweisung

  • osiris
  • 26. Mai 2008 um 10:02
  • Unerledigt
  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 26. Mai 2008 um 10:02
    • #1

    Hallo,
    ich bin hier auf ein kleines Problem mit einer switch-Verzweigung gestoßen:

    Es geht um Folgendes:

    In meinem Webprojekt durchlaufen die User mehrere Tests, deren Ergebnisse in der DB abgelegt werden.
    Zu Auswertungszwecken soll das Ganze Zahlengewusel nun als CSV vorliegen.
    Die Dateien sollen dann nach dem Schema [Test]_[Datum].csv benannt werden.

    Dafür habe ich erstmal folgendes Skript erstellt (noch nicht ganz fertig).
    Nicht wundern: Da wird momentan noch nichts in Textdateien geschrieben, sondern erstmal nur eine HTML-Ausgabe erzeugt.
    Das liegt zum einen daran, dass ich noch keine Schreibrechte auf dem server hab um das richtig umzusetzen und zum anderen ist es recht bequem, das erstmal so zu testen (Da muss man nicht immer in irgendwelchen Dateien nachschauen, ob alles klar ging...).

    PHP
    #DB CONNECT
    require('../inc/config.inc.php');
    db_connect();
    
    
    #USER IDs holen
    $sel_ids=mysql_query("SELECT id FROM users");
    
    
    #DATUM holen
    $date=getdate();
    $d=$date['mday'];
    $m=$date['mon'];
    if (strlen($m)==1) {
    
    
    	$m="0".$m;
    }
    $y=$date['year'];
    $date_csv="$d$m$y";
    
    
    $test = array("test1","test2","test3","test4","test5","test6");
    
    
    $x=count($test);
    $i=0;
    
    
    for ($i=0; $i<$x; $i++) {
    
    
    	$tname=$test['$i'];
    	$filename="$tname"."_"."$date_csv".".csv";
    
    
    	switch ($tname) {
    
    
    	case "test1":
    
    		echo "test1<br>";
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    			$uid = $id[0];
    			echo "<font color='blue'>".$uid."</font>,";
    			$sel=mysql_query("SELECT fr_id FROM antworten1 WHERE uid='$uid' ORDER BY fr_id");
    
    			$ki=0;
    			while($exp1=mysql_fetch_array($sel)) {
    
    
    				echo "<font color='crimson'>";	
    				echo $exp1[0]."</font>,";
    				$frid=$exp1[0];
    				$sel2=mysql_query("SELECT ant FROM antworten1 WHERE uid='$uid' AND fr_id='$frid'");
    				$exp2=mysql_fetch_array($sel2);
    				echo "<font color='green'>".$exp2[0]."</font>";
    				if ($ki!=29) {
    
    
    					echo ",";
    				}
    				$ki=$ki+1;
    			}
    			echo "<br>";
    		}
    		break;
    
    
    	case "test2":
    
    
    		echo "test2<br>";
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    
    			$uid = $id[0];
    			echo "<font color='blue'>".$uid."</font>,";
    			$sel=mysql_query("SELECT fr_id FROM antworten2 WHERE uid='$uid' ORDER BY fr_id");
    
    			$ki=0;
    			while($exp1=mysql_fetch_array($sel)) {
    
    
    				
    				echo "<font color='crimson'>";	
    				echo $exp1[0]."</font>,";
    
    
    				$frid=$exp1[0];
    				$sel2=mysql_query("SELECT ant FROM antworten2 WHERE uid='$uid' AND fr_id='$frid'");
    				$exp2=mysql_fetch_array($sel2);
    				echo "<font color='green'>".$exp2[0]."</font>";
    				if ($ki!=29) {
    
    
    					echo ",";
    				}
    				$ki=$ki+1;
    			}
    			echo "<br>";
    		}
    
    
    		break;
    
    
    	case "test3":
    
    
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    
    			$uid = $id[0];	
    		}
    
    
    		break;
    
    
    	case "test4":
    
    
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    
    				$uid = $id[0];
    		}
    
    
    		break;
    
    
    	case "test5":
    
    
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    
    				$uid = $id[0];
    		}
    
    
    		break;
    
    
    	case "test6":
    
    
    		while ($id=mysql_fetch_array($sel_ids)) {
    
    
    				$uid = $id[0];
    		}
    
    
    		break;
    	}
    
    
    }
    Alles anzeigen

    Das funktioniert sogar bis zu einem gewissen Grad einwandfrei...:D

    Das Problem:

    Wenn die Werte aus dem case test1 korrekt ausgegeben wurden, schreitet das Script weiter zum Szenario test2.
    Da müsste nun in etwa das Gleiche passieren und somit auch die Ausgabe ähnlich sein.

    ABER: Es wird lediglich "test2" ausgegeben und von den eigentlichen Ergebnissen ist nichts zu sehen.
    Komischerweise scheint das aber nicht am Quelltext innerhalb von test2 zu liegen, denn:

    Wenn ich die Positionen von test1 und test2 im array $test vertausche, hab ich das ganze genau umgedreht, d.h.:

    Ich bekomme die Ergebnisse von test2 einwandfrei angezeigt, aber nicht die von test1. :confused:

    Woran kann das liegen? (Ich muss dazu sagen, dass ich hier leider keine Fehlermeldungen vom Server bekomme und das selbst auch nicht umstellen kann :frowning_face: )

    4 Mal editiert, zuletzt von osiris (26. Mai 2008 um 10:07)

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 26. Mai 2008 um 10:19
    • #2
    PHP
    $i=0;
    
    
    for ($i=0; $i<$x; $i++) {
    
    
        $tname=$test['$i'];

    Die erste Zeile ist überflüssig. Und das Array $test hat keine Werte an den Stellen $i. Es gibt zwei Möglichkeiten, das Problem zu lösen:

    1) Du benutzt Foreach. Foreach ist die empfohlene und fast immer die effizienteste Schleifenanweisung für Arrays.

    2) Du realisierst, dass man Variablen in SQL-Abfragen auch in den Tabellennamen schreiben kann:

    PHP
    for($i = 0; $i < $x; $i++) {
        $fraternity = mysql_query("SELECT * FROM antworten$i WHERE meine mudda = deine mudda");
    }

    Und schon kannst du Switch in die Tonne kloppen. Wundertastisch.

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 26. Mai 2008 um 10:34
    • #3

    Danke erstmal für die Tipps.
    Eine Frage noch:

    Zitat von spinball

    Und das Array $test hat keine Werte an den Stellen $i.

    Warum bekomme ich dann jeweils den Namen des Tests geliefert, wenn ich in die for-Schleife

    PHP
    $tname=$test['$i'];
    echo $tname;


    einbaue?

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 26. Mai 2008 um 10:50
    • #4

    Ups, mein Fehler. Dynamische Typisierung ist böse! Wegen der Anführungszeichen dachte ich erst, du willst Strings. Nimm sie doch bitte weg, wenn du Zahlen willst.

    Dein Programm funktioniert nicht, da mysql_fetch_array/assoc/row konsumierend ist. Beim ersten Schleifendurchlauf werden die IDs herausgesaugt und sind beim zweiten Mal leer. Deswegen wird die zweite Schleife kein einziges Mal ausgeführt.

    Du solltest die IDs am Anfang des Programmes gleich in ein Array zwischenspeichern. Oder du fügst es als SQL-Unterabfrage direkt ein.

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 26. Mai 2008 um 11:06
    • #5

    Und ein letzter Tipp noch: Anstatt 3749837498 Tabellen gleicher Struktur mit Antworten zu haben, solltest du besser eine Einzige anlegen, welche die Kategorie in einer extra Spalte speichert. Dann brauchst du nicht Benutzeranzahl * Antwortanzahl SQL-Abfragen, sondern mit feinen Joins nur zwei. Ich empfehle die LVA Datenmodellierung.

    Code
    Tabelle: Antworten
    
    
     zähler kategorie benutzer frage antwort
    +------+---------+--------+-----+-------+
    |     1|        1|       1|    1|      1|
    |     2|        1|       1|    2|      3|
    |     3|        1|       1|    3|      2|
    |     4|        2|       1|    1|      3|
    |     5|        2|       1|    2|      2|
    |     6|        2|       1|    3|      1|
    +------+---------+--------+-----+-------+
    Alles anzeigen

    Einmal editiert, zuletzt von spinball (26. Mai 2008 um 11:09)

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 26. Mai 2008 um 11:42
    • #6
    Zitat von spinball

    Du solltest die IDs am Anfang des Programmes gleich in ein Array zwischenspeichern. Oder du fügst es als SQL-Unterabfrage direkt ein.

    Hab mich für's array entschieden. außerdem hab ich die for-Schleife und jeweils die erste while-Schleife im case durch foreach ersetzt.

    Funktioniert!
    Schreibrechte hab ich jetzt auch, mittlerweile.

    Zitat von spinball


    Wundertastisch.


    In der Tat!

    Zitat von spinball


    Anstatt 3749837498 Tabellen gleicher Struktur mit Antworten zu haben, solltest du besser eine Einzige anlegen, welche die Kategorie in einer extra Spalte speichert.

    Das gehört zum Glück nicht zu meinem Aufgabenbereich. :grinning_squinting_face:
    Außerdem ist die Struktur der Tabellen (warum auch immer) nicht überall gleich. Würde also alles zu viel Overhead verursachen um noch vor der Mittagspause abgearbeitet zu werden... :)

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 26. Mai 2008 um 11:48
    • #7
    Zitat von osiris

    Das gehört zum Glück nicht zu meinem Aufgabenbereich.
    Außerdem ist die Struktur der Tabellen (warum auch immer) nicht überall gleich.

    Na dann statte deinem Kollegen doch einen kurzen Besuch ab und grüße ihn recht herzlich von mir!

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 26. Mai 2008 um 12:04
    • #8

    Ich habe den noch nie gesehen.... :grinning_squinting_face:

    6 Mal editiert, zuletzt von osiris (26. Mai 2008 um 12:07) aus folgendem Grund: lalala

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern