[MySQL] Jeweilige Zeile mit Button updaten
Mbe
- datenbank
Moin,
ich hab gerade mal folgendes Problem:
Ich hab auf meiner Seite z.B. 2 "Zeilen" mit jeweils 3 Textboxen und einem Button, quasi so:
-----------------------------------------------
| TB1 | TB2 | TB3 | Bearbeiten |
-----------------------------------------------
-----------------------------------------------
| TB4 | TB5 | TB6 | Bearbeiten |
-----------------------------------------------
In die Textboxen lasse ich mir mit PHP Daten aus einer Datenbank anzeigen.
Für jeden neuen Eintrag, den man erstellt, wird bei mir automatisch eine neue Zeile mit 3 Textboxen und einem Button auf der Webseite erzeugt/angezeigt.
Wenn ich einen dieser Einträge nun bearbeiten möchte, ändere ich einfach den Wert in der Textbox und klicke anschließend auf den Bearbeiten-Button und das ganze per UPDATE in der Datenbank zu aktualisieren. So zumindest die Theorie...
Allerdings komme ich noch nicht so ganz dahinter wie ich es anstelle, dass auch nur die Zeile geupdatet wird, in der ich auch den Button angeklickt habe.
Kann mir da vielleicht jemand einen kleinen Denkanstoß geben?
Hi Mbe,
Wenn ich einen dieser Einträge nun bearbeiten möchte, ändere ich einfach den Wert in der Textbox und klicke anschließend auf den Bearbeiten-Button und das ganze per UPDATE in der Datenbank zu aktualisieren. So zumindest die Theorie...
Allerdings komme ich noch nicht so ganz dahinter wie ich es anstelle, dass auch nur die Zeile geupdatet wird, in der ich auch den Button angeklickt habe.
Ich hoffe Du hast hinter jeder dieser Zeilen auch den PK aus Deiner Tabelle. Dann einfach das Update mit einer where clausel versehen.
Also
update tabelle set feld1 = tb1, feld2 = tb2, feld3 = tb3 WHERE Tabelle.PK = angezeigterDatensatz.PK
Alternativ kannst Du Dir natürlich auch alle alten Werte merken und dann in der Where feld1 = tb1.alt, feld2 = Tb2.alt.... angeben. Aber dass wäre suboptimal
gruß
emetiel
Hallo,
also im Grunde ist das total einfach.
Du machst um jeden Block (Deine 3 Textfelder mit Button) ein Formular und der bearbeiten Button ist dein Submit Button.
Dazu noch ein Hidden Feld mit der ID des Datensatzes.
Danach musst du nur abfragen ob das Formular gesendet wurde und wenn ja, die 3 Textboxen und die IS auslesen und dann damit dein Update Query schreiben.
Natürlich kannst du für deinem Update Query auch verschiedene Prüfungen machen, z.B. ungültige Zeichen oder ein Leer Textblock usw.
Könntest auch vorher Prüfen ob die übergebene ID überhaupt in der DB vorhanden ist.
Hallo,
also im Grunde ist das total einfach.Du machst um jeden Block (Deine 3 Textfelder mit Button) ein Formular und der bearbeiten Button ist dein Submit Button.
Dazu noch ein Hidden Feld mit der ID des Datensatzes.
Das Problem hierbei ist in meinem Fall nur, dass ich im PHP-Code im Grunde nur eine Tabelle mit den jeweiligen Feldern und dem Button habe.
D.h. ich habe in dieser Tabelle auch nur ein einziges Formular, welches automatisch mit der Tabelle dupliziert wird...
D.h. ich habe in dieser Tabelle auch nur ein einziges Formular, welches automatisch mit der Tabelle dupliziert wird...
Irgend ein unterscheidungsmerkmal brauchst du - du kannst z.B. das Name-Attribut des Buttons auswerten.
D.h. ich habe in dieser Tabelle auch nur ein einziges Formular, welches automatisch mit der Tabelle dupliziert wird...
Irgend ein unterscheidungsmerkmal brauchst du - du kannst z.B. das Name-Attribut des Buttons auswerten.
Und genau da liegt mein Problem, da bei mir quasi exakte Kopien der Textboxen und des Buttons erstellt werdenm, in denen sich lediglich der Inhalt ändert. Ist der name von TB1 name=textbox1", so ist das auch der Name von TB4, TB7, TB10 und so weiter...
Und genau da liegt mein Problem, da bei mir quasi exakte Kopien der Textboxen und des Buttons erstellt werdenm, in denen sich lediglich der Inhalt ändert. Ist der name von TB1 name=textbox1", so ist das auch der Name von TB4, TB7, TB10 und so weiter...
Die exakten Kopien gibst du sicher in einer Schleife aus - was hindert dich daran, einen Zähler einzubauen?
Und genau da liegt mein Problem, da bei mir quasi exakte Kopien der Textboxen und des Buttons erstellt werdenm, in denen sich lediglich der Inhalt ändert. Ist der name von TB1 name=textbox1", so ist das auch der Name von TB4, TB7, TB10 und so weiter...
Die exakten Kopien gibst du sicher in einer Schleife aus - was hindert dich daran, einen Zähler einzubauen?
Mein fehlendes Wissen, schätze ich mal ^^
Wie würde das genau funktionieren? Hab das noch nie gemacht...
Mein fehlendes Wissen, schätze ich mal ^^
Wie würde das genau funktionieren? Hab das noch nie gemacht...
Wie gibst du denn jetzt deine "Kopien" aus?
Mein fehlendes Wissen, schätze ich mal ^^
Wie würde das genau funktionieren? Hab das noch nie gemacht...Wie gibst du denn jetzt deine "Kopien" aus?
So:
while($row = mysql_fetch_object($result))
{
echo "
<table width='100%' class='output_table'>
<tr>
<td width='4%'>
<input type='text' style='width: 100%;' class='output_c_date' name='outputfield_c_date' value='$row->c_date'>
</td>
<td width='30%' title='$row->task'>
<input type='text' style='width: 100%;' class='output_task' name='outputfield_task' value='$row->task'>
</td>
<td width='20%' title='$row->proj'>
<input type='text' style='width: 100%;' class='output_project' name='outputfield_project' value='$row->proj'>
</td>
<td width='16%' title='$row->cust'>
<input type='text' style='width: 100%;' class='output_customer' name='outputfield_customer' value='$row->cust'>
</td>
<td width='5%' align='center'>
$row->cl
</td>
<td width='5%'>
<input type='submit' name='change' value='Bearbeiten' style='width: 100%;'>
</td>
</tr>
</table>
";
$result in der while ist eine procedure, die per SELECT die Daten für die Felder ausgibt.
while($row = mysql_fetch_object($result))
{
<input type='submit' name='change' value='Bearbeiten' style='width: 100%;'>
Das ist der relevante Punkt an dem du ansetzen musst.
Du brauchst einen Zähler den du in der Schleife ausgibst und hochzählst.
die einfachste Variante ist es, vor der Schleife `$zaehler = 1;`{:.language-php} zu definieren.
Das submit-Feld ergänzt du du um `$zaehler`{:.language-php} sodass dessen name change1, change2 usw ist.
Am Ende der Schleife (innerhalb) zählst du den Zähler um eins hoch - am einfachsten ist das mit `$zähler++;`{:.language-php} zu erreichen.
while($row = mysql_fetch_object($result))
{<input type='submit' name='change' value='Bearbeiten' style='width: 100%;'>
>
>
> Das ist der relevante Punkt an dem du ansetzen musst.
>
> Du brauchst einen Zähler den du in der Schleife ausgibst und hochzählst.
>
> die einfachste Variante ist es, vor der Schleife `$zaehler = 1;`{:.language-php} zu definieren.
>
> Das submit-Feld ergänzt du du um `$zaehler`{:.language-php} sodass dessen name change1, change2 usw ist.
>
> Am Ende der Schleife (innerhalb) zählst du den Zähler um eins hoch - am einfachsten ist das mit `$zähler++;`{:.language-php} zu erreichen.
Ok, das hochzählen funktioniert soweit und jeder "Changebutton" hat jetzt seinen eigenen Namen. Wie kann ich in MySQL jetzt angeben, dass wenn ich genau diesen Button anklicke, auch die dazu passende Zeile geändert wird?
Ok, das hochzählen funktioniert soweit und jeder "Changebutton" hat jetzt seinen eigenen Namen. Wie kann ich in MySQL jetzt angeben, dass wenn ich genau diesen Button anklicke, auch die dazu passende Zeile geändert wird?
Dafür musst du aufgrund der Sortierung der Buttons entsprechend den Datensatz updaten, der demselben Index in dieser Reihenfolge entspricht.
Alternativ kannst du anstat change + fortlaufende Nummer change + ID des Datensatzes übergeben. Auf der Serverseite entfernst du dann "change" und hast direkt die richtige ID.
In jedem Fall musst du dich aber gegen Manipulation der Daten absichern - sei es nun eine simple Injection oder aber die banale Modifikation des Requests.
Ok, das hochzählen funktioniert soweit und jeder "Changebutton" hat jetzt seinen eigenen Namen. Wie kann ich in MySQL jetzt angeben, dass wenn ich genau diesen Button anklicke, auch die dazu passende Zeile geändert wird?
Dafür musst du aufgrund der Sortierung der Buttons entsprechend den Datensatz updaten, der demselben Index in dieser Reihenfolge entspricht.
Alternativ kannst du anstat change + fortlaufende Nummer change + ID des Datensatzes übergeben. Auf der Serverseite entfernst du dann "change" und hast direkt die richtige ID.
In jedem Fall musst du dich aber gegen Manipulation der Daten absichern - sei es nun eine simple Injection oder aber die banale Modifikation des Requests.
Irgendwie bekomm ich das einfach nicht gebacken :/
Mein Datensatz hat z.B. die ID 204, der zugehörige Button die Nummer (change)2... wie geht das? :/
Irgendwie bekomm ich das einfach nicht gebacken :/
Mein Datensatz hat z.B. die ID 204, der zugehörige Button die Nummer (change)2... wie geht das? :/
Das Statement welches dir sämtliche Datensätze ausgibt, erweiterst du um eine LIMIT-Klausel die dir die ID eines Datensatzes beginnend ab dem n-ten Datensatz liefert.
Hi!
Irgendwie bekomm ich das einfach nicht gebacken :/
Mein Datensatz hat z.B. die ID 204, der zugehörige Button die Nummer (change)2... wie geht das? :/Das Statement welches dir sämtliche Datensätze ausgibt, erweiterst du um eine LIMIT-Klausel die dir die ID eines Datensatzes beginnend ab dem n-ten Datensatz liefert.
Es geht einfacher und ohne potentielles Problem, denn die Position in der Ergebnismenge könnte sich zwischen Abfragen und Eintragen der Änderungen ändern (zum Beispiel wegen gelöschter Datensätze). Deshalb lieber die ID anstatt einer Position nehmen. Und die ID steht auch schon bei der Abfrage zur Verfügung. Der Zähler für die Position wird auch nicht benötigt.
Die ID wird als Namensbestandteil des Submit-Buttons eingefügt. Als Wert (value) lässt sie sich leider nicht verwenden, denn auf dem Button soll ja "Bearbeiten" stehen.
printf('<input type="submit" name="change[%s]" value="Bearbeiten" />', $row->id');
(Für den Kontextwechsel beim Einfügen der ID brauchen wir nichts weiter zu unternehmen, da die ID immer nummerisch ist, wenn die ID-Spalte vom Typ INT oder vergleichbar ist. Für die anderen Werte sollte das aber unbedingt erfolgen: htmlspecialchars().)
Wenn PHP Klammern [] sieht, legt es ein Array in $_POST/$_GET an. Das empfangene Script bekommt damit die ID quasi wie bei
$_POST['change'][id] = 'Bearbeiten';
übergeben. Der Wert interessiert nicht weiter, aber der Schlüssel vom ersten Eintrag von $_POST['change'] ist die gesuchte ID. Die extrahiert man mit reset($_POST['change']); $id = key($_POST['change']);
Lo!
Die ID wird als Namensbestandteil des Submit-Buttons eingefügt. Als Wert (value) lässt sie sich leider nicht verwenden, denn auf dem Button soll ja "Bearbeiten" stehen.
Das hatte ich bereits erwähnt ;)
Hi!
Die ID wird als Namensbestandteil des Submit-Buttons eingefügt. Als Wert (value) lässt sie sich leider nicht verwenden, denn auf dem Button soll ja "Bearbeiten" stehen.
Das hatte ich bereits erwähnt ;)
Ja, aber du hast zuerst nur eine fortlaufende Nummer und "nebenbei" erwähnt, dass da auch die ID verwendet werden kann. Weiterhin hast du den Namen und die Nummer/ID zu einem String verbunden, der sich als Key im $_POST-Array schwer finden lässt. Denn so ein zusammengesetztes change42 muss man mit foreach und einem Mustervergleich auf change am Anfang suchen. Nimmt man nur change und stellt die ID extra, ist es einfacher in den POST-Daten zu finden, weil ein gezielter Zugriff reicht.
Lo!
Ja, aber du hast zuerst nur eine fortlaufende Nummer und "nebenbei" erwähnt, dass da auch die ID verwendet werden kann. Weiterhin hast du den Namen und die Nummer/ID zu einem String verbunden, der sich als Key im $_POST-Array schwer finden lässt. Denn so ein zusammengesetztes change42 muss man mit foreach und einem Mustervergleich auf change am Anfang suchen. Nimmt man nur change und stellt die ID extra, ist es einfacher in den POST-Daten zu finden, weil ein gezielter Zugriff reicht.
Punkt für dich.
Die ID wird als Namensbestandteil des Submit-Buttons eingefügt. Als Wert (value) lässt sie sich leider nicht verwenden, denn auf dem Button soll ja "Bearbeiten" stehen.
printf('<input type="submit" name="change[%s]" value="Bearbeiten" />', $row->id');
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Der Wert interessiert nicht weiter, aber der Schlüssel vom ersten Eintrag von $_POST['change'] ist die gesuchte ID. Die extrahiert man mit reset($_POST['change']); $id = key($_POST['change']);
Wenn ich das wie angegeben bei mir rein kopiere, bekomm ich 3 Fehlermeldungen:
Warning: reset() [function.reset]: Passed variable is not an array or object in /var/www/db_connect.php on line 31
Warning: key() [function.key]: Passed variable is not an array or object in /var/www/db_connect.php on line 32
Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /var/www/MYSQLoutput.php on line 95
Die ersten 2 Fehlermeldungen verschwinden zwar, wenn ich auf den Bearbeiten-Button klicke, aber so das Wahre ist das trotzdem noch nicht... :)
Im Array steht nun die ID des jeweils gedrückten Buttons drin.
Mit einer procedure werden die Daten dann an die DB gesendet und sollten geupdatet werden - werden sie aber nicht.
So sollte die Tabelle geupdatet werden:
UPDATE ppp_guest_tasks SET task = $output_task, project = $output_project, customer = $output_customer WHERE id = $output_id;
$output_id ist die $ID vom key-Krams da oben...^^
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Wenn du in die Doku von printf guckst, wirst du es verstehen.
es ist nur eine andere, leichter lesbare und flexiblere schreibweise (bzw. eine andere Funktion als echo/print) - der Nachteil ist die geringere Performance - der Vorteil ist die leichtere Lesbarkeit, wenn du sehr viele Parameter/Variablen in den String einfügen musst.
Hi!
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Wenn du in die Doku von printf guckst, wirst du es verstehen.es ist nur eine andere, leichter lesbare und flexiblere schreibweise (bzw. eine andere Funktion als echo/print) - der Nachteil ist die geringere Performance - der Vorteil ist die leichtere Lesbarkeit, wenn du sehr viele Parameter/Variablen in den String einfügen musst.
Die Performance ist vernachlässigbar. Ein einzelnes printf() im Gegensatz zu einem händisch zusammengebauten String macht das Kraut nicht fett. Der Unterschied geht im Grundrauschen unter. Den Vorteil der einfacheren Lesbarkeit als bei einem String-Verknüpfungs-Rein-Raus wiegt jedenfalls der minimale Performance-Verlust nicht auf. Wirklich nutzbringende Verbesserungen, wenn man Performanceprobleme hat, bekommt man üblicherweise an anderen Stellen als einzelnen Stringoperationen.
Lo!
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Wenn du in die Doku von printf guckst, wirst du es verstehen.
es ist nur eine andere, leichter lesbare und flexiblere schreibweise (bzw. eine andere Funktion als echo/print) - der Nachteil ist die geringere Performance - der Vorteil ist die leichtere Lesbarkeit, wenn du sehr viele Parameter/Variablen in den String einfügen musst.
Die Funktion von printf ist mir ja klar, nur versteh ich die Funktion der gesamten Zeile nicht. Wozu dient das [%s] ? Das Gleiche bei $row->id und den reset und key-Funktionen.
Bei der printf-Zeile hätte ich jetzt gesagt, dass Button angezeigt wird und hinten dran die ID aus der Tabelle dran gehängt wird. Ist aber scheinbar nicht so, weil ja nirgendwo die ID ausgegeben wird :)
Aber davon abgesehen hat das Ganze jetzt teilweise funktioniert. Mit dem Bearbeiten-Button kann ich jetzt die jeweils zugehörige Zeile ändern - bis jetzt allerdings nur mit dem Wert aus der zuletzt eingetragenen Zeile. Der Wert der zuletzt hinzugefügten Zeile werden in z.B. $output_task = $_POST['outputfield_task']; (Ausgabetextbox für "Task") gespeichert.
Hier besteht also ein ähnliches Problem, dass nicht der jeweils benötigte Wert dort eingetragen wird.
Und nebenbei:
$output_task = $_POST['outputfield_task'];
oder
$output_task = mysql_real_escape_string($_POST['outputfield_task']);
Die Funktion von printf ist mir ja klar, nur versteh ich die Funktion der gesamten Zeile nicht. Wozu dient das [%s] ?
Das ist widersinnig. Wenn du die Funktion von printf verstehst, weißt du auch was %s bedeutet ;)
Hi!
Die Funktion von printf ist mir ja klar, nur versteh ich die Funktion der gesamten Zeile nicht. Wozu dient das [%s] ? Das Gleiche bei $row->id und den reset und key-Funktionen.
Verwechsle printf() nicht mit print() (ohne f am Ende)! Um die Funktion zu verstehen muss man auch dem Verweis beim Parameter "format" folgen. Da gibt es dann auch jede Menge Erklärung und Beispiele.
Und nebenbei:
$output_task = $_POST['outputfield_task'];
oder
$output_task = mysql_real_escape_string($_POST['outputfield_task']);
Es ist in der Regel unnötig, Variablen anzulegen, wenn man sie dann nur einmal verwenden will. (Ausnahme von der Regel ist beispielsweise das Zusammenbauen eines SQL-Statement-Strings, denn man sich so zur Kontrolle leicht ausgeben lassen kann.) Ansonsten lieb bitte den Artikel zum Kontextwechsel. Kurzform: Dafür sorgen, dass Magic Quotes deaktiviert oder die Eingabewerte wieder davon bereinigt sind und dann beim Einfügen in Stringwerte in SQL-Statmenets mysql_real_escape_string() verwenden.
Lo!
Mahlzeit Mbe,
Du widersprichst Dir:
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Wenn du in die Doku von printf guckst, wirst du es verstehen.
Die Funktion von printf ist mir ja klar, nur versteh ich die Funktion der gesamten Zeile nicht. Wozu dient das [%s] ?
Wenn Du doch die Funktion der Funktion printf verstehst - wieso fragst Du dann nach, wozu das %s dient?
Hast Du in der Dokumentation nachgeschlagen?
MfG,
EKKi
Hi!
printf('<input type="submit" name="change[%s]" value="Bearbeiten" />', $row->id');
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?
Hast du die verlinkte Handbuchseite nicht gelesen? Ich kann sie dir schlecht vorlesen.
Wenn ich das wie angegeben bei mir rein kopiere, bekomm ich 3 Fehlermeldungen:
Warning: reset() [function.reset]: Passed variable is not an array or object in /var/www/db_connect.php on line 31
Warning: key() [function.key]: Passed variable is not an array or object in /var/www/db_connect.php on line 32Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /var/www/MYSQLoutput.php on line 95
Die ersten 2 Fehlermeldungen verschwinden zwar, wenn ich auf den Bearbeiten-Button klicke, aber so das Wahre ist das trotzdem noch nicht... :)
Bist du dir über den Ablauf von Requests und Responses im Klaren? Wertest du den Inhalt von $_POST auch erst dann aus, wenn es was zum Auswerten gibt, also erst, wenn in $_POST etwas enthalten ist. Die Fehlermeldungen treten jedenfalls nicht auf, wenn du meinen Vorschlag richtig verstanden und umgesetzt hast, sowie diesen Code erst im POST-Fall ausführst. Ansonsten frag bitte nach, wenn dir was unklar ist!
Was die dritte Meldung angeht ... die wird daran liegen, dass du einfach nur kopiert hast und dabei den Syntaxfehler mitkopiert hast, den ich beim Tippen übersehen habe.
Im Array steht nun die ID des jeweils gedrückten Buttons drin.
Gemäß meinem Vorschlag steht sie im Key des einzigen Elements von $_POST['change']. Was ergibt die Kontrollausgabe (mit var_dump())?
Mit einer procedure werden die Daten dann an die DB gesendet und sollten geupdatet werden - werden sie aber nicht.
Die Rückgabewerte der verwendeten Funktionen, die dich über den Erfolg oder Misserfolg aufklären wollen, beachtest du? Und Fehlermeldungen hast du gegebenenfalls auch abgefragt?
So sollte die Tabelle geupdatet werden:
UPDATE ppp_guest_tasks SET task = $output_task, project = $output_project, customer = $output_customer WHERE id = $output_id;
Das ist PHP-Code. Wie sieht das Statement aus, das du an MySQL schickst? Mach eine Kontrollausgabe des zusammengesetzten String!
Lo!
Hi!
printf('<input type="submit" name="change[%s]" value="Bearbeiten" />', $row->id');
Was genau macht die Zeile jetzt? Wozu dient das [%s] und wozu steht $row-id am Ende?Hast du die verlinkte Handbuchseite nicht gelesen? Ich kann sie dir schlecht vorlesen.
%s erzeugt ein Array, $row->id wird in das Array geschrieben, richtig so?
Wenn ich das wie angegeben bei mir rein kopiere, bekomm ich 3 Fehlermeldungen:
Warning: reset() [function.reset]: Passed variable is not an array or object in /var/www/db_connect.php on line 31
Warning: key() [function.key]: Passed variable is not an array or object in /var/www/db_connect.php on line 32Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /var/www/MYSQLoutput.php on line 95
Die ersten 2 Fehlermeldungen verschwinden zwar, wenn ich auf den Bearbeiten-Button klicke, aber so das Wahre ist das trotzdem noch nicht... :)
Bist du dir über den Ablauf von Requests und Responses im Klaren? Wertest du den Inhalt von $_POST auch erst dann aus, wenn es was zum Auswerten gibt, also erst, wenn in $_POST etwas enthalten ist. Die Fehlermeldungen treten jedenfalls nicht auf, wenn du meinen Vorschlag richtig verstanden und umgesetzt hast, sowie diesen Code erst im POST-Fall ausführst. Ansonsten frag bitte nach, wenn dir was unklar ist!
Hätte ich sie an die richtige Stelle gesetzt, hätte ich mir die Frage auch sparen können - jetzt funktioniert alles, wie es soll :)
Was die dritte Meldung angeht ... die wird daran liegen, dass du einfach nur kopiert hast und dabei den Syntaxfehler mitkopiert hast, den ich beim Tippen übersehen habe.
Fehler schon behoben, hat sich also auch erledigt^^
Im Array steht nun die ID des jeweils gedrückten Buttons drin.
Gemäß meinem Vorschlag steht sie im Key des einzigen Elements von $_POST['change']. Was ergibt die Kontrollausgabe (mit var_dump())?
Mit einer procedure werden die Daten dann an die DB gesendet und sollten geupdatet werden - werden sie aber nicht.
Die Rückgabewerte der verwendeten Funktionen, die dich über den Erfolg oder Misserfolg aufklären wollen, beachtest du? Und Fehlermeldungen hast du gegebenenfalls auch abgefragt?
So sollte die Tabelle geupdatet werden:
UPDATE ppp_guest_tasks SET task = $output_task, project = $output_project, customer = $output_customer WHERE id = $output_id;Das ist PHP-Code. Wie sieht das Statement aus, das du an MySQL schickst? Mach eine Kontrollausgabe des zusammengesetzten String!
Mittlerweile funktioniert die Übergabe bzw. das Ändern per ID - teilweise.
In meinem anderen Beitrag hatte ich schon geschrieben, dass die Textboxen jetzt zwar nach jeweiligem Button+ID geändert werden, allerdings werden nur die Werte eingetragen, die in der zuletzt hinzugefügten Zeile stehen und nicht in der, die man gerade bearbeitet...
Hi!
printf('<input type="submit" name="change[%s]" value="Bearbeiten" />', $row->id');
%s erzeugt ein Array, $row->id wird in das Array geschrieben, richtig so?
Nein, %s ist ein Platzhalter für einen String. Alle Parameter von (s)printf() ab dem zweiten werden jeweils anstelle eines der Platzhalter eingefügt. In dem Fall nur das $row->id anstatt des einzigen %s.
An dieser Stelle wird lediglich ein String zusammengesetzt, den der Browser dann als HTML interpretieren kann. Hast du dir im Browser die Quellcodeansicht zu Gemüte geführt und da change[5], change[23], change[42], und so weiter bei den einzelnen Werten der name-Attribute deiner Submit-Buttons gesehen?
Noch später erkennt PHP das [] nach change und legt nicht
$_POST['change'] = 'Bearbeiten';
an sondern
$_POST['change'][23] = 'Bearbeiten';
Wobei anstatt der 23 die tatsächliche ID vom Datensatz steht. Eine Kontrollausgabe mit var_dump($_POST) zeigt, ob das wirklich so ist.
In meinem anderen Beitrag hatte ich schon geschrieben, dass die Textboxen jetzt zwar nach jeweiligem Button+ID geändert werden, allerdings werden nur die Werte eingetragen, die in der zuletzt hinzugefügten Zeile stehen und nicht in der, die man gerade bearbeitet...
Achja, du müsstest die selbe Lösung wie beim Submit-Button nehmen, also die name-Attribute der Input-Felder auch um die Datensatz-ID erweitern. Der Grund ist, dass alle Input-Elemente eines Feldes die gleichen Namen haben und das nächste immer das vorhergehende überschreibt. Die Kontrollausgabe zeigt, die nach der Erweiterung alle Elemente an und nicht nur eins. Durch das reset()/key() vom Submit-Button hast du bereits die ID ermittelt, und mit der kannst du dann die zugehörigen anderen Elemente gezielt ansprechen.
Lo!
In meinem anderen Beitrag hatte ich schon geschrieben, dass die Textboxen jetzt zwar nach jeweiligem Button+ID geändert werden, allerdings werden nur die Werte eingetragen, die in der zuletzt hinzugefügten Zeile stehen und nicht in der, die man gerade bearbeitet...
Achja, du müsstest die selbe Lösung wie beim Submit-Button nehmen, also die name-Attribute der Input-Felder auch um die Datensatz-ID erweitern. Der Grund ist, dass alle Input-Elemente eines Feldes die gleichen Namen haben und das nächste immer das vorhergehende überschreibt. Die Kontrollausgabe zeigt, die nach der Erweiterung alle Elemente an und nicht nur eins. Durch das reset()/key() vom Submit-Button hast du bereits die ID ermittelt, und mit der kannst du dann die zugehörigen anderen Elemente gezielt ansprechen.
Ist in dem Fall printf immer noch die beste Lösung? Es hieß ja, dass sich printf stärker auf die Performance auswirken kann/soll, und da ich es ja jetzt relativ häufig verwenden müsste, wollte ich da lieber nochmal sicher gehen :)
Hi!
Ist in dem Fall printf immer noch die beste Lösung? Es hieß ja, dass sich printf stärker auf die Performance auswirken kann/soll, und da ich es ja jetzt relativ häufig verwenden müsste, wollte ich da lieber nochmal sicher gehen :)
"Stärker" ist sicher stark übertrieben, wenn überhaupt. Ich messe es wegen Irrelevanz nicht nach. Das bewegt sich bei wenigen Ausführungen irgendwo im kaum messbaren Bereich. Deine Arbeitszeit beim Code-Lesen und Nicht-Verheddern bei der Zeichensetzung von aneinandergefügten Strings ist wichtiger.
"Releativ häufig" mit spürbaren Auswirkungen ist irgendwo ab (pessimistisch geschätzt) vierstelligen Größenordnungen aufwärts.
Lo!
Hi!
Ist in dem Fall printf immer noch die beste Lösung? Es hieß ja, dass sich printf stärker auf die Performance auswirken kann/soll, und da ich es ja jetzt relativ häufig verwenden müsste, wollte ich da lieber nochmal sicher gehen :)
"Stärker" ist sicher stark übertrieben, wenn überhaupt. Ich messe es wegen Irrelevanz nicht nach. Das bewegt sich bei wenigen Ausführungen irgendwo im kaum messbaren Bereich. Deine Arbeitszeit beim Code-Lesen und Nicht-Verheddern bei der Zeichensetzung von aneinandergefügten Strings ist wichtiger.
"Releativ häufig" mit spürbaren Auswirkungen ist irgendwo ab (pessimistisch geschätzt) vierstelligen Größenordnungen aufwärts.
Nächstes Problem:
Man kann style="width: 30%;" scheinbar nicht mit printf/[%s] benutzen, da sonst die Fehlermeldung "Too few arguments" erscheint...
Außerdem hab ich in dem input-Feld ja auch noch value='$row->task' stehen. Da gibts allerdings wegen den ' auch wieder Fehler...
Mahlzeit Mbe,
Man kann style="width: 30%;" scheinbar nicht mit printf/[%s] benutzen, da sonst die Fehlermeldung "Too few arguments" erscheint...
Man will das ja auch gar nicht ... man will CSS-Regeln da definieren, wo sie hingehören: im Stylesheet.
Außerdem hab ich in dem input-Feld ja auch noch value='$row->task' stehen. Da gibts allerdings wegen den ' auch wieder Fehler...
In dem Fall will man sich über Kontextwechsel und die damit verbundenen Probleme informieren ...
MfG,
EKKi
Mahlzeit Mbe,
Man kann style="width: 30%;" scheinbar nicht mit printf/[%s] benutzen, da sonst die Fehlermeldung "Too few arguments" erscheint...
Man will das ja auch gar nicht ... man will CSS-Regeln da definieren, wo sie hingehören: im Stylesheet.
Ist mir kurz nachdem ich den Beitrag geschrieben hab, auch eingefallen :)
Außerdem hab ich in dem input-Feld ja auch noch value='$row->task' stehen. Da gibts allerdings wegen den ' auch wieder Fehler...
In dem Fall will man sich über Kontextwechsel und die damit verbundenen Probleme informieren ...
Ebenfalls behoben, danke für den Link!
Letztes Problem (hoffentlich):
print_r($_POST);
gibt folgendes aus, wenn ich eine Zeile bearbeiten will:
Array ( [outputfield_credate] => 2010-03-31
[outputfield_task] => Array ( [223] => 123 [224] => 2 [225] => 3 [226] => 4 )
[outputfield_project] => Array ( [223] => 123 [224] => 2 [225] => 3 [226] => 4 )
[outputfield_customer] => Array ( [223] => 123 [224] => 2 [225] => 3 [226] => 4 ) [change] => Array ( [223] => Bearbeiten ) )
In Task sollte nun eigentlich 123 stehen, stattdessen steht dort aber Array. Und auch nur, wenn ich die erste Zeile bearbeiten will. Bearbeite ich z.B. die zweite Zeile, steht dort der Ausgangswert, aber nicht z.B. Array.
Bei meiner Procedure werden die IDs eigentlich mit übergeben:
$result = mysql_query ("CALL ppp_guest_updatetask('$output_task', '$output_taskid', '$output_project', '$output_projectid', '$output_customer', '$output_customerid', '$user', '$output_id')")
und werden in MySQL auch entgegen genommen.
Zum Updaten (z.B.):
UPDATE ppp_guest_tasks SET task = $output_task, project = $output_project, customer = $output_customer WHERE id = $output_id AND id = $output_taskid;
Hi!
Letztes Problem (hoffentlich):
print_r($_POST);
gibt folgendes aus, wenn ich eine Zeile bearbeiten will:
Wenn du da ein <pre> voranstellst oder dir die Ausgabe in der Quelltextansicht des Browsers anschaust, wird es übersichtlicher und vielleicht auch klarer was durch die Änderung passiert ist:
Array (
[outputfield_credate] => 2010-03-31
[outputfield_task] => Array (
[223] => 123
[224] => 2
[225] => 3
[226] => 4
)
[outputfield_project] => Array (
[223] => 123
[224] => 2
[225] => 3
[226] => 4
)
[outputfield_customer] => Array (
[223] => 123
[224] => 2
[225] => 3
[226] => 4
)
[change] => Array (
[223] => Bearbeiten
)
)
Das Problem bei
<input type="text" name="outputfield_task[223]" value="123">...<input type="submit" name="change[223]" value="Bearbeiten">
für den ersten Datensatz und
<input type="text" name="outputfield_task[224]" value="2">...<input type="submit" name="change[224]" value="Bearbeiten">
für den zweiten und so weiter ist, dass du beim Klick auf den Submitbutton nicht sagen kannst, gib mir nur die Felder aus meiner Zeile, ignoriere aber die anderen. (Geht schon, aber nur mit Javascript.) Deshalb musst du alle Datensätze zurückliefern lassen und nicht nur einen, darfst aber nur die von zugehörigen Button verarbeiten. PHP fasst nun alle outputfield_*-Felder mit den [] hintendran bei gleichem Namensanfang zu einem Array zusammen. Und du musst jetzt nicht $_POST['outputfield_task'] verarbeiten (was als String ausgegeben nur "Array" liefert) sondern $_POST['outputfield_task'][$id_vom_submit_button] und so weiter.
Lo!
Das Problem bei
<input type="text" name="outputfield_task[223]" value="123">...<input type="submit" name="change[223]" value="Bearbeiten">
für den ersten Datensatz und
<input type="text" name="outputfield_task[224]" value="2">...<input type="submit" name="change[224]" value="Bearbeiten">
für den zweiten und so weiter ist, dass du beim Klick auf den
Submitbutton nicht sagen kannst, gib mir nur die Felder aus meiner Zeile, »» ignoriere aber die anderen. (Geht schon, aber nur mit Javascript.)
Deshalb musst du alle Datensätze zurückliefern lassen und nicht nur
einen, darfst aber nur die von zugehörigen Button verarbeiten.
Wie mache ich das?
PHP fasst nun alle outputfield_*-Felder mit den [] hintendran bei
gleichem Namensanfang zu einem Array zusammen. Und du musst jetzt nicht »» $_POST['outputfield_task'] verarbeiten (was als String ausgegeben nur
"Array" liefert) sondern $_POST['outputfield_task']
[$id_vom_submit_button] und so weiter.
also hieße das dann $output_task = $_POST['outputfield_task'][output_id];
? Oder wie ist das gemeint?
Hi!
Deshalb musst du alle Datensätze zurückliefern lassen und nicht nur einen, darfst aber nur die von zugehörigen Button verarbeiten.
Wie mache ich das?
Das passiert ja schon und führt zu dem Array, das du mit print_r() gesehen hast und ich übersichtlicher formatiert habe.
also hieße das dann
$output_task = $_POST['outputfield_task'][output_id];
? Oder wie ist das gemeint?
Genau. Statt output_id natürlich die vom Submit-Button ermittelte.
Lo!
Hi!
Deshalb musst du alle Datensätze zurückliefern lassen und nicht nur einen, darfst aber nur die von zugehörigen Button verarbeiten.
Wie mache ich das?Das passiert ja schon und führt zu dem Array, das du mit print_r() gesehen hast und ich übersichtlicher formatiert habe.
also hieße das dann
$output_task = $_POST['outputfield_task'][output_id];
? Oder wie ist das gemeint?Genau. Statt output_id natürlich die vom Submit-Button ermittelte.
Ist die ID des Buttons nicht die, die ich mit
reset($_POST['change']);
$output_id = key($_POST['change']);
bekomme?
Hi!
Ist die ID des Buttons nicht die, die ich mit [...] bekomme?
Genau das ist die. Da du aber das $ vor den Variablennamen vergessen hattest hinzuschreiben, nahm ich an, du meintest output_id als Platzhalter. Als
$output_task = $_POST['outputfield_task'][$output_id];
wäre diese Zeile in Ordnung.
Lo!
Hi!
Ist die ID des Buttons nicht die, die ich mit [...] bekomme?
Genau das ist die. Da du aber das $ vor den Variablennamen vergessen hattest hinzuschreiben, nahm ich an, du meintest output_id als Platzhalter.
Achso, ja, sorry, hab ich wohl vergessen^^
Als
$output_task = $_POST['outputfield_task'][$output_id];
wäre diese Zeile in Ordnung.
Alles klar, jetzt funktioniert alles wunderbar nachdem ich endlich festgestellt hatte, dass bei
$output_task = $_POST['outputfield_task'][$output_id];
etc noch gar kein $output_id bekannt war, weils erst unter der Zeile eben mit reset/key erstellt wurde... DAU lässt grüßen^^
Aber egal, jetzt läuft es!
Eine Frage hätte ich allerdings noch: Im Moment besteht ja jedes Eingabefeld aus einem eigenen Array (nehm ich wegen print_r($_POST);
einfach mal an). Wäre es nun möglich, eine gesamte Zeile in ein Array (wenn es denn eins ist) zu speichern, sodass ich nicht mehr für jedes Eingabefeld eine ID habe, sondern nur noch für jede Zeile?
Keine Ahnung ob das einen Unterschied macht, aber interessieren würde es mich schon.
Hi!
Im Moment besteht ja jedes Eingabefeld aus einem eigenen Array (nehm ich wegen
print_r($_POST);
einfach mal an). Wäre es nun möglich, eine gesamte Zeile in ein Array (wenn es denn eins ist) zu speichern, sodass ich nicht mehr für jedes Eingabefeld eine ID habe, sondern nur noch für jede Zeile?
Ja, dazu musst du den Namen geeignet umbauen: statt foo_bar[id] und foo_qux[id] wäre foo[id][bar] und foo[id][qux] zielführend. Was das bewirkt siehst du in der print_r()-Ausgabe.
Lo!
Hi!
Nächstes Problem:
Man kann style="width: 30%;" scheinbar nicht mit printf/[%s] benutzen, da sonst die Fehlermeldung "Too few arguments" erscheint...
Das ist ein weiterer kleiner Nachteil von (s)printf(), man muss ein einzelnes % als %% notieren. Das Problem entfällt aber, wenn du, wie Ekki schon sagte, das CSS auslagerst.
Außerdem hab ich in dem input-Feld ja auch noch value='$row->task' stehen. Da gibts allerdings wegen den ' auch wieder Fehler...
Wenn man einen String in ' einschließt, muss man darin enthaltene ' als ' und \ als \ notieren. Das ist Grundlagenwissen.
Für HTML kann man ja als Attributbegrenzer ' und " verwenden. Wenn du dafür nun " nimmst, kommen die sich nicht mit den einschließenden ' ins Gehege. Eine Alternative wäre, "" zum äußeren Einfassen und '' für innen. Besser ist es aber "" für die HTML-Attribute vorzusehen, denn dann kann man mit einem einfachen htmlspecialchars($delinquent) für den gefahrlosen Kontextwechsel sorgen und muss nicht mit dem ENT_QUOTES-Flag nachhelfen.
Lo!
Ist in dem Fall printf immer noch die beste Lösung?
Ja.
Es hieß ja, dass sich printf stärker auf die Performance auswirken kann/soll, und da ich es ja jetzt relativ häufig verwenden müsste, wollte ich da lieber nochmal sicher gehen :)
printf ist im schnitt etwa 25 % langsamer als echo oder print.
Das hört sich viel an, ist aber die dedlfix schon sagte nichts - wir bewegen uns hier im µs Bereich - es ist ziemlich egal obein Funktionsraufruf jetzt 0,0000035 oder 0,0000045 Sekunden benötigt - auch wenn du viele davon hast ;)
Solche überlegungen sind nur sinnvoll, wenn du extrem viele davon hast.