PHP Problem mit ändern von MySQL Daten

twin

Lt. Commander
Registriert
Mai 2004
Beiträge
1.253
Guten Abend!
Ich möchte gerne Daten aus einer MySQL DB auslesen und pro Zeile einen Eintrag bearbeiten können. Dieser Eintrag enthält nur eine Zahl, welche dann als spätere Sortierung dient. Ich gehe alle Einträge der Datenbank durch und gebe sie in einer Tabelle aus. Das zu editierende Feld ist beschreibbar. Klicke ich nun auf den Update Button, erhalte ich wieder die Tabelle ohne jegliche Änderung.

Das Auslesen ist nicht das Problem, aber das Ändern. Hier ist der Code:

PHP:
<?php
$sortieren = $_GET["sortieren"]; 
$mysqlhost=".....";
$mysqluser="....";
$mysqlpwd=".....";
$mysqldb="......";

$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");

mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

$sql = "SELECT id, sort, firstname, lastname, text FROM jos_cdtastymonials ORDER BY sort DESC";

$monials = mysql_query($sql) or die("Anfrage nicht erfolgreich");

$anzahl = mysql_num_rows($monials);

echo "Anzahl der Datensaetze: $anzahl";

if ($sortieren == "submit") { 
    // Überprüfe Angaben
    if ($Fehler != 1) {
        $sql = "UPDATE jos_cdtastymonials SET sort= '".$_POST['sort']."' WHERE ID = '".$_POST['id']."'";
        mysql_query($sql) OR die(mysql_error());
        echo "Deine Angaben wurden bearbeitet.";
    }
}


?>
<form action="sortierung.php?sortieren=submit" method="POST">
<table cellpadding="1" cellspacing="3" border="1">
<tr>
<td>ID</td>
<td>Sortierung</td>
<td>Vorname</td>
<td>Nachname</td>
<td>Bewertung</td>
</tr>

<?php
while ($adr = mysql_fetch_array($monials)){
?>

<tr>
<td><input id="id" type="text" name="id" maxlength="4" size="4" value="<?=$adr['id']?>"></td>
<td><input id="sort" type="text" name="sort" maxlength="4" size="4" value="<?=$adr['sort']?>"></td>
<td><?=$adr['firstname']?></td>
<td><?=$adr['lastname']?></td>
<td><?=$adr['text']?></td>
</tr>

<?php
}
?>

</table>
<input type="submit" name="submit" value="Update DB">
</form>

Ich denke im UPDATE Teil muss der Wurm drin sein. Pro Zeile kann ich ja den Sort Eintrag ändern. Nun müsste ich dem UPDATE Befehl ja mitteilen, dass er alle Zeilen durchgehen soll oder reicht das oben schon?

Danke für Eure Hilfe! Über Tipps wäre ich sehr dankbar!

Grüße
twin
 
du führst ja nur einmal den UPDATE befehl für eine ID aus

Wenn du mehrere UPDATE befehle erledigen willst dann benötigste du eine while-Schleife um den Update befehl
 
Danke für den Tipp! Ich habe auch gerade bemerkt, dass er mir nur die letzte Zeile ändert, wenn ich dort einen neuen Wert eintrage.

Wir muss das in etwa aussehen? So macht er bisher nichts:

PHP:
while ($adr = mysql_fetch_assoc($monials)){
        $sql = "UPDATE jos_cdtastymonials SET sort= '".$_POST['sort']."' WHERE ID = '".$_POST['id']."'";
}

Aber ich müsste sicherlich das $_POST['sort'] und das $_POST['id'] ändern?

Danköö!
 
Er macht deshalb nichts, weil dieser Code nur den SQL-Befehl zusammenbaut, ihn aber nicht ausführt ;)
 
Ähm ja, stimmt...das habe ich vergessen - peinlich :D Aber das ändert leider nichts daran, dass ich lediglich die letzte Zeile ändern kann :/

Das ist jetzt der überarbeitete Codeteil:

PHP:
if ($sortieren == "submit") { 
    // Überprüfe Angaben
    if ($Fehler != 1) {
        while ($adr = mysql_fetch_assoc($monials)){
        	$sql = "UPDATE jos_cdtastymonials SET sort= '".$_POST['sort']."' WHERE ID = '".$_POST['id']."'";
        	mysql_query($sql) OR die(mysql_error());
		}
        
        echo "Deine Angaben wurden bearbeitet.";
    }
}

Noch eine Idee?
 
Das Formular liefert im Moment nur ein ID/Sort-Paar zurück. Wenn du alle haben möchtest, dann kannst du durch die Benennung der input-Felder erreichen, dass sie als Array zusammengefasst werden. Im einfachsten Falle nennst du das Feld einfach "sort[]" statt "sort", dann hast du in PHP in $_POST['sort'] einen Array mit den Werten aller Felder drin.

