variable Variabel möglich?
Ulf
- php
Hi all,
ich hab ein Problem! Ich möchte in meine Datenbank etwas updaten (SQL), aber er speichert nicht den Wert der Variabel, sondern nur den Variabelnamen, der in der Variabel gespeichert ist, da dieser bei jedem Update neu generiert wird --> variable Variabel!
Hier der Quelltext:
if($db_link)
{
if(mysql_select_db(MYSQL_DATABASE))
{
sqla = "SELECT
kd_id, akt_art, akt_betrag, akt_bem, akt_bez
FROM
aktion_bew
WHERE
kd_id = '$kunde_id'
ORDER BY
akt_art
";
$upx = 0;
$rNachlass = 0;
$sqlb = "SELECT id, par_bez, par_wert1, par_wert2, par_wert3, par_wert4
FROM
param
WHERE
par_bez='Nachlass'
ORDER BY
par_bez
";
$result = mysql_query($sqla) OR die(mysql_error());
while($row = mysql_fetch_assoc($result))
{
echo"Schleife1 läuft<br>";
if ( $row['akt_bez'] == 'Nachlass' )
{
echo "Gehört zu den Nachlässen -->";
$resultb = mysql_query($sqlb) OR die(mysql_error());
while($rowb = mysql_fetch_assoc($resultb))
{
echo "Schleife2 läuft<br>";
if ($row['akt_art'] == $rowb['par_wert1'] )
{
echo $rowb['par_wert1'];
$upx=$upx+1;
$querybetrag= "$Feld" . $rowb['par_wert4'];
$querybem = "$Bem" . $rowb['par_wert4'];
$queryart =$rowb['par_wert1'];
$queryup[$upx]= "UPDATE aktion_bew
SET akt_betrag = '$querybetrag',
akt_bem = '$querybem'
WHERE ( akt_art = '$queryart' )
AND ( kd_id = '$kunde_id' ) ; ";
}
}
}
echo"Ende Schleife1";
}
while ( $upx != 0 )
{
$resultup = mysql_query($queryup[$upx]) OR die(mysql_error());
$upx = $upx - 1;
;
}
}
}
Hallo,
kd_id = '" . eval("echo $kunde_id;") . "'
Grüße
Thomas Mell
Probiers mal mit eval("$variable").
Hallo Ulf,
ich hab ein Problem! Ich möchte in meine Datenbank etwas updaten (SQL), aber er speichert nicht den Wert der Variabel, sondern nur den Variabelnamen, der in der Variabel gespeichert ist, da dieser bei jedem Update neu generiert wird --> variable Variabel!
ich habe mir nicht die Mühe gemacht, aus dem Codewust herauszufinden, wo Du Deine "variable Variable" genau hast. Im Gegensatz zu Thomas und Stefan schlage ich Dir anstelle der meiner Meinung nach völlig überflüssigen Anwendung der Funktion eval() die variable Variablen von PHP als etwas bessere Alternative vor. Bei genauerer Kenntnis des Zusammenhanges, der mir aus Deinem Code nicht hervorgeht, könnte man wahrscheinlich sogar komplett auch darauf verzichten.
Freundliche Grüße
Vinzenz
Hallo Ulf,
Du solltest Dich unbedingt über JOINS informieren:
SELFHTML aktuell: Einführung in JOINs, Relationale Datenbanken - fortgeschrittene Jointechniken
Ein INNER JOIN sollte den PHP-Code drastisch reduzieren und die Performance deutlich verbessern.
Freundliche Grüße
Vinzenz
Hallo Ingrid,
Ein INNER JOIN sollte den PHP-Code drastisch reduzieren und die Performance deutlich verbessern.
Um es ein wenig zu demonstrieren:
sqla = "SELECT
kd_id, akt_art, akt_betrag, akt_bem, akt_bez
FROM aktion_bew
WHERE kd_id = '$kunde_id'
ORDER BY akt_art";
$upx = 0;
$rNachlass = 0;
$sqlb = "SELECT id, par_bez, par_wert1, par_wert2, par_wert3, par_wert4
FROM param
WHERE par_bez='Nachlass'
ORDER BY par_bez";
$result = mysql_query($sqla) OR die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
if ( $row['akt_bez'] == 'Nachlass' ) {
//...
while($rowb = mysql_fetch_assoc($resultb)) {
// ...
if ($row['akt_art'] == $rowb['par_wert1'] ) {
// Mache was;
}
// kein else-Zweig
}
}
// kein else-Zweig
}
while ( $upx != 0 ) {
$resultup = mysql_query($queryup[$upx]) OR die(mysql_error());
$upx = $upx - 1;
; // Huch, ein leeres Statement :-)
}
Du fügst Deinem Array mit UPDATE-Statements nur dann einen neuen Eintrag hinzu, wenn
a) im Feld akt_bez der Wert 'Nachlass' steht
b) die Werte der Felder 'akt_art' in Tabelle aktion_bew und
'par_wert1' in Tabelle param gleich sind.
Alle anderen Datensätze interessieren Dich nicht.
Weiterhin greifst Du nur auf Inhalte der Spalten
a) par_wert1
b) par_wert4
zu, falls ich nichts übersehen habe. Die Inhalte der anderen Spalten müssten nicht angefordert werden.
Also verwende von vornherein das SQL-Statement
SELECT
p.par_wert1,
p.par_wert4
FROM aktion_bew a -- ein Aliasname erspart uns Schreibarbeit
INNER JOIN param p ON a.akt_art = p.par_wert1
WHERE a.kd_id = <die Kundenid aus der Variablen>
AND p.par_bez = 'Nachlass'
AND a.akt_bez = 'Nachlass'
ORDER BY a.akt_art, p.par_bez
Durchlaufe die Ergebnismenge und stelle Dein Array zusammen :-)
$upx = 0;
$rNachlass = 0; // Wo benutzt Du diese Variable?
$sql = <obiges Statement>
// Hmm, nicht gerade die schönste Fehlerbehandlung,
// das Skript einfach sterben zu lassen
$result = mysql_query($sqla) OR die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Baue die Update-Statements zusammen
$upx=$upx+1;
// Hast Du hier die Probleme?
// Ich verstehe jedenfalls nicht, was Du hier vorhast
$querybetrag= "\$Feld" . $row['par_wert4'];
$querybem = "\$Bem" . $row['par_wert4'];
$queryart =$row['par_wert1'];
$queryup[$upx]= "UPDATE aktion_bew
SET akt_betrag = '$querybetrag',
akt_bem = '$querybem'
WHERE akt_art = '$queryart'
AND kd_id = '$kunde_id' ;";
// Anmerkung: Warum das Semikolon am Ende des Statements
}
// Führe die Update-Statements aus
// Hast Du schon einmal von [link:http://de2.php.net/manual/de/control-structures.foreach.php@title=foreach] gehört
// - hier in Kombination mit [link:http://de2.php.net/manual/de/function.array-reverse.php@title=array_reverse()]?
while ( $upx != 0 ) {
$resultup = mysql_query($queryup[$upx]) OR die(mysql_error());
$upx = $upx - 1;
}
Wie bereits gesagt, ist mir völlig schleierhaft, wie Deine UPDATE-Statements aussehen sollten - und wo Dein ursprüngliches Problem genau beheimatet ist. Nähere Informationen mit ein paar Beispieldaten wären sicherlich nützlich.
Freundliche Grüße
Vinzenz
Hallo Gunnar™
// Hast Du hier die Probleme?
// Ich verstehe jedenfalls nicht, was Du hier vorhast$querybetrag= "$Feld" . $row['par_wert4'];
$querybem = "$Bem" . $row['par_wert4'];
$queryart =$row['par_wert1'];
Ganz bestimmt hast Du hier Dein Problem:
$querybetrag hat als Inhalt die Zeichenkette $Feld-irgendwas
$querybem $Bem-irgendwas
$queryup[$upx]= "UPDATE aktion_bew
SET akt_betrag = '$querybetrag',
Statt diese Zeichenketten möchtest Du den Inhalt einer Variablen
$Feld-irgendwas bzw. $Bem-irgendwas in Dein Statement einfügen.
SET akt_betrag = '$querybetrag',
akt_bem = '$querybem'
Wie ich bereits anmerkte, geht das mit variablen Variablen:
SET akt_bem = '[code lang=php]$$querybem
',
akt_art = '$$queryart
'[/code]
Doch woher kommen diese Variablen? In Deinem Codeschnippsel werden sie jedenfalls nicht initialisiert. Kommen sie möglicherweise ebenfalls aus der Datenbank, aus einer vorhergehenden Abfrage? Dann könntest Du Deinen Code eventuell noch zusammenstreichen, indem Du diese Angabe (ja, mittels JOIN) ebenfalls im gleichen Statement ermittelst.
Wenn nicht, so wäre es sicherlich nützlich, diese Informationen statt in Deinen Variablen mit festem Präfix und variablem Suffix in entsprechenden Arrays zu speichern, auf die Du mittels
$Feld[par_wert4] bzw.
$Bem[par_wert4]
zugreifen kannst. Das ist meiner Meinung nach besser und schöner als die variablen Variablen, von eval (das evil ist ;-)) ganz zu schweigen.
Mehr Hintergrundinformationen wären nützlich, um Dir besser helfen zu können. Es ist ebenso möglich, dass wir Dir empfehlen, Deine DB-Struktur zu optimieren :-)
Freundliche Grüße
Vinzenz
Hui, vielen Dank schon mal für die viele Arbeit!! Also ehrlich gesagt habe ich noch nichts von JOIN gehört bzw genutzt. Und ich kenne vielleicht nur einen geringen Bruchteil von PHP Funktionen, da ich bisher nie mit PHP gearbeitet habe!
Eine andere Fehlerbehandlung kenne ich leider nicht! So stand es im quakenet:#php Tutorial.
// Hast Du hier die Probleme?
// Ich verstehe jedenfalls nicht, was Du hier vorhast
JA genau dort liegt das Problem!
Ich sende per Post von der ersten Seite zu dieser! Dort gab es die Felder z.B. $Feldgroßabnehmer und $Bemgroßabnehmer! Diese Namen kommen auch aus einer Tabelle param! ( $Feld + Variabel aus Param )
Genau den gleichen Vergleich (die Werte der Felder 'akt_art' in Tabelle aktion_bew und 'par_wert1' in Tabelle param gleich ) nutze ich um die Tabelle mit den Werten zu füllen. Und genau diese müssen geupdatet werden!
____________
$querybetrag= "$Feld" . $row['par_wert4'];
$querybem = "$Bem" . $row['par_wert4'];
$queryart =$row['par_wert1'];
$queryup[$upx]= "UPDATE aktion_bew
SET akt_betrag = '$querybetrag',
akt_bem = '$querybem'
WHERE akt_art = '$queryart'
AND kd_id = '$kunde_id' ;";
Also was dies bedeuten sollte:
$queryup[$upx]= 'UPDATE aktion_bew
SET akt_betrag = '$Feld$row['par_wert4']',
//Hier soll er eigentlich z.B. auf den Wert der Var. $Feldgroßabnehmer zugreifen
akt_bem = '$Bem$row['par_wert4']'"
WHERE akt_art = '$row['par_wert1']'
AND kd_id = '$kunde_id' ;";
Doch aufgrund der vielen Klammern gibt es dauert Fehler! Deswegen hab ich es aufgeteilt!
Foreach und array_reverse() kenn ich bisher auch nicht!
Hallo Ulf,
Hui, vielen Dank schon mal für die viele Arbeit!! Also ehrlich gesagt habe ich noch nichts von JOIN gehört bzw genutzt.
ändere dies, ändere es jetzt! Arbeite zunächst einmal Rouvens Einführung durch, meinen Artikel kannst Du Dir noch etwas aufheben :-)
Und ich kenne vielleicht nur einen geringen Bruchteil von PHP Funktionen, da ich bisher nie mit PHP gearbeitet habe!
Hier lege ich Dir das PHP-Handbuch ans Herz, falls Englisch kein Problem ist, solltest Du die englischsprachige Version bevorzugen. Ein weiterer Tipp für Deine Lesezeichen: http://www.php-faq.de/
Eine andere Fehlerbehandlung kenne ich leider nicht! So stand es im quakenet:#php Tutorial.
Tutorials sind gut für den Einstieg in eine Materie, weiterführende Techniken können sie in vielen Fällen nicht vermitteln, da es viel zu viele Möglichkeiten gibt.
Welche Fehlerbehandlung angemessen ist, das hängt von der Anwendung ab, von der Zielgruppe der Anwendung. Ein Administratorentool kann eine andere Fehlerbehandlung erhalten als eine Anwendung für "Endkunden".
// Hast Du hier die Probleme?
// Ich verstehe jedenfalls nicht, was Du hier vorhastJA genau dort liegt das Problem!
Meine Glaskugel war gut informiert. *bg*
Ich sende per Post von der ersten Seite zu dieser! Dort gab es die Felder z.B. $Feldgroßabnehmer und $Bemgroßabnehmer! Diese Namen kommen auch aus einer Tabelle param! ( $Feld + Variabel aus Param )
Hmm, zum einen kommen die Namen bereits aus Tabelleninhalten, zum anderen werden sie bereits einen Schritt vorher umgewandelt. Warum? Ist dies wirklich erforderlich? Um was für Formularfelder handelt es sich? Kann man bereits irgendwo etwas online sehen?
Klar kannst Du es so lösen, wie ich es Dir bereits gepostet habe - jedoch würde ich variable Variablen vermeiden, so gut es geht. In Deinem Fall habe ich das Gefühl, dass es ganz einfach sein müsste, wenn der Ansatz richtig gewählt ist.
Genau den gleichen Vergleich (die Werte der Felder 'akt_art' in Tabelle aktion_bew und 'par_wert1' in Tabelle param gleich ) nutze ich um die Tabelle mit den Werten zu füllen. Und genau diese müssen geupdatet werden!
Um Deinen Vorgehen verstehen und beurteilen zu können, müsste man die Gesamtaufgabe kennen, nicht das, was Du in einem Einzelschritt vorhast.
$querybetrag= "$Feld" . $row['par_wert4'];
$querybem = "$Bem" . $row['par_wert4'];
$queryart =$row['par_wert1'];$queryup[$upx]= "UPDATE aktion_bew
SET akt_betrag = '$querybetrag',
akt_bem = '$querybem'
WHERE akt_art = '$queryart'
AND kd_id = '$kunde_id' ;";Also was dies bedeuten sollte:
$queryup[$upx]= 'UPDATE aktion_bew
SET akt_betrag = '$Feld$row['par_wert4']',
Nochmals die Funktionsweise von variablen Variablen:
$Feldgroßabnehmer = "irgendwas";
$querybetrag = '$Feldgroßabnehmer'; // Beachte die einfachen Hochkomma
// $querybetrag = "\$Feldgroßabnehmer"; // hätte den gleichen Effekt
echo $$querybetrag; // Ausgabe: irgendwas
echo ${$querybetrag}; // gleiche Ausgabe
Vielleicht erläuterst Du uns den Gesamtzusammenhang, so dass wir Dir auch Tipps für einen Lösungsansatz ohne variable Variablen geben können.
Doch aufgrund der vielen Klammern gibt es dauert Fehler! Deswegen hab ich es aufgeteilt!
Könntest Du dies näher erläutern?
Foreach und array_reverse() kenn ich bisher auch nicht!
Mit foreach durchläufst Du alle Elemente eines Arrays. Du willst das Array von hinten nach vorne durchlaufen, also nutze zunächst array_reverse, um die Reihenfolge der Elemente im Array umzukehren.
Natürlich könntest Du das auch eleganter lösen:
Statt einen numerischen Index hochzuzählen, könntest Du die Update-Statements mit array_unshift() jeweils am Anfang Deines Arrays einfügen. Somit steht am Ende Deiner Schleife das zuletzt hinzugefügte Statement am Anfang des Arrays und das zuerst hinzugefügte am Ende. Einfaches Durchlaufen mit foreach sollte nun die Statements in der von Dir gewünschten Reihenfolge liefern.
foreach ($queryup as $query) {
$resultup = mysql_query($query) OR die(mysql_error());
}
statt
while ( $upx != 0 ) {
$resultup = mysql_query($queryup[$upx]) OR die(mysql_error());
$upx = $upx - 1;
}
sieht nicht nur eleganter aus, es entfällt die Gefahr, versehentlich Index-Fehler zu erzeugen oder gar eine Endlosschleife zu produzieren.
Genau bei dieser Schleife solltest Du jedoch auch die Fehlerbehandlungsproblematik erkennen:
Was machst Du, wenn von 20 Updates bereits 10 erfolgreich durchgeführt wurden, das 11. fehlschlägt? Eine Möglichkeit wäre z.B. eine Schreibsperre auf den Datensatz, der Sekundenbruchteile später nicht mehr besteht. Ein erneuter Versuch könnte erfolgreich sein; Dein Skript könnte möglicherweise erfolgreich durchlaufen.
Du brichst jedoch die Ausführung einfach ab. Was weißt Du nun über den Zustand Deiner Datenbank? Ist das schlimm? Wenn ja, welche Strategie fällt Dir dazu ein? Wenn entweder _alle_ oder _gar keine_ Updates durchgeführt werden sollen, so wäre dies ein Fall für Transaktionen. Bei MySQL sind diese an bestimmte Voraussetzungen gebunden.
Verstehst Du nun etwas besser, warum die Fehlerbehandlung bei DB-Fehlern individuell an die Aufgabe angepasst sein sollte?
Freundliche Grüße
Vinzenz