[PHP/MYSQL] Datensätze editieren funktioniert nicht

Kantholy

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
323
Hi, ich bastel grad ein kleines Adressbuch mit PHP in Verbindung mit SQL. Alles funktioniert soweit gut, nun bin ich aber dabei eine Funktion zum editieren von Datensätzen einzubauen, und genau hier schlägt der Fehlerteufel zu, warum funktioniert das ganze NUR beim Datensatz mit der id1, den kann ich editieren, alle anderen nicht.

hier der Inhalt der edit.php

PHP:
<?php
//check if POST data is available
//if yes -> insert it to the MySQL Database
if($_POST['lastname'] && $_POST['company'] && $_POST['email'])
{
/* Verbindung aufbauen, auswählen einer Datenbank */
$link = mysql_connect($sqlhost, $sqlusr, $sqlpwd)
    or die("Keine Verbindung möglich: " . mysql_error());
	
//echo "DEBUG: Verbindung zum Datenbankserver erfolgreich<br />\n";

mysql_select_db($sqldb) or error("Auswahl der Datenbank fehlgeschlagen");

$sql= "UPDATE `$sqldb`.`$sqltbl` SET `name` = '".$_POST['name']."',
`lastname` = '".$_POST['lastname']."',
`phone` = '".$_POST['phone']."',
`mobile` = '".$_POST['mobile']."',
`email` = '".$_POST['email']."',
`company` = '".$_POST['company']."',
`position` = '".$_POST['position']."',
`comment` = '".$_POST['comment']."',
`fax` = '".$_POST['fax']."' WHERE `$sqltbl`.`id` = '".$_POST['id']."' LIMIT 1 ;";

$result = mysql_query($sql) OR error("Konnte den Datensatz nicht eintragen: " . mysql_error());
if($result)
{
error("Erfolgreich in der Datenbank editiert");
//error($sql);
}
//error($sql);
}
//check if GET data is available
//if yes -> insert it to the MySQL Database
if($_GET['id'])
{
/* Verbindung aufbauen, auswählen einer Datenbank */
$link = mysql_connect($sqlhost, $sqlusr, $sqlpwd)
    or die("Keine Verbindung möglich: " . mysql_error());
	
//echo "DEBUG: Verbindung zum Datenbankserver erfolgreich<br />\n";

mysql_select_db($sqldb) or error("Auswahl der Datenbank fehlgeschlagen");

$sql= " SELECT * FROM `$sqldb`.`$sqltbl` WHERE `id` = ".$_GET['id']." LIMIT 1 ";

$result = mysql_query($sql) OR error("Konnte den Datensatz nicht auslesen: " . mysql_error());
if($result)
{
while($row = mysql_fetch_assoc($result)) 
	{
	?>
<form action="index.php?cmd=edit" method="post">
<input type="hidden" name="id" value="<?php echo $row['id']; ?>" />
<div id="createleft">

<fieldset>
<legend>Allgemein</legend>
	<table>
	<tr>
	<td class="tblleft">Nachname <span class="req">*</span></td>
	<td><input type="text" name="lastname" value="<?php echo $row['lastname']; ?>" maxlength="30" tabindex="5"/></td>
	</tr>
	<tr>
	<td class="tblleft">Vorname</td>
	<td><input type="text" name="name" value="<?php echo $row['name']; ?>" maxlength="30" tabindex="10"/></td>
	</tr>
	</table>
	<div id="registered"><noscript>Please enable Javascript</noscript></div>
</fieldset>
<fieldset>
<legend>Geschäftliches</legend>
	<table>
	<tr>
	<td class="tblleft">Firma <span class="req">*</span></td>
	<td><input type="text" name="company" value="<?php echo $row['company']; ?>" maxlength="30" tabindex="15"/></td>
	</tr>
	<tr>
	<td class="tblleft">Abteilung</td>
	<td><input type="text" name="position" value="<?php echo $row['position']; ?>" maxlength="30" tabindex="20"/></td>
	</tr>
	</table>
</fieldset>
<span class="req" style="font: 10px verdana; margin: 10px;">* benötigte Felder</span>
<div style="text-align:center; margin-top: 15px;"><input type="submit" value="absenden" name="submit" style="width: 150px; height: 40px;" tabindex="99"/></div>
</div>
<div id="createright">
<fieldset><legend>Kontaktmöglichkeiten</legend>
	<table>
	<tr>
	<td class="tblleft">E-Mail <span class="req">*</span></td>
	<td><input type="text" name="email" value="<?php echo $row['email']; ?>" maxlength="30" tabindex="25"/></td>
	</tr>
	<tr>
	<td class="tblleft">Telefon</td>
	<td><input type="text" name="phone" value="<?php echo $row['phone']; ?>" maxlength="30" tabindex="30"/></td>
	</tr>
	<tr>
	<td class="tblleft">Mobil</td>
	<td><input type="text" name="mobile" value="<?php echo $row['mobile']; ?>" maxlength="30" tabindex="35"/></td>
	</tr>
	<tr>
	<td class="tblleft">Fax</td>
	<td><input type="text" name="fax" value="<?php echo $row['fax']; ?>" maxlength="30" tabindex="40"/></td>
	</tr>
	</table>
</fieldset>
<fieldset>
<legend>Kommentar</legend>
<textarea name="comment" cols="40" rows="8" tabindex="50"><?php echo $row['comment']; ?></textarea>
</fieldset>

</div>

</form><?php } } } //else { error("Es wurden nicht alle benötigten Parameter übermittelt");}


