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

In MySQL-Abfragen mit php-Variablen arbeiten

Nikas3D

Neues Mitglied
Hallo,

ich hoffe ihr könnt mir bei meinem folgenden Problem helfen!
Für eine komplizierte Datenbankafrage benutze ich folgenden Code:

PHP:
                                $db_aktienname         = "aktie".$aktien_id."_wert";
                echo "-".$db_aktienname."<br>";
                $abfrage2             = mysql_query("SELECT '".$db_aktienname."' FROM `aktiendaten`");
                Fehler();
                if($row2             = mysql_fetch_object($abfrage2))
                {

                       $akt_aktienkurs    = $row2->aktie1_wert;        
                
                }
                else
                {
                    echo "<i>Fehler</i><br>";
                }

Ich habe eine Tabelle die so aufgebaut ist:

Spalte: aktie1_wert
Spalte: aktie2_wert ...


Zuerst jedoch erkläre ich meinen Code, damit man versteht was ich machen möchte:

Ich möchte aus einer Tabelle den aktuellen Aktienkurs auslesen lassen.
Dafür generiere ich erstmal den Namen der Aktie! <- den ich in der Datenbank abfragen muss!
ER lautet: aktie"(aktien_id)"_wert
Den Name für die Datebank setze ich auch mithilfe von Variablen genauso zusammen!
Ist der Weg auf dem ich versuche diese Abfrage durchzuführen richtig?

Danach möchte ich in den Eintrag aus der Datenbank (es gibt immer nur eine Zeile, diese wird jeden Tag mit dem neuen Aktienkurs überschrieben) auslesen. In den letzten beiden Zeilen wird dann der Aktienkurs herausgefiltert und in eine Variable überschrieben!

Frage2: $akt_aktienkurs ist ebenfalls leer, aber ich denke, dies ist ein folgeFehler aus den ersten Zeilen!


Frage3: die letzte Zeile müsste eigentlich anders aussehen aber wie?:
Ich schreib hier jetzt hin wei sie aussehen müsste. Ich weiß dass das natürlich total falsch ist:

$alt_aktienkrus = "$row2->aktien".$aktien_id."_wert;

Eine Möglichkeit wäre es mit eine weiteren If-Abfrage zu gestalten:

PHP:
                $db_aktienname         = "aktie".$aktien_id."_wert";
                echo "-".$db_aktienname."-";
                $abfrage2             = mysql_query("SELECT '".$db_aktienname."' FROM `aktiendaten`");
                Fehler();
                if($row2             = mysql_fetch_object($abfrage2))
                {
                    if($aktien_id == 1)
                    {
                        $akt_aktienkurs    = $row2->aktie1_wert;        
                    }
                    elseif($aktien_id == 2)
                    {
                        $akt_aktienkurs    = $row2->aktie2_wert;        
                    }
                    else
                    {
                        echo "<i>Undefinierte Aktie</i>";
                    }
                }
                else
                {
                    echo "<i>Fehler</i><br>";
                }
Aber jetzt wird als Kurs die beiden NAmen (aktie1_wert bzw. aktie2_wert) in die tabelle getragen und nicht der dazugehörige code!
Frage 4: wie korrigiere ich diesen Fehler?

Frage 5: Wer kann mir helfen?
 
Zuletzt bearbeitet:
Werbung:
Ist der Weg auf dem ich versuche diese Abfrage durchzuführen richtig?

Nein. Du solltest darauf verzichten dynamische Spaltennamen zu verwenden. Für deinen Zweck würde sich so eine Tabelle eher lohnen:

Code:
aktienwertid INT NOT NULL,
name VARCHAR(255),
wert DECIMAL(11,4),
aktuell TINYINT(1)

In Worten ausgedrückt:
Eine Tabelle die Aktienwerte von einer beliebigen Anzahl Aktien enthält die jeweils als aktuell markiert werden können.

Eine Suche wie Du sie willst, würde dann lauten:
Code:
SELECT wert FROM tabelle WHERE name = 'aktienname' AND aktuell = '1'

Wenn Du die Werte aktualisierst, musst Du zuerst den Status alle Werte einer Aktie auf 0 setzen

Code:
UPDATE tabelle SET aktuell = '0' WHERE name = 'aktienname'

und danach einen neuen Wert für die Aktie eintragen, also einen neuen Datensatz:
Code:
INSERT INTO tabelle ...

Dadurch hast Du auch historische Daten zu allen Aktien, nicht nur aktuelle. Dazu würde es sich lohnen diese von mir empfohlene Tabelle noch um eine DATETIME-Spalte zu ergänzen.

Frage2: $akt_aktienkurs ist ebenfalls leer, aber ich denke, dies ist ein folgeFehler aus den ersten Zeilen!

Eher in Fehler in deinem Datenbankmodell, welches Du mit der PHP-Programmierung auch nicht verbessern kannst.

Frage 4: wie korrigiere ich diesen Fehler?

Schau dir meine Empfehlung mal an und denk nochmal über die Datenbanktabelle nach. Die ist der Ausgangspunkt für eine saubere Programmierung.
 
Vielen Dank für deine Antwort!
2 Fragen habe ich aner noch!

Frage1: Ich habe mehrere Aktien soll ich dann für jede eine einzelne Tabelle anlegen?

Frage2: Wofür genau ist "aktuell" notwendig wenn ich es zuerst auf null setzte und danach sofort wieder auf 1?


aktienwertid INT NOT NULL, name VARCHAR(255), wert DECIMAL(11,4), aktuell TINYINT(1)
Frage 3: Warum nicht:

aktienwertid INT NOT NULL,
name text,
wert DECIMAL,
aktuell boolean
 
Zuletzt bearbeitet:
Werbung:
Nein, in meinem Beispiel habe ich von einer Tabelle gesprochen. Eine für alles. Die Spalte "aktuell" sollte immer nur dann den Wert 1 haben, wenn der betreffende Datensatz den aktuellen Wert enthält - in meinem Beispiel oben würde das in dem INSERT-Statement enthalten sein. Der dadurch neu eingefügte Datensatz hätte bei "aktuell" den Wert "1", alle anderen Datensätze die "0".

Mein Gedanke dahinter war, dass Du auch historische Daten aufbewahren kannst. Das könnte man natürlich noch weiter ausführen. Z.B. in 2 Tabellen:
- eine Tabelle für Aktien (1 Datensatz pro Aktie)
- eine Tabelle für die Aktienwerte (1 Datensatz pro Wert)
Das ließe sich dann auch sehr einfach Normalisieren und würde für dich zu eindeutigen Ergebnissen führen. Ich würde dir raten dir mal einige Datenbankgrundlagen genauer anzuschauen, insbesondere was die Struktur angeht.
 
Also du meinst, dass ich dann in meiner Tabelle viele Spalten habe und wenn ich z.B. 2 unterschiedliche Aktien habe, sind 2 Zeilen auf aktuell = 1 gesetzt?
Und alte Werte die zum Beispiel gestern oder vorgestern aktuell waren sind aktuell = 0?

Wenn/Falls ich das so richtig sehe dann, sehe ich nur das Problem wenn ich diese Werte zum Beipsielt grafisch ausgeben möchte dann habe ich zwar mit aktuell den letzten wert, aber ich habe dann noch xEinträge mit aktuell = 0! Sollte ich dann nicht noch eine zusätzliche Spalte mit datum einfügen?
 
Nein, du hast viele Zeilen für viele Aktien. Sinnvoller wäre für aktuell vielleicht ein Timestamp, damit liesse sich immer der aktuellste Wert einer Aktie erfassen und du könntest ohne Problem eine Timeline erstellen.
 
Werbung:
Zurück
Oben