Fehler in PHP Script
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alter code
array
befehl
check
code
date
datenbank
datum
fehler
feld
hobby
jemand
label
profil
schule
setzen
tabelle
ultra
vermeiden
vorname
-
Hallo !
Ich probiere schon seit gestern Abend den Fehler zu finden. Mache ich irgendwas falsch?
<?php include ("checkuser.php"); include ("sql.php"); if($insert = @mysql_query("UPDATE userdaten SET Nachname = '".$_POST['nachname']."', uebermich = '".$_POST['Uebermich']."', Vorname = '".$_POST['Vorname']."', Wohnort = '".$_POST['Wohnort']."', EMail = '".$_POST['mail']."', homepage = '".$_POST['hp']."', ICQ = '".$_POST['icq']."', Alter = '".$_POST['Alter']."', MSN = '".$_POST['MSN']."', Schule = '".$_POST['schule']."', Klasse = '".$_POST['klasse']."', Fanclub = '".$_POST['Fanclub']."', Hobbys = '".$_POST['Hobbys']."', ultra = '".$_POST['ultra']."', ichmag = '".$_POST['ichmag']."', ichmagnicht = '".$_POST['ichmagnicht']."' WHERE Username like '".$_SESSION['user_nickname']."'")) { echo '<p align="center"><font size="2"><br><br><br>Dein Profil wurde erfolgreich geändert!<br>Bitte drücke auf deiner Profilseite einmal F5, damit die Daten aktualisiert werden<br><br><a href="loginbereich.php"><font face="Arial"><b>Zurück zum Profil</b></font></a></font><br><br><br></p>'; }else{ echo '<p align="center"><font size="2"><br><br><br>Beim Ändern deines Profiles trat leider ein Fehler auf!<br><br><a href="loginbereich.php"><font face="Arial"><b>Zurück zum Profil</b></font></a></font><br><br><br></p>'; } ?>
Wenn ich probiere, was zu ändern, kommtBeim Ändern deines Profiles trat leider ein Fehler auf!
Bitte helft mir ! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Überprüf erstmal, ob die Spalten existieren (Groß- u. Kleinschreibung!) und mach mal
echo $_SESSION['user_nickname'];
und schau, ob da was gescheites dabei rauskommt.
Aber wieso benutzt du eigentlich LIKE und nicht = ? -
mit
kannst du dir evtl Mysql-Fehglermeldungen anzeigen lassen. Auch wenn die meistens sehr unpräzise sind (ist zumindest meine Erfahrung), kann das bei der Fehlersuche helfen.echo mysql_error();
-
Ich hab jetzt in den Code das eingefügt:
echo $_SESSION['user_nickname']; echo mysql_error();
Bei dem ersten kam der richtige Nickname und beim zweiten kam das:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Alter = '', MSN = '', Schule = '', Klasse = '', Fanclub = '', Hobbys = '', ultra' at line 1 -
ah, natürlich ALTER ist ein SQL-Befehl. Wenn du ein Feld hast, das so heißt musst du den Namen in solche Apostrophe ` setzen.
also:... `Alter` = '".$_POST['Alter']."', ...
Das würde ich sowieso grundsätzlich bei allen Tabellen- und Spaltennamen machen um eben solche Fehler von vornherein zu vermeiden. -
Das riecht doch wieder nach lustigen Injections, aber ist ja Deine Sache ob Du Daten aus $_POST, $_GET und $_COOKIE, direkt in die Datenbank schreibts. Nur heul dann nicht rum, wenn jemand Dir die DB zerschießt. Mein Tipp:
Alle Eingaben die in die Datenbank sollen müssen geprüft werden! Egal ob sie nur von Dir kommen, oder von sonst wem... sonst lässt Du Tür und Tor für etwaige Angriffe offen. Interesant für Dich wäre zum Beispiel der Umstieg auf MySQLi... damit kann man sich ne Menge Excapen und Bastelei mit sparen. Ein passendes Tutorial findes Du um aktuellen QNET PHP Tutorial... -
widiland schrieb:
ah, natürlich ALTER ist ein SQL-Befehl. Wenn du ein Feld hast, das so heißt musst du den Namen in solche Apostrophe ` setzen.
also:... `Alter` = '".$_POST['Alter']."', ...
Das würde ich sowieso grundsätzlich bei allen Tabellen- und Spaltennamen machen um eben solche Fehler von vornherein zu vermeiden.
Danke ! Daran habe ich nicht gedacht.
Jetzt funktioniert es !
@strange Wie kann man sich davor schützen? -
davy schrieb:
widiland schrieb:
ah, natürlich ALTER ist ein SQL-Befehl. Wenn du ein Feld hast, das so heißt musst du den Namen in solche Apostrophe ` setzen.
also:... `Alter` = '".$_POST['Alter']."', ...
Das würde ich sowieso grundsätzlich bei allen Tabellen- und Spaltennamen machen um eben solche Fehler von vornherein zu vermeiden.
Danke ! Daran habe ich nicht gedacht.
Jetzt funktioniert es !
@strange Wie kann man sich davor schützen?
Das hat er schon gesagt und wenn ich mich richtig errinere hat er das schon mal bei einem anderen Script gesagt!
Benutz die MySQLi-Klasse! -
Mit der MySQLi Klasse alleine ist es aber nicht getan... Query muss man dann ein wenig anders behandeln. So würde zum Beispiel eine Abfrage die die Variable $_GET['id'] verwendet so aussehen:
$sql = 'SELECT Label, Content, Date as Stamp FROM news WHERE ID = ? ORDER BY Date DESC'; $stmt = $db->prepare($sql); $stmt->bind_param('i', $_GET['id']); $stmt->execute(); $stmt->bind_result($label, $content, $date); while($stmt->fetch()) { $news[] = array( 'Titel' => $label, 'Inhalt' => $content, 'Datum' => $date ); } $stmt->close();
Sollte eigentlich fast selbst erklärend sein. Im Prinzip wird hier ein Array erzeugt in dem die ganzen Einträge, absteigend, nach dem Datum sortiert sind. Das ich hier $_GET['id'] direkt eingesetzt habe ist nicht so wild, da hier erst geprüft wird ob $_GET['id'] vom Typ Integer ist. Das kann man aber selber per hand machen:
if(is_numeric($_GET['id'])) { echo '$_GET["id"] ist eine Zahl'; } else { echo '$_GET["id"] ist keine Zahl'; }
Naja, aber am besten sucht man sich ein Tutorial, dass dies genau behandelt ;)
Beitrag zuletzt geändert: 5.7.2009 20:39:36 von strange -
Ich möchte an dieser Stelle nur sicher stellen, dass obiges auch richtig interpretiert wird: In obigem Fall, hat das preparen des Queries wenig Sinn. In einem solchen Fall greift man zu normalem escapen oder zum einfügen via typed placeholders. Preparing ist für den Fall vorgesehen, dass ein Querie mit verschiedenen Daten mehrfach ausgeführt wird, insbesondere, wenn das Parsen und Optimieren des Queries aufwändiger wird. Aber ansonsten natürlich eine sehr schöne und beqeme Methode ;)
Statt mysqli kann man auch PDO nutzen. Weiß eigentlich, ob mysqli irgendwelche Vorteile gegenüber pdo bietet?
Beitrag zuletzt geändert: 5.7.2009 21:46:04 von nikic -
Es ist klar das prepare() hier nicht viel bringt und man mit nem einfach Check besser bedient ist... es soll nur den Weg zeigen den man gehen kann. Schon is_numeric() reicht bei nem simplen ID-Check völlig aus und dann kann man die Variable auch ohne Probleme direkt im Query verarbeiten, ohne extra STMT zu verwenden.
Aber grade Abfragen in denen Strings übergeben werden, da lohnt sich schon eher die prepare() Methode. Genau deswegen habe ich auch auf ein Tutorial verwiesen, damit der TE nicht gleich direkt alle standard MySQL Abfragen durch prepare() jagt ;) -
Okey, ich wollte das nur mal ganz klar gesagt haben. Man sollte zumindest nie vergessen, dass ein prepared Querie nur halb so schnell ist wie ein normaler, wenn man ihn nur einmalig nutzt und er zudem noch trivial ist.
Aber kann mir eigentlich jemand sagen was besser ist, pdo oder mysqli? Ich hab mich da schon durch ne Menge Diskussionen gewälzt wo es in etwa darauf hinausging, dass man PDO wirklich nur dann verwenden sollte, wenn man sich sehr gut mit PHP auskennt, da pdo deutlich schwerer zu verstehen ist. Aber bis auf die Tatsache, dass PDO zwischen DBMS portabel ist und eher die professionelle Variante ist, habe ich keine Unterschiede gefunden (bis auf das, das mysqli noch mit ein Paar unnötigen Funktionen aufgefüllt wurde). -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage