• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Nur bestimmte Einträge aus der Tabelle ausgeben

  • Ersteller Ersteller Fishmasta
  • Erstellt am Erstellt am
F

Fishmasta

Guest
Hallo Leute, ich bräuchte nochmals eure Hilfe.

Folgende Situation: Über das Array $tmp werden verschiedene Variablen übergeben:
$tmp[0] = a
$tmp[1] = b
usw.

Die Länge des Arrays und die Werte variieren!

Jetzt sollen anhand der übergebenen Werte bestimmte Aktionen ausgeführt werden.

Hier erstmal mein Code:
PHP:
<?php
    
    /*
    Verbindung zur Tabelle des Fragenblocks Interessen herstellen
    */
    $result = mysql_query('SELECT count(*) FROM interessen') or die ("MySQL-Fehler: " . mysql_error());
    
    /*
    Anzahl der Datenbankeinträge ermittel
    (Für die for-Schleife)
    */
    
    $anzahl = mysql_result($result,0);
    
    
    
    
    
    
    for($i=0; $i<$anzahl; $i++) {
        $result = mysql_query('SELECT AIMa, AIMb, AIMc, AIMd, WINa, WINb, WINc, WINd FROM interessen') or die ("MySQL-Fehler: " . mysql_error());
        $tmp = $_POST["$i"];
        echo"Antwortmöglichkeit: $tmp<br />";
                
        if($tmp == 'a') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMa . "<br />";
                echo "WIN: " . $row->WINa . "<br />";
            }
        }
        if($tmp == 'b') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMb . "<br />";
                echo "WIN: " . $row->WINa . "<br />";
            }
        }
        if($tmp == 'c') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMc . "<br />";
                echo "WIN: " . $row->WINa . "<br />";
            }
        }
        if($tmp == 'd') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMd . "<br />";
                echo "WIN: " . $row->WINa . "<br />";
            }
        }
        
    };
    
?>

Generell tut das Skript das was es tun soll.
Mein Problem ist jetzt, dass in der zutreffenden if-Abfrage alle Werte der Spalte ausgegeben werden.
Ich möchte aber folgendes:
- Im ersten Durchlauf der for-Schleife wird nur der Wert der Spalte in Zeile 1 ausgegeben
- Im zweiten Durchlauf wird nur der Wert der Spalte in Zeile 2 ausgegeben
- usw...

Mit WHERE ... = ... komme ich meiner Meinung nicht weiter.
Gibt es dazu alternativen? Was würdet ihr machen?
Wenn noch Fragen sein sollten, fragt!

UND SCHONMAL DANKE IN VORRAUS!!!!
 
Hi,
also wenn ich dich richtig verstanden habe, dann musst du die Zeilen der Tabelle durchnummerieren, z.B. noch eine Spalte "index" einbauen, diese dann auf auto_increment und als Primärschlüssel einstellen. Dann kannst du folgende Abfrage in der for-Schleife einbauen:
PHP:
$result = mysql_query('SELECT AIMa, AIMb, AIMc, AIMd, WINa, WINb, WINc, WINd FROM interessen WHERE index = "$i"') or die ("MySQL-Fehler: ".mysql_error());
Ich hoffe ich konnte dir helfen :)

mfg michaelos
 
Das sieht schonmal sehr gut aus, danke.

Jetzt habe ich allerdings ein neues Problem.
Ich bekomme folgende Fehlermeldung bei der Abfrage:
MySQL-Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index = "$i"' at line 1

Und noch eine Sache.
Wenn ich zwischendurch auch mal wieder Einträge in der Datenbank entferne und dann wieder neue einfüge,
wird ja zwangsläufig folgenes Szenario entstehen:
Die Anzahl der Einträge in der DB ist z.b. 10, aber der Index des letzten Eintrages hat schon einenr Wert von z.B. 15.
Da die for-Schleife durch die Anzahl der DB-Einträge begrenzt wird, werden alle Einträge die einen index über 10 haben nicht mehr angezeigt.
Wie kann ich das Problem umgehen? Gibt es in phpMyAdmin eine Möglichkeit den index ohne Lücken fortlaufen zu lassen?
 
