datenbankproblem

nick25

Well-known member
ID: 205997
L
30 Mai 2009
513
23
hallo,

irgendwo hat sich der wurm eingeschlichen. wenn ich eine kategorie anlege klappt es. wenn ich dann z.b 5 kategorien angelegt habe und z.b die 3 kategorie ändern will speichert er es nicht. er updatet es nur bei der zuletzt angelegten kategorie sonst keine.

hier mal der quelltext:

PHP:
	if($a=="catch") 
{
    $id = $_POST['id'];
    $name = $_POST['name'];

echo 'id:'.$id.<br>;
echo 'id:'.$name.<br>;
    
    		mysql_query("Update test set category='$name' where ID=$id");
                                            
}
	$q=mysql_query("SELECT * FROM test");

	echo '<table align=center border=1 cellspacing=0 cellpadding=5 bordercolorlight=#ffffff bordercolordark=#bbbbbb>
                <form action=test.php?a=catadd method=POST>
            <tr>
              <td bgcolor=#eeeeee colspan=3><b>Neue Kategorie anlegen</b></td>
            </tr>
            <tr>
              <td><input type=text name=name></td>
              <td colspan=2><input type=submit value="Anlegen" class=but></td>
            </tr>
          </form>';

	echo "<tr><td bgcolor=#eeeeee colspan=3><b>Kategorien bearbeiten</b></td></tr>";

	while($row=mysql_fetch_array($q))
     {

		echo '<form action=test.php?a=catch method=POST>
                <tr>
                  <td align=left><input type=hidden name="id" value="'.$row['ID'].'">
                                 <input type=text name="name" value="'.$row['category'].'">
                  </td>
                  <td><input type=submit value="Speichern"  class=but></td>';
                  if ($row['ID'] != 1)
                   {
                    echo '<td><a href=test.php?a=catdel&id='.$row['ID'].'><b>Löschen</b></a></td>';
                   }
                   else
                   {
                    echo'<td>ERFORDERLICH</td></tr>
              </form>';
                   }
	 }

datenbank:

PHP:
CREATE TABLE IF NOT EXISTS `test` (
  `ID` int(11) NOT NULL auto_increment,
  `category` varchar(200) DEFAULT NULL,
  PRIMARY KEY  (ID)
) ENGINE=MyISAM;

könnte mir jemand sagen wo der fehler liegt.
 
Hmhm, ist das Pseudo-Code? Falls nein, bitte ganzen Beitrag lesen!

Der Fehler liegt, soweit ich das sehe, hier: Du öffnest jedesmal ein <form>, schliesst es aber nur im ersten Falle wieder!
Hier:
PHP:
while($row=mysql_fetch_array($q))
{
    echo '<form action=test.php?a=catch method=POST>[...]'; //Form wird geöffnet.

    if($row['ID'] != 1) //Falls nicht die erste Kategorie
    {
        echo '<td><a href=test.php?a=catdel&id='.$row['ID'].'><b>Löschen</b></a></td>'; //Form  und <tr> wird nicht geschlossen!!!
    }
    else //Falls die erste Kategorie
    {
        echo'<td>ERFORDERLICH</td></tr></form>'; //Form wird nur hier geschlossen, also im ersten Durchlauf!
    }
}

Dadurch sieht es in Deinem (2.) <form> dann etwa so aus:
HTML:
<form>
<input type=hidden name="id" value="1">
<input type=hidden name="id" value="2">
<input type=hidden name="id" value="3">
<input type=hidden name="id" value="4">
<!-- [...]<form> automatisch geschlossen, da HTML zu Ende.-->


Jetzt zu dem restlichen Code, falls kein Pseudo-Code:
PHP:
echo 'id:'.$id.<br>; 
echo 'id:'.$name.<br>;
Keine Ahnung, wie Du das zum laufen bringst; <br> ist kein PHP! ' ' vergessen?

PHP:
$id = $_POST['id'];
$name = $_POST['name'];

mysql_query("Update test set category='$name' where ID=$id");
Nie, nie, niemals einen unmaskierten String in die Datenbank senden! Hacker lieben solche Sicherheitslücken!
Mehr zu diesem Thema findest Du hier:
Wie maskiere ich einen String? und
Was ist eine SQL-Injection? (oder auch: "Wie hacke ich eine ungesicherte Datenbank?").

Dann so im Allgemeinen:
Falls es sich bei Deinem HTML-Code um HTML5 oder 4 handelt, so sind einige der verwendeten Attribute nicht mehr aktuell und werden nicht mehr verwendet (Beispielsweise: align=center, border=1, bgcolor=#eeeeee, ...). Sie alle wurden durch CSS Stylesheet Elemente ersetzt.
Es ist zudem von Vorteil, Attributwerte mit " " oder ' ' einzuschliessen (Beispielsweise: class=but -> class="but"), einfach aufgrund der Einheitlichkeit - reduziert zudem so manchen Fehler.

Grüsse, und lass mich wissen, ob der Fehler damit behoben wurde.

Valares
 
vielen dank für deinen detaihaltigen beitrag. es handelt sich tatsächlich um php4 code. ich bin dabei ein script zu aktualisieren. ich habe wie du es bemerkt hast vergessen die form zu schließen. k.a wieso ich die form in der if schließe. naja betriebsblind. jetzt funktioniert es. vielen dank

achja gibt es irgendwo ein programm das automatsch überall im html text die " setzt?
 
[...]es handelt sich tatsächlich um php4 code.[...]

Ich meinte weniger die PHP-Version, sondern den HTML-Dokumententyp (Beispielsweise <!DOCTYPE HTML> für HTML5).
Ab HTML 4.01 zählen Attribute wie "bgcolor" und viele mehr als veraltet. Hier findest Du eine Übersicht über veraltete Tags und Attribute in HTML 4.*, und hier die von HTML5. Die meisten Formatierungsattribute werden neu mittels Style-Tag (oder class) und CSS angewendet. Beispiel:
HTML:
<p style="border:black solid 3px; background-color:lightblue;
    text-align:center; width:100%; height:200px;">
Text in einer Box mit blauem Hintergrund.
</p>

[...]k.a wieso ich die form in der if schließe. naja betriebsblind. jetzt funktioniert es. vielen dank

Kommt vor... Super :D ! Gerne.

achja gibt es irgendwo ein programm das automatsch überall im html text die " setzt?

Nicht, dass ich wüsste. Solange der Code funktioniert ist das auch nicht zwingend nötig, aber ich würde an Deiner Stelle einfach in der Zukunft die Werte in Anführungszeichen oder Hochkommas setzen. Sonst könnten sich etwa folgende Fehler einschleichen:
HTML:
<style type="text/css">
    .fehler {background:red;}
    .info {border:black inset 3px; color:blue;}
    .wichtig {font-weight:bold;}
</style>
[...]
<p class=fehler info wichtig title=Hallo Welt>
    Dies sollte einen blauen Text ausgeben, der auf einem roten Hintergrund steht,
    einen Rahmen rund herum hat, und Fett gedruckt ist.
    Zudem sollte beim Draufzeigen ein "Hallo Welt" Text erscheinen.
    Jedoch wird nur der Hintergrund rot gefärbt und beim Draufzeigen
    gibt es nur ein "Hallo" aus. Mit Anführungszeichen wird alles richtig ausgegeben.
</p>

Grüsse und gute Nacht
Valares