kostenloser Webspace werbefrei: lima-city


Fehler in PHP Script

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    davy

    Kostenloser Webspace von davy

    davy hat kostenlosen Webspace.

    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&auml;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 &Auml;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, kommt
    Beim Ändern deines Profiles trat leider ein Fehler auf!


    Bitte helft mir !
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ü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 = ?
  4. w******d

    mit
    echo mysql_error();
    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.
  5. Autor dieses Themas

    davy

    Kostenloser Webspace von davy

    davy hat kostenlosen Webspace.

    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
  6. w******d

    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.
  7. 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...
  8. Autor dieses Themas

    davy

    Kostenloser Webspace von davy

    davy hat kostenlosen Webspace.

    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?
  9. 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!
  10. 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
  11. 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
  12. 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 ;)
  13. 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).
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!