Ich bekomme folgende Fehlermeldung bei der Abfrage:
SQL-Statements solltest Du immer zunächst in PHPMyAdmin formulieren und probieren. Wenn sie hier laufen, kopierst Du sie in PHP und ersetzt die festen Testbedingungen (WHERE-Teil) durch die Variablen. So kannst Du sehr leicht feststellen, wo ein evtl. Fehler zu suchen ist.

Gibt es in phpMyAdmin eine Möglichkeit den index ohne Lücken fortlaufen zu lassen?
Das hat nix mit PHPMyAdmin oder überhaupt mit MySQL zu tun, das ist eine Frage der "Denke". Ein Autoincrement-Feld dient dazu, jedem DS einen einmaligen Schlüssel zu geben, sonst nix. Dieser Schlüssel trägt keinerlei Bedeutung, dafür isser nich da.
Um DS zu zählen gibt es COUNT.
 
die abfrage läuft jetzt.
das problem war das der spaltenname index nicht in backticks stand.
es muss also `index` heißen und nicht nur index, da index ein reserviertes wort ist.

jetzt aber nochmal zurück zum index und der anzahl der datensätze.
wenn ich folgende tabelle habe:

[TABLE="class: grid"]
[TR]
[TD]inhalt[/TD]
[TD]index[/TD]
[/TR]
[TR]
[TD]datensatz 1[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]datensatz 2[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]datensatz 3[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]datensatz 4[/TD]
[TD]9[/TD]
[/TR]
[/TABLE]


komme ich mit meinem urspünglichen code nicht mehr weit:
PHP:
$j = 1;
    for($i=0; $i<$anzahl; $i++) {
        $result = mysql_query("SELECT AIMa, AIMb, AIMc, AIMd, WINa, WINb, WINc, WINd FROM interessen WHERE `index`=$j") or die ("MySQL-Fehler: " . mysql_error());
        $tmp = $_POST["$i"];
        echo"Antwortmöglichkeit: $tmp<br />";
                
        if($tmp == 'a') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMa . "<br />";
                echo "WIN: " . $row->WINa . "<br />";
            }
        }
        if($tmp == 'b') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMb . "<br />";
                echo "WIN: " . $row->WINb . "<br />";
            }
        }
        if($tmp == 'c') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMc . "<br />";
                echo "WIN: " . $row->WINc . "<br />";
            }
        }
        if($tmp == 'd') {
            while($row = mysql_fetch_object($result)) {
                echo "AIM: " . $row->AIMd . "<br />";
                echo "WIN: " . $row->WINd . "<br />";
            }
        }
    
    $j++;
        
    };

da müsste ich ja dann nen undefined index zurück bekommen
ist jetzt halt die frage wie ich dieses problem gelöst bekomme
wäre es sinnvoll die fehlermeldung abzufangen und das skript anschließend einfach weiterlaufen zu lassen?
dann bräuchte ich meiner meinung nach aber auch min. eine weitere abbruchbedingung für die for-schleife.

naja ich hoffe ihr hab noch die ein oder andere idee -.-
 
Formuliere doch zuerst mal die Aufgabe, ohne irgendwelchen Code. Das sollte mit einigen wenigen Hauptsätzen möglich sein; pro Satz bitte nur 1 Aussage.
Wenn das klar ist, kann man das richtige Werkzeug suchen.
Ich hab' jedenfalls keine Lust, aus der Analyse Deines Codes auf Deine Wünsche und Vorstellungen zu schließen.
 
Die Struktur der Tabelle ist folgende:

[TABLE="class: grid"]
[TR]
[TD]Datensatz[/TD]
[TD]Wert a[/TD]
[TD]Wert b[/TD]
[TD]index[/TD]
[/TR]
[TR]
[TD]Datensatz 1[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]Datensatz 2[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]Datensatz 3[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]Datensatz 4[/TD]
[TD]7[/TD]
[TD]8[/TD]
[TD]9[/TD]
[/TR]
[/TABLE]



Folgenes muss das Skript realisieren:
- Es bekommt ein Array übergeben. Die Werte der Variablen sind entweder a oder b.
- Dann wird das Array durchlaufen und die jeweils passende Aktion wird ausgeführt:
- Für Array[x] = a: Wert a von Datensatz x ausgeben
- Für Array[x] = b: Wert b von Datensatz x ausgeben

Es darf also pro Schleifendurchlauf nur ein Wert von einem Datensatz ausgegeben werden.
 
Es bekommt ein Array übergeben. Die Werte der Variablen sind entweder a oder b.
Wie passt das mit dem SQL-Statement aus #5 zsammen? Da wird die ID in der WHERE-Klausel aufgeführt.
Wenn aber doch nach Wert_a oder Wert_b gesucht wird, dann müßten die in der WHERE-Klausel auftauchen.
Es darf also pro Schleifendurchlauf nur ein Wert von einem Datensatz ausgegeben werden.
Warum?
Dir ist klar, daß du ein Abfrageergebnis in einem Array speichern kannst?
 
Es wird nach dem Eintrag mit der ID $i gesucht und von diesem Eintrag dann der Wert einer bestimmten Spalte ausgegeben.
Von welcher Spalte der Wert ausgegeben wird ist abhänig von den Werten der Variablen.
 
Das muß nicht heißen, daß Dein Datenmodell falsch ist, der Verdacht ist aber groß.

Warum?

Weil mit dem Wert gerechnet werden muss.
Wenn ich dann die ganze Spalte auf einmal ausgegeben bekomme kann ich damit nichts anfangen,
da ich die Werte nacheinadner brauche.

Problem wurde aber gelöst:
PHP:
/*
    Startwert der Indizes auf 1 festlegen
    (Für die for-Schleife)
    */
    
    $j = 1;
    
    /*
    Auswertung der gegebenen Antworten
    Entsprechender Wert aus der Tabelle
    wird auf die Session-Variable addiert
    */
    
    for($i=0; $i<$anzahl;) {
        $result = mysql_query('SELECT AIMa, AIMb, AIMc, AIMd, WINa, WINb, WINc, WINd, `index` FROM interessen WHERE `index` =' . $j) or die ("MySQL-Fehler: " . mysql_error());
        
        $tmp = $_POST["$i"]; // Array mit den gegebenen Antworten
                
        if($tmp == 'a') {
            while($row = mysql_fetch_object($result)) {
                $_SESSION['AIM']+=$row->AIMa;
                $_SESSION['WIN']+=$row->WINa;
                $i++;
            }
        } elseif($tmp == 'b') {
            while($row = mysql_fetch_object($result)) {
                $_SESSION['AIM']+=$row->AIMb;
                $_SESSION['WIN']+=$row->WINb;
                $i++;
            }
        } elseif($tmp == 'c') {
            while($row = mysql_fetch_object($result)) {
                $_SESSION['AIM']+=$row->AIMc;
                $_SESSION['WIN']+=$row->WINc;
                $i++;
            }
        } elseif($tmp == 'd') {
            while($row = mysql_fetch_object($result)) {
                $_SESSION['AIM']+=$row->AIMd;
                $_SESSION['WIN']+=$row->WINd;
                $i++;
            }
        } else {
            echo"lololololol";  // evtl. Ferhlerbehandlung einfügen
        }
        
        $j++; // Index um 1 erhöhen
        
    };
 
Schön, daß dein Problem gelöst ist.
Es gibt auch andere Lösungen. Die muß man aber nicht anwenden, die ganze Hardware ist heutigentags ja sehr leistungsfähig und eine Kilowattstunde elektrischer Leistung kostet ja nicht sooo viel.
 
Zurück
Oben