Supportnet / Forum / Datenbanken
ohne Begrenzung viele Datensätze gleich Zeitig ändern ?
Frage
Hy
In meinem Projekt lasse ich meine Datensätze aus meiner Datenbank, in Textfeldern Anzeigen um Sie zu ändern.
Ich kann Sie Anzeigen lassen aber wenn ich ein paar änder und speichern möchte.
Fügt die Datenbank den letzten schon in der Datenbank gewesennen Datansatz neu in die Datenbank und gibt mir natürlich die Fehlermeldung das der Datensatz schon vorhanden ist.
Hier mal mein code:
[code]
<?
include("inc/header.inc.php");
echo "<H3>Artikel ändern</H3>";
echo "<div align='center'>";
echo "<HR>";
include("inc/config.php");
$anfrage="UPDATE mini SET ArtikelNr='$_POST[ArtikelNr]',Artikel='$_POST[Artikel]',Gruppe='$_POST"
."[Gruppe]',Preis='$_POST[Preis]',Aktiv='$_POST[Aktiv]'";
if ($ergebnis=mysql_query($anfrage))
{echo "Artikel geändert";}
else
{echo "Fehlermeldung=".mysql_error();};
mysql_close();
echo "<HR></div></BODY></HTML>";
?>
[/code]
Ich möchte gerne alle Datensätze die er in meiner Editier option anzeigt ändern ?
Kann mir jemand helfen !!!
Danke
Faivel
ohne Begrenzung viele Datensätze gleichzeitig ändern ?
Antwort 1 von semi
Du sagst in Deiner SQL Anweisung nicht, welchen Datensatz Du ändern möchtest.
Mit der obigen Update Anweisung werden alle Datensätze verändert. Da die ArtikelNr bestimmt ein PrimaryKey ist, knallt's gewaltig.
Es können nicht mehrere Datensätze mit gleicher Nummer existieren.
Klartext: WHERE ArtikelNr='$_POST[ArtikelNr]' und die ArtikelNr brauchst Du nicht erneut zu setzen.
Gruß,
Michael
Mit der obigen Update Anweisung werden alle Datensätze verändert. Da die ArtikelNr bestimmt ein PrimaryKey ist, knallt's gewaltig.
Es können nicht mehrere Datensätze mit gleicher Nummer existieren.
Klartext: WHERE ArtikelNr='$_POST[ArtikelNr]' und die ArtikelNr brauchst Du nicht erneut zu setzen.
Gruß,
Michael
Antwort 2 von Faivel
nein,mein PrimaryKey ist der Artikel.
Ich möchte ja alle Datensätze gleichzeitig ändern, es werden bestimmt immer ca. 350 Artikel angezeit die ich gleichzeitig ändern möchte.
Faivel
Ich möchte ja alle Datensätze gleichzeitig ändern, es werden bestimmt immer ca. 350 Artikel angezeit die ich gleichzeitig ändern möchte.
Faivel
Antwort 3 von semi
Es gilt für alle Felder mit dem Attribut "unique". Sieht so aus, dass Du es in Schleife machen mußt.
Ich weiß nicht, ob Du es kennst aber man kann in einem Formular auch Arrays verwenden.
Gruß,
Michael
Ich weiß nicht, ob Du es kennst aber man kann in einem Formular auch Arrays verwenden.
<input type=hidden name="Artikelnr[]" value="1">
...
<input type=hidden name="Artikelnr[]" value="n">usw. auch mit anderen Feldern (hidden nur dort, wo es nötig ist)Gruß,
Michael
Antwort 4 von Faivel
Hy,
meinst Du diese änderungen in dem Formular wo ich die änderungen vornehme oder in dem Formular wohin ich nach "Speichern" die daten hin schicke.
Ich habe das mal versucht mit den Arrays die über den link weiter gegeben werden aber ich habe das nie so hin bekommen das das Formular die daten entgegenimmt. :-(
Faivel
meinst Du diese änderungen in dem Formular wo ich die änderungen vornehme oder in dem Formular wohin ich nach "Speichern" die daten hin schicke.
Ich habe das mal versucht mit den Arrays die über den link weiter gegeben werden aber ich habe das nie so hin bekommen das das Formular die daten entgegenimmt. :-(
Faivel
Antwort 5 von semi
ehhm.. beides.
Schau dir dieses Beispiel an, dann weißt du was ich meine. (Guck dir insbesondere den generierten HTML-Code an)
Gruß,
Michael
Schau dir dieses Beispiel an, dann weißt du was ich meine. (Guck dir insbesondere den generierten HTML-Code an)
<?php
if(isset($id)) {
// Übergebene Formulardaten holen
settype($personen,"array");
for($i=0; $i<count($id); $i++) {
$personen[trim($id[$i])] = array($id[$i], $name[$i]);
}
}
else {
// Ein Array mit paar Personen
// Wird nur beim ersten mal erstellt
$personen = array(
"1"=>array("1","Bart"),
"2"=>array("2","Lisa"),
"3"=>array("3","Homer"),
"4"=>array("4","Apu"),
"5"=>array("5","Bernie")
);
}
echo "<form action=\"{$PHP_SELF}\" method=post>\n";
$keys = array_keys($personen);
for($i=0; $i<count($keys); $i++)
{
echo "<input type=hidden name=\"id[]\" value=\""
.$personen[$keys[$i]][0]
."\">\n";
echo "<input name=\"name[]\" value=\""
.$personen[$keys[$i]][1]
."\">\n";
echo "<br>\n";
}
echo "<input type=submit>\n";
echo "</form>\n";
?>Gruß,
Michael
Antwort 6 von Faivel
Verstehe ich das richtig ?
Im ersten Teil erstellt er mit den daten ein array ?
Im zweiten Teil wird das formular erstell ?
Dann müsste ich ja mein Array schon haben.
Ich habe ja schon eine seite wo ich mir die Daten von der datenbank anzeigen lasse!
dieses Formular übergibt die daten an das erste script oben.
Dann habe ich doch schon ein Array mit den Daten.Die ich doch nur noch weiter Be-Arbeiten muss, oder ?
Wozu aber das hidden feld gut ist verstehe ich nicht und das mit dem \n" an machen enden verstehe ich auch nicht !
Wäre super wenn du es mir erklären würdest.
danke
Faivel
Im ersten Teil erstellt er mit den daten ein array ?
<?php
if(isset($id)) {
// Übergebene Formulardaten holen
settype($personen,"array");
for($i=0; $i<count($id); $i++) {
$personen[trim($id[$i])] = array($id[$i], $name[$i]);
}
}
else {
// Ein Array mit paar Personen
// Wird nur beim ersten mal erstellt
$personen = array(
"1"=>array("1","Bart"),
"2"=>array("2","Lisa"),
"3"=>array("3","Homer"),
"4"=>array("4","Apu"),
"5"=>array("5","Bernie")
);
}
Im zweiten Teil wird das formular erstell ?
echo "<form action=\"{$PHP_SELF}\" method=post>\n";
$keys = array_keys($personen);
for($i=0; $i<count($keys); $i++)
{
echo "<input type=hidden name=\"id[]\" value=\""
.$personen[$keys[$i]][0]
."\">\n";
echo "<input name=\"name[]\" value=\""
.$personen[$keys[$i]][1]
."\">\n";
echo "<br>\n";
}
echo "<input type=submit>\n";
echo "</form>\n";
?>
Dann müsste ich ja mein Array schon haben.
Ich habe ja schon eine seite wo ich mir die Daten von der datenbank anzeigen lasse!
if ($act == 'editieren')
{
echo "<H3>Artikel ändern</H3><HR>";
echo "<div align=center>";
echo "<form name='form1' method='post' action='edit.php'>";
$SQL_statement="SELECT * FROM mini ORDER BY artikel";
$resultset=mysql_query($SQL_statement);
while($data=mysql_fetch_array($resultset)){
echo "<table border=\"0\">";
echo "<tr>";
echo "<td width=50><input name='ArtikelNr' type='text' size='5'"
."value=".$data['ArtikelNr']."></td>";
echo "<td width=280><input name='Artikel' type='text' size='40'"
."maxlength='40' value=".$data['Artikel']."></td>";
echo "<td width=60><input name='Gruppe' type='text' size='6'"
."value=".$data['Gruppe']."></td>";
echo "<td width=40><input name='Preis' type='text' size='5'"
." maxlength='5' value=".$data['Preis']."></td>";
echo "</tr>";
echo "</table>";
}
mysql_free_result($resultset);mysql_close();
echo "<input type='submit'name='Submit' value='speichern'>";
echo "</form>";
echo "</div>";
}
dieses Formular übergibt die daten an das erste script oben.
Dann habe ich doch schon ein Array mit den Daten.Die ich doch nur noch weiter Be-Arbeiten muss, oder ?
Wozu aber das hidden feld gut ist verstehe ich nicht und das mit dem \n" an machen enden verstehe ich auch nicht !
Wäre super wenn du es mir erklären würdest.
danke
Faivel
Antwort 7 von semi
Wenn Du die Daten in einer Tabelle anzeigst, dann nützt Dir das ganze wenig.
Du hast geschrieben, dass Du zig Datensätze auf einmal bearbeiten möchtest. Daraus schließe ich, dass Du zuerst ein Riesenformular mit allen Daten generierst. Wenn man dann auf Speichern klickt, werden alle Datensätze in der DB upgedated.
In meinem Beispiel ist der erste Teil das Update, der zweite die "Datenbankabfrage"
Klartext:
hidden ist für Felder, die nur serverseitig eine Rolle spielen und nicht editiert werden sollen.
Man könnte es noch anders lösen. Einer Art Mapping zwischen ID's aus der Datenbank und den ID's für den Client in den Session-Daten speichern. Sinnvoll, wenn man die internen ID's aus der DB nicht öffentlich sichtbar machen möchte. Wie auch immer, Du kannst nicht einfach
UPDATE whatever SET Feld='Bla'
aufrufen, da damit alle Datensätze mit GLEICHEN Inhalten überschrieben werden.
Klartext: Du mußt die Datensätze irgendwie unterscheiden, daher pro Datensatz eine eindeutige ID.
\n damit der generierte HTML-Code etwas übersichtlicher wird.
Ein Nachteil bleibt noch.
Wenn Du von 100 Datensätzen nur einen änderst, dann werden trotzdem 100 Updates auf der DB ausgeführt.
Abhilfe: Bei Lesen der Daten eine Quersumme über die Feldinhalte der Daten bilden und als hidden zum Browser mit übertragen.
Kommen die Daten zurück, dann erkennst Du anhand der Quersumme, was sich geändert hat und was nicht.
Die Quersummen kannst Du z.B. mit der Funktion crc32 erstellen (Siehe PHP-Handbuch)
Gruß,
Michael
Du hast geschrieben, dass Du zig Datensätze auf einmal bearbeiten möchtest. Daraus schließe ich, dass Du zuerst ein Riesenformular mit allen Daten generierst. Wenn man dann auf Speichern klickt, werden alle Datensätze in der DB upgedated.
In meinem Beispiel ist der erste Teil das Update, der zweite die "Datenbankabfrage"
Klartext:
if(isset($id)) // wenn speichern angeklickt
Formulardaten speichern
else
Formulardaten aus DB erzeugenhidden ist für Felder, die nur serverseitig eine Rolle spielen und nicht editiert werden sollen.
Man könnte es noch anders lösen. Einer Art Mapping zwischen ID's aus der Datenbank und den ID's für den Client in den Session-Daten speichern. Sinnvoll, wenn man die internen ID's aus der DB nicht öffentlich sichtbar machen möchte. Wie auch immer, Du kannst nicht einfach
UPDATE whatever SET Feld='Bla'
aufrufen, da damit alle Datensätze mit GLEICHEN Inhalten überschrieben werden.
Klartext: Du mußt die Datensätze irgendwie unterscheiden, daher pro Datensatz eine eindeutige ID.
\n damit der generierte HTML-Code etwas übersichtlicher wird.
Ein Nachteil bleibt noch.
Wenn Du von 100 Datensätzen nur einen änderst, dann werden trotzdem 100 Updates auf der DB ausgeführt.
Abhilfe: Bei Lesen der Daten eine Quersumme über die Feldinhalte der Daten bilden und als hidden zum Browser mit übertragen.
Kommen die Daten zurück, dann erkennst Du anhand der Quersumme, was sich geändert hat und was nicht.
Die Quersummen kannst Du z.B. mit der Funktion crc32 erstellen (Siehe PHP-Handbuch)
Gruß,
Michael
Antwort 8 von semi
Ehhmm... Vergiss den ersten Satz meiner letzten Antwort. Ich habe die Inputs in Deinem Code übersehen.
:-)
:-)
Antwort 9 von Faivel
Das heisst wenn ich den PrimaryKey auf die ArtikelNr setze, habe ich ja eine eindeutige id für jede zeile.
Das einzige was weiter hin möglich sein sollte wäre die ArtikelNr ändern zu können aber so das es nie eine ArtikelNr doppelt geben würde.
Das, wenn nur ein Datensatz geändert wird, alle Datensätze upgedatet werden finde ich nicht schlimm.
In deinem Code-Ausschnit in der letzten Antwort steht zuerst das Update und danach die Option zum ändern der Daten.
??
danke
Faivel
Das einzige was weiter hin möglich sein sollte wäre die ArtikelNr ändern zu können aber so das es nie eine ArtikelNr doppelt geben würde.
Das, wenn nur ein Datensatz geändert wird, alle Datensätze upgedatet werden finde ich nicht schlimm.
In deinem Code-Ausschnit in der letzten Antwort steht zuerst das Update und danach die Option zum ändern der Daten.
??
danke
Faivel
Antwort 10 von semi
Die Reihenfolge im Sourcecode muß ja nicht dem Ablauf entspechen.
Wenn Du die Seite das erste mal aufgerufen hast, dann kannst Du nicht auf "Speichern" geklickt haben.
(Es sei dann, dass es aus dem Browsercache kommt, aber egal)
Gruß,
Michael
Wenn Du die Seite das erste mal aufgerufen hast, dann kannst Du nicht auf "Speichern" geklickt haben.
(Es sei dann, dass es aus dem Browsercache kommt, aber egal)
Gruß,
Michael
Antwort 11 von Faivel
Ich habe ein link-menu im header, wenn ich dort auf "Artikel ändern" klicke stellt er die erste anfrage an die db darauf hin erscheint mein generiertes formular inkl. daten aus der db.
Dann sind ja die ArtikelNr die festen id`s, wie schaffe ich das das alle datensätze geändert werden?
danke
faivel
Dann sind ja die ArtikelNr die festen id`s, wie schaffe ich das das alle datensätze geändert werden?
danke
faivel
Antwort 12 von semi
Du kannst sie alle einzeln in einer Schleife ändern.
Im Formular hast Du die ArtikelNr, Bezeichnung etc. als Arrays.
z.B.
Gruß,
Michael
Im Formular hast Du die ArtikelNr, Bezeichnung etc. als Arrays.
z.B.
<input type=hidden name="artikelnr[]" value="1">
<input name="bezeichnung[]" value="A">
<input type=hidden name="artikelnr[]" value="2">
<input name="bezeichnung[]" value="B">In dem PHP Skript kannst Du über die Arrays edr übergebenen Daten iterieren.
for($i=0; $i<count($artikelnr); $i++)
{
mysql_query(
"UPDATE Artikel "
." SET ArtikelNr={$artikelnr[$i]},"
." SET Bezeichnung={$bezeichnung[$i]} "
."WHERE ArtikelNr={$artikelnr[$i]}"
}
Gruß,
Michael