Am besten wäre wahrscheinlich folgende Variante (nicht getestet => keine Gewähr): Du willst ja die IDs der Einträge gar nicht ändern, nur die Sortierung. Dann kannst du das Input-Feld "id" weglassen und dem Sort-Feld den Namen "sort[<?=$adr['id']?>" geben. Das hätte den Vorteil, dass das Array der Sortierungswerte dann gleich mit den IDs indiziert ist, d. h. du könntest im PHP-Code einfach so drüberiterieren:

PHP:
foreach ($_POST['sort'] as $id => $sort) {
    $sql = "UPDATE jos_cdtastymonials SET sort='$sort' WHERE ID='$id'";
    mysql_query($sql) OR die(mysql_error());
}

Ich hoffe, das war einigermaßen verständlich :)

Anmerkung am Rande: Das Wort heißt "testimonial", nicht "tasty monial" :)
 
Danke für deine ausführliche Antwort! Sehr interessant und klingt logisch. Leider funktioniert das nicht...ich bekomme folgende Meldung sobald ich neue Werte eingebe und auf Update klicke:

Code:
Warning: Invalid argument supplied for foreach() in /homepages/21/....../sortierung_3.php on line 30

Der Code sieht nun so aus:

PHP:
<?php

$sortieren = $_GET["sortieren"]; 
$mysqlhost="....";
$mysqluser=".....";
$mysqlpwd="...";
$mysqldb="...";


$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
 
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");
 
$sql = "SELECT id, sort, firstname, lastname, text FROM jos_cdtastymonials ORDER BY sort DESC";
 
$monials = mysql_query($sql) or die("Anfrage nicht erfolgreich");
 
$anzahl = mysql_num_rows($monials);
 
echo "Anzahl der Datensaetze: $anzahl";
 
if ($sortieren == "submit") { 
    // Überprüfe Angaben
    if ($Fehler != 1) {
		/*while ($adr = mysql_fetch_array($monials)){
        	$sql2 = "UPDATE jos_cdtastymonials SET sort= '".$_POST['sort[]']."' WHERE ID = '".$_POST['id']."'";
        	mysql_query($sql2) OR die(mysql_error());
		}*/
		
		foreach ($_POST['sort'] as $id => $sort) {
    		$sql = "UPDATE jos_cdtastymonials SET sort='$sort' WHERE ID='$id'";
   			mysql_query($sql) OR die(mysql_error());
		}
        echo "Deine Angaben wurden bearbeitet.";
    }
}
 
 
?>
<form action="sortierung_3.php?sortieren=submit" method="POST">
<table cellpadding="1" cellspacing="3" border="1">
<tr>
<td>ID</td>
<td>Sortierung</td>
<td>Vorname</td>
<td>Nachname</td>
<td>Bewertung</td>
</tr>
 
<?php
while ($adr = mysql_fetch_array($monials)){
?>
 
<tr>
<td><?=$adr['id']?></td>
<td><input id="sort[<?=$adr['id']?>" type="text" name="sort[<?=$adr['id']?>" maxlength="4" size="4" value="<?=$adr['sort']?>"></td>
<td><?=$adr['firstname']?></td>
<td><?=$adr['lastname']?></td>
<td><?=$adr['text']?></td>
</tr>
 
<?php
}
?>
 
</table>
<input type="submit" name="submit" value="Update DB">
</form>

Das PlugIn für Joomla nennt sich aber Tasty Monials ;) Daher die andere Schreibweise :freaky:

Noch eine Idee?
 
Der Name des Sort-Input-Elements sollte "sort[]" sein, also ohne dessen ID in den Klammern.
 
@Darlis: Danke für den Tipp, zwar ist nun die Fehlermeldung weg - aber das Resultat ist unverändert - er speichert nichts.
 
Ah, jetzt sehe ich, warum du die ID da rein gesetzt hast (hab' den Schleifen-Inhalt nicht angeschaut).
Eine mögliche Lösung wäre ein zweites, verstecktes Eingabefeld, welches die ID enthält. Du hast damit zwei Arrays, eines mit IDs und eines mit Eingabewerten.
 
Hm, irgendwie funktioniert das alles nicht :( Bekomme das einfach nicht zum Laufen...*grübel*
 
Ohne den jetzigen Code zu kennen können andere auch nur raten.

Vielleicht ein etwas besserer Ansatz als der mit dem verstecken Feld: Du kennst ja die IDs, der Datensätze, die du dem User anzeigst. Damit kannst du den Input-Feldern eindeutige Namen geben (so ähnlich, wie in deinem vorigen Versuch).
Wenn du dann an deine Abfrage kommst, iterierst du über die IDs, die der Benutzer ändern darf und guckst in $_POST nach, ob es dafür einen Input gibt und setzt diesen dann in der DB.
 
Zurück
Oben