Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Problem - UPDATE -String mit implode zusammenstellen
Frage
Hey,
wie die Überschrift schon sagt habe ich das Problem den UPDATE - String mit Hilfe mit implode zu erstellen.
Ich schreibe mittels PHP geänderte Daten in ein mehrdimensionales Array test[] und möchte diese Daten in meiner MySQL-Datenbank speichern.
Ich habe es so versucht:
$bTmp= array();
foreach ($_POST[test] as $1) {
foreach ($val1 as $k2 => $v2) {
$bTmp[$k2]= $v2;
if (count($bTmp)== 1) {
$query = 'UPDATE tabelle SET '. implode('\', \'', array_keys($bTmp)). ' = \''. implode('\', \'', $bTmp). '\' ';
$query .= 'WHERE id_spalte = \'3\'';
$bTmp= array();
}
}
}
Somit wird für jeden Werte ein UPDATE-String erstellt, aber leider funktioniert das Speichern in der DB nicht. Wenn ich mir einen dieser Strings manuell in der DB eingebe wird aber gespeichert.
Wo ist mein Denkfehler oder wie kann es besser machen?
MfG
Ingrid L.
Antwort 1 von rabies
Hallo!
In Deinem Code befinden sich mehrere fragwürdige Stellen:
$_POST['test'] wird mit hoher Wahrscheinlichkeit kein Array sein. Von daher macht es an dieser Stelle wenig Sinn, mit foreach darüber zu iterieren.
$1 kann zwar funktionieren. Muss aber nicht. Variablen sollten in PHP entweder mit einem Unterstrich oder einem Buchstaben anfangen. Nicht aber mit einer Zahl.
Was steht in $val1? Das wird in Deinem Code-Schnippsel leider nicht gezeigt.
Wieso count($bTmp) == 1? Es macht dann wenig Sinn, überhaupt zu iterieren. Dann könntest Du auch gleich auf das erste Element von $bTmp zugreifen und Dir Value sowie Schlüssel holen.
Dein zusammengebasteltes SQL-Statement würde in etwa folgendes ergeben:
Du solltest eventuell näher erläutern, was genau Du vorhast, welche Werte übergeben werden, und welche wohin gespeichert werden sollen.
Zudem fehlt komplett der mysql_*-Teil. Aber ich denke, den hast Du nur nicht mit kopiert, richtig?
--rabies.
In Deinem Code befinden sich mehrere fragwürdige Stellen:
UPDATE tabelle SET 'a', 'b', 'c' = 1, 2, 3 Richtig wäre aber: UPDATE tabelle SET 'a' = 1, 'b' = 2, 'c' = 3Du solltest eventuell näher erläutern, was genau Du vorhast, welche Werte übergeben werden, und welche wohin gespeichert werden sollen.
Zudem fehlt komplett der mysql_*-Teil. Aber ich denke, den hast Du nur nicht mit kopiert, richtig?
--rabies.
Antwort 2 von IngridL.
hallo rabies,
hole Daten aus MySQL stelle sie auf HTML Seite dar so das sie geändert werden können. Tabelle hat 4 Spalten. Die Werte werden in $test[] gespeichert und an den Skript gesendet, welcher die Daten aus dem Array in der DB speichern soll.
ist ein Array
$!1 = $val1 mein Fehler :)
ja.... eigentlich count($bTmp) == 4 weil 4 Spalten in einer Zeile
genau das ist das problem, es sollte eigentlich wie du schon sagst UPDATE tabelle SET 'a' = 1, 'b' = 2, 'c' = 3 entstehen. Aber ich bekomme es nicht hin.
hole Daten aus MySQL stelle sie auf HTML Seite dar so das sie geändert werden können. Tabelle hat 4 Spalten. Die Werte werden in $test[] gespeichert und an den Skript gesendet, welcher die Daten aus dem Array in der DB speichern soll.
Zitat:
In Deinem Code befinden sich mehrere fragwürdige Stellen:
$_POST['test'] wird mit hoher Wahrscheinlichkeit kein Array sein. Von daher macht es an dieser Stelle wenig Sinn, mit foreach darüber zu iterieren.
In Deinem Code befinden sich mehrere fragwürdige Stellen:
$_POST['test'] wird mit hoher Wahrscheinlichkeit kein Array sein. Von daher macht es an dieser Stelle wenig Sinn, mit foreach darüber zu iterieren.
ist ein Array
Zitat:
$1 kann zwar funktionieren. Muss aber nicht. Variablen sollten in PHP entweder mit einem Unterstrich oder einem Buchstaben anfangen. Nicht aber mit einer Zahl.
Was steht in $val1? Das wird in Deinem Code-Schnippsel leider nicht gezeigt.
$1 kann zwar funktionieren. Muss aber nicht. Variablen sollten in PHP entweder mit einem Unterstrich oder einem Buchstaben anfangen. Nicht aber mit einer Zahl.
Was steht in $val1? Das wird in Deinem Code-Schnippsel leider nicht gezeigt.
$!1 = $val1 mein Fehler :)
Zitat:
Wieso count($bTmp) == 1? Es macht dann wenig Sinn, überhaupt zu iterieren. Dann könntest Du auch gleich auf das erste Element von $bTmp zugreifen und Dir Value sowie Schlüssel holen.
Wieso count($bTmp) == 1? Es macht dann wenig Sinn, überhaupt zu iterieren. Dann könntest Du auch gleich auf das erste Element von $bTmp zugreifen und Dir Value sowie Schlüssel holen.
ja.... eigentlich count($bTmp) == 4 weil 4 Spalten in einer Zeile
Zitat:
Dein zusammengebasteltes SQL-Statement würde in etwa folgendes ergeben:
UPDATE tabelle SET 'a', 'b', 'c' = 1, 2, 3
Dein zusammengebasteltes SQL-Statement würde in etwa folgendes ergeben:
UPDATE tabelle SET 'a', 'b', 'c' = 1, 2, 3
genau das ist das problem, es sollte eigentlich wie du schon sagst UPDATE tabelle SET 'a' = 1, 'b' = 2, 'c' = 3 entstehen. Aber ich bekomme es nicht hin.
Antwort 3 von son_quatsch
Nunja: Ein implode() verklebt alle Feldelemente zu einem String - logischerweise stehen in deinem zusammengesetzten Text auf der einen Seite alle Spalten und auf der anderen sämtliche Werte - statt ineinander verwoben. Zusätzlich ist die Schreibweise feld[element] falsch. Dieser Fall setzt voraus, dass element eine Konstante wäre (aber ich nehme an, die definierst du nirgends). Korrekt ist immer feld['element'] oder natürlich über einen Integer-Wert (feld[4711]) oder über eine Variable (feld[$element]). Das ist ein grundsätzlich fehlendes Verständnis bei vielen und es gibt Situationen, wo das mächtig in die Hose gehen kann.
SQL ist eigentlich dasselbe: wie sind die einzelnen Spalten definiert? Ein String steht immer in einfachen Anführungszeichen (SELECT spalte FROM tab WHERE spalte= 'text';), wohingegen Zahlen nicht darin eingeschlossen werden sollten (SELECT spalte FROM tab WHERE spalte= 1;). Insofern hab ich deine WHERE-Klausel ohne Anführungsstriche ausgeführt.
SQL ist eigentlich dasselbe: wie sind die einzelnen Spalten definiert? Ein String steht immer in einfachen Anführungszeichen (SELECT spalte FROM tab WHERE spalte= 'text';), wohingegen Zahlen nicht darin eingeschlossen werden sollten (SELECT spalte FROM tab WHERE spalte= 1;). Insofern hab ich deine WHERE-Klausel ohne Anführungsstriche ausgeführt.
foreach ( $_POST['test'] as $val1 ) {
if ( count( $val1 )== 4 ) {
$query= 'UPDATE tabelle SET ';
foreach ( $_POST['test'] as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
...$query ausführen
}
}Antwort 4 von IngridL.
hallo son_quatsch,
DANKE für Deine Hilfe.
Leider funkioniert es nicht. mysql_affected_rows() liefert -1 zurück.
mysql_db_query("DB", "$query"); ?
diese zeile verstehe ich garnicht. Bitte erläutere sie mir kurz.
DANKE für Deine Hilfe.
Leider funkioniert es nicht. mysql_affected_rows() liefert -1 zurück.
Zitat:
...$query ausführen
...$query ausführen
mysql_db_query("DB", "$query"); ?
Zitat:
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
diese zeile verstehe ich garnicht. Bitte erläutere sie mir kurz.
Antwort 5 von rabies
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';Diese Zeile entfernt einfach nur die letzten beiden Zeichen, die an $query angehangen wurden. Also ", ". Komma und Leerzeichen.
Zu mysql_affected_rows():
Setz mal hinter mysql_db_query() ein or die(mysql_error());
Eventuell erhälst Du dann nähere Informationen, warum und weshalb das Statement nicht funktioniert hat/nichts in die Datenbank eingefügt wurde.
Zum späteren Einsatz, wenn das ganze produktiv läuft, solltest Du or die natürlich wieder entfernen, da nicht jedermann Fehlermeldungen direkt von der Datenbank sehen sollte.
--rabies.
Antwort 6 von IngridL.
Zitat:
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
Diese Zeile entfernt einfach nur die letzten beiden Zeichen, die an $query angehangen wurden. Also ", ". Komma und Leerzeichen.
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
Diese Zeile entfernt einfach nur die letzten beiden Zeichen, die an $query angehangen wurden. Also ", ". Komma und Leerzeichen.
DANKE
Zitat:
Zu mysql_affected_rows():
Setz mal hinter mysql_db_query() ein or die(mysql_error());
Zu mysql_affected_rows():
Setz mal hinter mysql_db_query() ein or die(mysql_error());
mysql_db_query("DB", "$query") or print "MySQL-Error: ".mysql_errno()." -> ".mysql_error()."<br>\n";
Bringt keine Fehlermeldung
Antwort 7 von rabies
or print? Kann man das denn so schreiben?
Folgende Schreibweise wäre kenne ich nur:
Folgende Schreibweise wäre kenne ich nur:
mysql_db_query("DB", "$query") or die("MySQL-Error: ".mysql_errno()." -> ".mysql_error());Antwort 8 von son_quatsch
Außerdem kannst du in der Dokumentation nachlesen, z.B. http://de.php.net/manual/de/function.substr.php (oben in das Suchfeld einfach den Funktionsnamen eintragen). Mit jeweils vielen Beispielen und dutzenden an Kommentaren.
Und der Vorbeugung weiterer Fehler gleich mal ein kompletter Code mit Datenbankanbindung (natürlich musst du "user", "pass", "DB" und ggf. "localhost" anpassen):
Und der Vorbeugung weiterer Fehler gleich mal ein kompletter Code mit Datenbankanbindung (natürlich musst du "user", "pass", "DB" und ggf. "localhost" anpassen):
mysql_connect( 'localhost', 'user', 'pass' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
foreach ( $_POST['test'] as $val1 ) {
if ( count( $val1 )== 4 ) {
$query= 'UPDATE tabelle SET ';
foreach ( $_POST['test'] as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
}
}Antwort 9 von son_quatsch
Die Konstruktion "or die()" ist einzig möglich.
Wenn hier einer mit print() oder sonstwas experimentieren möchte, muss er mit der exakten Gleichheit prüfen, z.B.:
Wenn hier einer mit print() oder sonstwas experimentieren möchte, muss er mit der exakten Gleichheit prüfen, z.B.:
Zitat:
if ( mysql_query( $query )=== false ) print( 'SQL-Fehler: '. mysql_error() );
if ( mysql_query( $query )=== false ) print( 'SQL-Fehler: '. mysql_error() );
Antwort 10 von IngridL.
Zitat:
mysql_connect( 'localhost', 'user', 'pass' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
foreach ( $_POST['test'] as $val1 ) {
if ( count( $val1 )== 4 ) {
$query= 'UPDATE tabelle SET ';
foreach ( $_POST['test'] as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
}
}
mysql_connect( 'localhost', 'user', 'pass' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
foreach ( $_POST['test'] as $val1 ) {
if ( count( $val1 )== 4 ) {
$query= 'UPDATE tabelle SET ';
foreach ( $_POST['test'] as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
}
}
habe es genauso mit angepasster ( 'localhost', 'user', 'pass' ) probiert, leider ohne Erfolg :(
Antwort 11 von rabies
Keine Fehlermeldungen oder ähnliches?
Antwort 12 von rabies
Hast Du Dir den Inhalt von $_POST['test'], wie er übergeben wird, schon einmal detailiert angeschaut?
print_r($_POST['test']);
Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.
print_r($_POST['test']);
Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.
Antwort 13 von IngridL.
Zitat:
Keine Fehlermeldungen oder ähnliches?
Keine Fehlermeldungen oder ähnliches?
nein, das wundert mich ja auch!
Das einzigste was angezeigt wird ist -1 Datensätze geändert!
weil ich mit mysql_affected_rows(); abfrage wieviel Zeilen geändert wurden.
error_reporting(E_ALL); habe ich auch aber es kommt keine Fehlermeldung !
Antwort 14 von IngridL.
Zitat:
Hast Du Dir den Inhalt von $_POST['test'], wie er übergeben wird, schon einmal detailiert angeschaut?
print_r($_POST['test']);
Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.
Hast Du Dir den Inhalt von $_POST['test'], wie er übergeben wird, schon einmal detailiert angeschaut?
print_r($_POST['test']);
Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.
Ja Daten werden richtig übertragen
Antwort 15 von IngridL.
Guten Morgen,
habe gestern Abend nochmals getestet, es geht leider immernoch nicht. Aber was mir aufgefallen ist, ist das ich
habe gestern Abend nochmals getestet, es geht leider immernoch nicht. Aber was mir aufgefallen ist, ist das ich
Zitat:
echo"query:$query";
nicht ausgeben kann. Noch nicht einmal das Wort query: erscheint.echo"query:$query";
Antwort 16 von son_quatsch
Dann machen wir etwas grundsätzliches:
<?php echo "hallo"; ?>Exakt als eine Datei abspeichern und aufrufen. Kommt ein Text? Wenn ja, dann poste hier mal bitte deine komplette PHP-Datei (und in [ code ]...[ /code ]-Blöcke bitte einschließen)Antwort 17 von IngridL.
error_reporting(E_ALL);
print_r($_POST['test']);
//
mysql_connect( 'localhost', 'user', 'pw' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
foreach ( $_POST['test'] as $val1 ) {
if ( count( $val1 )== 4 ) {
$query= 'UPDATE Tabelle SET ';
foreach ( $_POST['test'] as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
echo"<br>query:$query";
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
}
}
$GMA = mysql_affected_rows();
if ($GMA < 0)
{
echo mysql_affected_rows() . ' Datensätze geändert!';
}
else
{
echo mysql_affected_rows() . ' Datensätze nicht geändert!';
}
Antwort 18 von son_quatsch
Also zwei grundlegende Sachen:
Ersetze die beiden bestehenden Zeilen bitte mit folgenden drei und achte genau auf die Schreibweise - am besten kopieren:
- Wenn das wirklich der gesamte Inhalt der Datei ist, dann fehlen die <?php ... ?>-Tags.
- Ich bin mir nicht sicher, ob man mysql_affected_rows() mehrfach aufrufen kann. Deren Anzeige gilt auch nicht kumulativ - du musst sie nach jedem Query bereits aufrufen. Und unlogisch ist deine IF-Verzweigung auch, denn die Funktion kann keine Aussage darüber treffen, wieviele Datensätze nicht geändert wurden.
Ersetze die beiden bestehenden Zeilen bitte mit folgenden drei und achte genau auf die Schreibweise - am besten kopieren:
echo '<br />query: '. $query;
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';Antwort 19 von IngridL.
Zitat:
Also zwei grundlegende Sachen:
Wenn das wirklich der gesamte Inhalt der Datei ist, dann fehlen die <?php ... ?>-Tags.
Ich bin mir nicht sicher, ob man mysql_affected_rows() mehrfach aufrufen kann. Deren Anzeige gilt auch nicht kumulativ - du musst sie nach jedem Query bereits aufrufen. Und unlogisch ist deine IF-Verzweigung auch, denn die Funktion kann keine Aussage darüber treffen, wieviele Datensätze nicht geändert wurden.
Also zwei grundlegende Sachen:
Wenn das wirklich der gesamte Inhalt der Datei ist, dann fehlen die <?php ... ?>-Tags.
Ich bin mir nicht sicher, ob man mysql_affected_rows() mehrfach aufrufen kann. Deren Anzeige gilt auch nicht kumulativ - du musst sie nach jedem Query bereits aufrufen. Und unlogisch ist deine IF-Verzweigung auch, denn die Funktion kann keine Aussage darüber treffen, wieviele Datensätze nicht geändert wurden.
1.) ok, die sind natürlich auch dabei
2.) nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { } rausnehme.
Hier nochmal die ganze Datei:
<?php
error_reporting(E_ALL);
print_r($_POST['test']);
//
mysql_connect( 'localhost', 'user', 'pw' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
foreach ( $_POST['test'] as $val1 ) {
// if ( count( $val1 )== '4' ) {
$query= 'UPDATE Tabelle SET ';
foreach ( $val1 as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
$query= substr( $query, 0, -2 ). ' WHERE id_spalte = 3';
echo '<br />query: '. $query;
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';
// }
}
?> Antwort 20 von son_quatsch
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)
Antwort 21 von IngridL.
Zitat:
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Ja, das stimmt!
Zitat:
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Das tuen sie eben nicht. Im Array stehen andere Werte drin.
Zitat:
versuchs nochmal in Worte zu fassen :-)
versuchs nochmal in Worte zu fassen :-)
Vielleich habe ich die Sache auch ganz falsch angfangen. :(
Also ich lese Daten aus der DB diese werden in ein PHP-Formular geschrieben:
<tr><td><input name="test[][Spalte1]" type="text" value="'.$row['id'].'" ></td>
<td><input name="test[][Spalte2]" type="text"value="'.$row['g'].'" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField">
<option value="Ja" '. ($row['hg']== Ja? 'selected="selected" ': ''). '/>ja</option>
<option value="Nein" '. ($row['hg']== Nein? 'selected="selected" ': ''). '/>nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" value="'.$row['k'].'" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField">
<option value="1" '. ($row['m']== 1? 'selected="selected" ': ''). '/>Option1</option>
<option value="2" '. ($row['m']== 2? 'selected="selected" ': ''). '/>Option2</option></select></td></tr>Es sind mehere Zeilen die entstehen.
1.) Die Daten werde in das Array test geschrieben, oder?
2.) und genau diese daten sollen dann die Daten in der DB ersetzen
3.) Die Daten jeder Zeile müssen ein UPDATE String ergeben, deswegen die IF Abfrage oben. und dieser String endet , WHERE id = id ( Werte aus der Tabelle, Spalte 1).
Antwort 22 von IngridL.
Zitat:
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Ja, das Stimmt.
Zitat:
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Die neuen daten gleichen nicht den alten.
Zitat:
Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)
Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)
Vielleicht war meine Herangehensweise falsch.
1.) ich hole Daten aus der DB und füge diese in folgendes Formular ein:
<tr><td><input name="test[Spalte1]" type="text" value="'.$row['Spalte1'].'" ></td>
<td><input name="test[][Spalte2]" type="text" value="'.$row['Spalte2'].'" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField">
<option value="Ja" '. ($row['Spalte3']== Ja? 'selected="selected" ': ''). '/>Ja</option>
<option value="Nein" '. ($row['Spalte3']== Nein? 'selected="selected" ': ''). '/>Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" value="'.$row['Spalte4'].'" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField">
<option value="1" '. ($row['Spalte5']== 1? 'selected="selected" ': ''). '/>1</option>
<option value="2" '. ($row['Spalte5']== 2? 'selected="selected" ': ''). '/>2</option></select></td></tr>Es sind immer mehrer Zeilen verhanden! Spalte ist die ID !
Nun können die Daten geändert werden und werden im Array test gespeichert, oder?
und diese Daten im Array , sollen die Daten in der DB ersetzen.
nun meine Frage: wie macht man das am besten?
Antwort 23 von IngridL.
Zitat:
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Zitat:
3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die
if ( count( $val1 )== '4' ) { }
rausnehme.
Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.
Ja, das Stimmt.
Zitat:
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Zitat:
nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.
Die neuen daten gleichen nicht den alten.
Zitat:
Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)
Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)
Vielleicht war meine Herangehensweise falsch.
1.) ich hole Daten aus der DB und füge diese in folgendes Formular ein:
<tr><td><input name="test[Spalte1]" type="text" value="'.$row['Spalte1'].'" ></td>
<td><input name="test[][Spalte2]" type="text" value="'.$row['Spalte2'].'" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField">
<option value="Ja" '. ($row['Spalte3']== Ja? 'selected="selected" ': ''). '/>Ja</option>
<option value="Nein" '. ($row['Spalte3']== Nein? 'selected="selected" ': ''). '/>Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" value="'.$row['Spalte4'].'" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField">
<option value="1" '. ($row['Spalte5']== 1? 'selected="selected" ': ''). '/>1</option>
<option value="2" '. ($row['Spalte5']== 2? 'selected="selected" ': ''). '/>2</option></select></td></tr>Es sind immer mehrer Zeilen verhanden! Spalte ist die ID !
Nun können die Daten geändert werden und werden im Array test gespeichert, oder?
und diese Daten im Array , sollen die Daten in der DB ersetzen.
ja nun meine Frage wie macht man das am besten?
Antwort 24 von son_quatsch
Oje, dazu brauche ich mindestens die exakte Ausgabe von
...möglichst aber auch zusätzlich noch ein Beispiel des fertig ausgegebenen HTML-Quellcodes (also mit Beispielwerten drin, so wie es im Browser aussieht).
print_r($_POST['test']);...möglichst aber auch zusätzlich noch ein Beispiel des fertig ausgegebenen HTML-Quellcodes (also mit Beispielwerten drin, so wie es im Browser aussieht).
Zitat:
Die neuen daten gleichen nicht den alten.
Ja, deine Erkenntnis ist schön. Aber ich steh weiterhin im Regen - gib mal Beispiele. Und irgendetwas wird ja an den Daten in der Datenbank aktualisiert...Die neuen daten gleichen nicht den alten.
Antwort 25 von IngridL.
Hier mal die Ausagbe von print_r($_POST['test']);
Array (
[0] => Array ( [Spalte1] => 12 )
[1] => Array ( [Spalte2] => M )
[2] => Array ( [Spalte3] => Nein )
[3] => Array ( [Spalte4] => 55 )
[4] => Array ( [Spalte5] => 1 )
[5] => Array ( [Spalte1] => 13 )
[6] => Array ( [Spalte2] => F )
[7] => Array ( [Spalte3] => Nein )
[8] => Array ( [Spalte4] => 34 )
[9] => Array ( [Spalte5] => 2 )
[10] => Array ( [Spalte1] => 14 )
[11] => Array ( [Spalte2] => h )
[12] => Array ( [Spalte3] => JA )
[13] => Array ( [Spalte4] => 67 )
[14] => Array ( [Spalte5] => 12 )
)Antwort 26 von IngridL.
Hier mal die Ausagbe von print_r($_POST['test']);
Array (
[0] => Array ( [Spalte1] => 12 )
[1] => Array ( [Spalte2] => M )
[2] => Array ( [Spalte3] => Nein )
[3] => Array ( [Spalte4] => 55 )
[4] => Array ( [Spalte5] => 1 )
[5] => Array ( [Spalte1] => 13 )
[6] => Array ( [Spalte2] => F )
[7] => Array ( [Spalte3] => Nein )
[8] => Array ( [Spalte4] => 34 )
[9] => Array ( [Spalte5] => 2 )
[10] => Array ( [Spalte1] => 14 )
[11] => Array ( [Spalte2] => h )
[12] => Array ( [Spalte3] => JA )
[13] => Array ( [Spalte4] => 67 )
[14] => Array ( [Spalte5] => 2 )
)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>.</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head><body>
<form action="....php" Spalte5thod="post" enctype="multipart/form-data" name="request" id="request">
<br><br><table>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="12" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="M" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="55" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="1" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="13" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="F" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="34" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="14" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="h" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="67" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input type="submit" name="submit" value="Weiter"></td></tr></table></form>
</body></head>
Array (
[0] => Array ( [Spalte1] => 12 )
[1] => Array ( [Spalte2] => M )
[2] => Array ( [Spalte3] => Nein )
[3] => Array ( [Spalte4] => 55 )
[4] => Array ( [Spalte5] => 1 )
[5] => Array ( [Spalte1] => 13 )
[6] => Array ( [Spalte2] => F )
[7] => Array ( [Spalte3] => Nein )
[8] => Array ( [Spalte4] => 34 )
[9] => Array ( [Spalte5] => 2 )
[10] => Array ( [Spalte1] => 14 )
[11] => Array ( [Spalte2] => h )
[12] => Array ( [Spalte3] => JA )
[13] => Array ( [Spalte4] => 67 )
[14] => Array ( [Spalte5] => 2 )
)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>.</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head><body>
<form action="....php" Spalte5thod="post" enctype="multipart/form-data" name="request" id="request">
<br><br><table>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="12" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="M" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="55" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="1" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="13" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="F" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="34" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="14" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="h" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="67" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input type="submit" name="submit" value="Weiter"></td></tr></table></form>
</body></head>
Antwort 27 von son_quatsch
Also pass auf: mit den Feldern hast du dich etwas übernommen - eine Dimension davon brauchst du definitiv nicht. Aber ich belass es erstmal dabei und werf nicht gleich alles bestehende über den Haufen. Das fahrlässige daran ist nämlich, dass z.B. nicht 3 große Felder mit jeweils 5 Werten entstehen, sondern 15 Felder mit jeweils einem Wert :(
"Spalte1" soll wohl die ID sein. Vergiss bitte nicht, dass du in sämtlichem PHP-Code immer als WHERE-Bedingung "id_spalte= 3" drin hast, also werden nur Datensätze aktualisiert, deren Wert (3) in der Spalte (id_spalte) übereinstimmt. Das müssen wir selbstverständlich entsprechend dynamisch gestalten. Hier stellt sich auch die Frage, ob du bei der HTML-Ausgabe die ID überhaupt sehen willst. In jedem Fall gibt es Optimierungsbedarf.
Nachfolgend jetzt mal ein Beispiel, wie es funktionieren sollte, wenn deine HTML-Formulare weiterhin so aussehen wie in deinem Beispiel:
"Spalte1" soll wohl die ID sein. Vergiss bitte nicht, dass du in sämtlichem PHP-Code immer als WHERE-Bedingung "id_spalte= 3" drin hast, also werden nur Datensätze aktualisiert, deren Wert (3) in der Spalte (id_spalte) übereinstimmt. Das müssen wir selbstverständlich entsprechend dynamisch gestalten. Hier stellt sich auch die Frage, ob du bei der HTML-Ausgabe die ID überhaupt sehen willst. In jedem Fall gibt es Optimierungsbedarf.
Nachfolgend jetzt mal ein Beispiel, wie es funktionieren sollte, wenn deine HTML-Formulare weiterhin so aussehen wie in deinem Beispiel:
<?php
error_reporting(E_ALL);
mysql_connect( 'localhost', 'user', 'pw' ) or die( 'Keine Verbindung: '. mysql_error() );
mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
$i= 0;
$where= '';
foreach ( $_POST['test'] as $val1 ) {
// es geht von vorne los
// den ersten Wert wollen wir nicht UPDATEN, sondern als KRITERIUM nutzen...
if ($i== 0) {
$query= 'UPDATE Tabelle SET ';
// diese Schleife wird nur einmal (infolge der etwas doofen Datenzusammenstellung) durchlaufen
foreach ( $val1 as $key2=> $val2 ) {
$where= $key2. '= '. $val2;
}
// ...alle anderen Werte sammeln wir
} else {
// diese Schleife wird nur einmal (infolge der etwas doofen Datenzusammenstellung) durchlaufen
foreach ( $val1 as $key2=> $val2 ) {
$query.= $key2. '= \''. $val2. '\', ';
}
}
$i++; // einen weiteren Wert dem SQL-Kommando hinzugefügt
// bei 5 Werten insgesamt haben wir einen Datensatz zusammen
if ($i== 5) {
$query= substr( $query, 0, -2 ). ' WHERE '. $where;
echo '<br />query: '. $query;
mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';
}
}
?>Antwort 28 von IngridL.
@son_quatsch
riesen Lob an Dich! Sicher es ist alles noch sehr laienhaft gemacht und es besteht noch großer Optimierungsbedarf.
Eine Frage habe ich allerdings noch:
Beim testen stellte ich fest, dass die Where-Klausel immer so gleich ist:
WHERE Spalte1=12. Wo wird das im Code festegelegt?
riesen Lob an Dich! Sicher es ist alles noch sehr laienhaft gemacht und es besteht noch großer Optimierungsbedarf.
Eine Frage habe ich allerdings noch:
Beim testen stellte ich fest, dass die Where-Klausel immer so gleich ist:
WHERE Spalte1=12. Wo wird das im Code festegelegt?
Antwort 29 von IngridL.
@son_quatsch,
werde das Array vollkommen anders aufbauen müssen. Da komme ich nicht drum herum.
VIELEN DANK FÜR DEINE MÜHE, HAT MIR SEHR GEHOLFEN
D A N K E
werde das Array vollkommen anders aufbauen müssen. Da komme ich nicht drum herum.
VIELEN DANK FÜR DEINE MÜHE, HAT MIR SEHR GEHOLFEN
D A N K E