?>

dazu gibt es noch zusagen: edit.php wird nicht direkt aufgerufen, sondern von der index.php inkludiert:

PHP:
<?php
	//Überprüfen ob der CMD GET Wert exisitert, wenn ja includen, wenn nicht, Fehler ausgeben
	if(isset($_GET['cmd']) && $_GET['cmd'] != "default")
	{
		if(file_exists($_GET['cmd'].".php"))
		{
			include($_GET['cmd'].".php");
		} else
		{
			error("The Command you wanted to execute is not valid.");
		}

	} else
	{
		include("default.php");
	}

	
	if($_GET['cmd'] != "printview")
	{
	?>

der Witz ist nur, warum funktioniert das editieren wie gesagt beim 1. Datensatz nur bei allen anderen nicht? Mir ist es ein Rätsel...
 
Hast du zB in PHPMYAdmin dein statement mal eingeben, welches editiert? wenn es dort net funzt, funzt es garnicht

So direkt finde ich KEINEn Fehler..

aber ein if(isset wäre wohl noch hilfreich (allgemein hilfreich ^^)
 
Also ersteinmal hat das LIMIT 1 nichts in der Abfrage verloren
und zum zweiten solltest du dich mal in das Thema SQL-Injections einlesen.
Außerdem solltest du dir bei deiner 2. Datei bitte eine andere Methode überlegen
Dateien zu inkludieren

Code:
$sql= "UPDATE $sqldb.$sqltbl SET name = '".$_POST['name']."', 
lastname = '".$_POST['lastname']."', 
phone = '".$_POST['phone']."', 
mobile = '".$_POST['mobile']."', 
email = '".$_POST['email']."', 
company = '".$_POST['company']."', 
position = '".$_POST['position']."', 
comment = '".$_POST['comment']."', 
fax = '".$_POST['fax']."' WHERE id = '".$_POST['id']."'";
 
also, all die SQL Teile sind einfach aus phpmyadmin kopiert, von daher kann ich erstmal nix für die syntaxfehler oder so bzw. dieses Limit...

außerdem: warum sollte ich mir ein anderes System fürs inkludieren ausdenken? Gut man könnte das rein theoretisch exploiten, von wegen Dateien inkludieren die nicht in diesem Verzeichnis sind, etc. etc. ALLERDINGS ist das nur für Intranet Zwecke, und keiner der Leute die das später mal benutzen sollen würde auf die Idee kommen an der URL rumzufummeln.

desweiteren behebt das ganze noch immer nicht meinen Fehler bzw. ich hab noch keine Antwort warum es denn bei ID 1 klappt und bei den anderen nicht
 
Du solltest dich mal entscheiden was du machst; entweder POST oder GET aber nicht mischen.
Denn POST liest nicht aus der URL und GET schon;
oder habe ich jetzt einen Denkfehler?
 
über GET wird lediglich die Seite selbst angegebenen die angezeigt werden soll, über POST alles was in die Datenbank reinkommen soll. eigentlich ist das klar getrennt.
 
Bei deiner Updatesyntax hast du vergessen die php variablen auserhalb der sqlsyntax zu schreiben. Oder heisen die wirklich so?

momentan:
UPDATE `$sqldb`.`$sqltbl`
und
WHERE `$sqltbl`.`id` = '".$_POST['id']."' LIMIT 1 ;";

richtig:
UPDATE ".$sldb.".".$sqltbl."
und
WHERE ".$sqltbl.".`id` = '".$_POST['id']."' LIMIT 1 ;";


Wie und wo wählst du eigentlich den entsprechenden Eintrag aus, der zu editiren ist?
 
Zuletzt bearbeitet:
solange es nur normale php variablen und nicht so globale teile sind, kann man diese auch innerhalb des updatestrings schreiben, vorrausgesetzt man benutzt " und nicht ' ;)

Ich wähle den Eintrag zum editieren folgendermaßen:

Dazu muss ich am besten von vorne anfangen:

auf der Hauptseite (index.php) gibt es sozusagen eine Übersicht der ganzen Benutzer, dann kann ich mit index.php?cmd=view&id=XXX das "Profil" der jeweiligen Person anzeigen lassen.

die ID für das viewfenster kommt direkt aus der Datenbank, ich setz einen dementsprechenden Link:
Code:
<td><a href='index.php?cmd=view&id=".$row['id']."'>Profil</a></td>\n

über der Profilansicht (view) ist dann ein weiterer Link zum editieren von Datensätzen, ausgegeben wie folgt:
Code:
<a href="index.php?cmd=edit&id=<?php echo $_GET['id']; ?>">editieren</a>

okay, somit kann man den dementsprechenden Datensatz aus der Datenbank beim editieren aufrufen.

die angewendete Methode für das Formular selbst ist POST, und die Datenbank bekommt die ID die sie editieren soll über ein verstecktes input Feld.

Code:
$sql= " SELECT * FROM `$sqldb`.`$sqltbl` WHERE `id` = ".$_GET['id']." LIMIT 1 ";

$result = mysql_query($sql) OR error("Konnte den Datensatz nicht auslesen: " . mysql_error());
if($result)
{
while($row = mysql_fetch_assoc($result)) 
	{
	?>
<form action="index.php?cmd=edit" method="post">
<input type="hidden" name="id" value="<?php echo $row['id']; ?>" />

okay, soviel zur gesamten Strategie zum editieren, aber das behebt mein Problem leider immer noch nicht.
 
Wenn ich das jetzt richtig verstanden habe, dann:
1. Eintrag mit Link auswählen, id wird mit GET in URL übergeben
2. Link zum editieren, id wird wieder mit GET in URL übergeben
3. Eintrag in DB ändern, id wird mit POST ausgelesen?
(WHERE id = '".$_POST['id']."'";) -> lies die id mit GET aus der URL aus dann müsste es klappen


wenn du z.B. den 5ten eintrag auswählst, wird dann die Nummer 5 bei id in der URL angezeigt?
 
jo, alles richtig verstanden, nur seh ich grad nicht ein warum ich die ID beim sql editieren mit GET auslesen soll, da ich die ID ja im Formular mit übertrage.

wenn ich jetzt Datensatz #9 ändern will ruf ich dass hier auf:

index.php?cmd=edit&id=9

so, im Quelltext dieser Seite steht dann:

Code:
<input type="hidden" name="id" value="9" />

die value für dieses Feld wird per GET eingetragen, was ist daran denn so verkehrt?



Mein Ziel war nämlich, dass ich bei Änderungen in der Datenbank konsequent POST benutze, also kein GET rumgekrüppel, das wird sonst wieder nur Pfusch.

im Prinzip, für alle LESEaktivitäten GET benutzen, für alles was ich in die Datenbank schreibe POST
 
Klar man es so machen wie Du schreibst. Das ist absolut kein Problem. Wichtig ist, dass alle Parameter bei der Updatefunktion letztendlich auch ankommen. Um dies zu prüfen würde ich mir auf die schnelle ein echo $sql des zusammengebastelten updatestrings testweise ausgeben lassen und in phpmyadmin kopieren zum checken auf evt. Fehler. Da sieht man auch gleich was evt. fehlt bzw. falsch ist. ;)

$sql= "UPDATE ".$sqldb.$sqltbl." SET name = '".$_POST['name']."',
lastname = '".$_POST['lastname']."',
phone = '".$_POST['phone']."',
mobile = '".$_POST['mobile']."',
email = '".$_POST['email']."',
company = '".$_POST['company']."',
position = '".$_POST['position']."',
comment = '".$_POST['comment']."',
fax = '".$_POST['fax']."' WHERE id = '".$_POST['id']."'";

echo "\n".$sql;

oder

echo "\nUPDATE ".$sqldb.$sqltbl." SET name = '".$_POST['name']."',
lastname = '".$_POST['lastname']."',
phone = '".$_POST['phone']."',
mobile = '".$_POST['mobile']."',
email = '".$_POST['email']."',
company = '".$_POST['company']."',
position = '".$_POST['position']."',
comment = '".$_POST['comment']."',
fax = '".$_POST['fax']."' WHERE id = '".$_POST['id']."'";

Achso das vorherige Abfragen der ID kann natürlich aus Sicherheitsgründen interessant sein. Schliesslich kann jeder an eine URL irgendwas manuell anhängen. Wenn Du das ausschließen kannst, dann ist alles paletti.
Generell sollte man alle übertragenen Variablen auch auf Plausibilität ansich prüfen, egal ob Get oder Post etc. Damit kann man viel Schindluder treiben.
 
Zuletzt bearbeitet:
Lass dir die Werte von $row['id'] und $_POST['id'] anzeigen

edit: ich war wohl zu langsam
 
so, okay, hier ist der SQL String den ich zurückbekomm wenn ich den Datensatz1 ändern will:
Code:
UPDATE `cvo`.`telefonkontakte` SET `name` = 'test', `lastname` = 'test', `phone` = 'test', `mobile` = 'test', `email` = 'test', `company` = 'test', `position` = 'test', `comment` = '1337', `fax` = 'test' WHERE `telefonkontakte`.`id` = '1' LIMIT 1 ;

wenn ich das bei nem anderen Datensatz versuche kommt garkein Ergebnis zurück, nur ne weiße Seite, ohne Fehler, ohne alles...
 
Limit 1 gehört da nicht rein! Wie oft eigentlich noch? ;)
Ausserdem wenn vorne schon `cvo`.`telefonkontakte` dann beim where wenigstens auch, also auf eins einigen. Muss denn überhaupt das `cvo`. davor? Und reicht hinten nicht WHERE `id` = '1'
 
Zuletzt bearbeitet:
wenn mir das phpmyadmin ausgibt, benutz ichs auch, ich mein, warum auch nicht? Mehr als 1 Datensatz darf einfach nicht editiert werden, macht Sinn oder? die ID ist zwar einzigartig, aber hey, doppelt gemoppelt hält besser.


das cvo ist der Datenbankname, und das ganze SQL Zeug hab ich 1:1 aus phpmyadmin kopiert, und wenn da vorne die Datenbank mit dransteht, schreib ichs eben auch mit hin, ich hab mein configfile auch erweitert und somit die Datenbank variabel gemacht...

sorry, aber das MySQL hab ich irgnetwann mal in der Schule gelernt, mittlerweile hab ich wieder alles vergessen, weil ich fast nichts mehr mit MySQL mache, von daher hab ich einfach phpmyadmin vertraut, und es funktioniert ja scheinbar, zum mindest beim Datensatz1
 
Naja ne ID sollte normalerweise eindeutig sein. Da haben mehrere gleiche in der Tabelle einfach nichts zu suchen. Daher ist es auch völlig überflüssig. Er updatet sowieso dann nur die DS mit id='x', das ist und sollte in Regel auch nur 1 DS betreffen. ansonsten wirst du früher oder später eh Probleme bekommen, zumindest bei updates nach id/key. ;)
Das Limit wird könnte zu Problemen führen, wenn die zu updatende ID nicht auch gleichzeitig DS Nr 1 in der Tabelle ist.

Mach dir doch bitte nicht so schwer. Hier haben die Leute sicher auch genügend php und Mysql-Erfahrung. Glaub ihnen doch einfach mal und verlass dich nicht auf Dein Schulwissen oder die Ausgaben von phpmyadmin. :D
 
Zuletzt bearbeitet:
Nein nicht Erbsenzähler, essentiell. :)
Dann gib doch mal in Dein php-script testweise zb:

$sql="UPDATE `cvo`.`telefonkontakte` SET `name` = 'test', `lastname` = 'test', `phone` = 'test', `mobile` = 'test', `email` = 'test', `company` = 'test', `position` = 'test', `comment` = '1337', `fax` = 'test' WHERE `telefonkontakte`.`id` = '5' LIMIT 1 ";

direkt ein und einmal in phpmyadmin. Wenn es mit beiden geht, kann es ja nicht daran gelegen haben. Anderfalls war es überzeugend. ;)
 
geht bei beiden, aber grad ist mir was aufgefallen....

Die Lösung des Problems war einfach mal wieder zu einfach...

Ich hab die Daten für die Datenbank selbst von einem selbstgebalsteltem CSV einer Exceltabelle erstellt, und um die fehlenden Spalten aufzufüllen hab ich einfach 0 benutzt

und jetzt rate mal warums nicht ging :p

Problem gelöst. Ein Aufwand wegen nichts und wieder nichts. aber eins kann ich dir sagen: am LIMIT 1 hats nicht gelegen.
 
Na supi. :daumen: Das konnten wir natürlich nicht wissen.
Trotzdem kann ich Dir weiterhin nur empfehlen, gewöhne Dir solchen Murks wie das Limit bei update und insert garnicht erst an. Solche einstigen Überflüssigkeiten könnten später fataler Ernst werden und in Chaos oder erhöhtem Aufwand enden. Nur so als Tip aus Erfahrung. ^^
Das betrifft übrigens auch Deine inkonsequente php-Syntax. (Stichwort: "UPDATE `$sqldb`.`$sqltbl` SET `name` = '".$_POST['name']."', ...):D
 
Zuletzt bearbeitet:
Zurück
Oben