MySQL Fehler oder wie?

  • Hallo Leute,

    habe morz das Prob.
    Möchte einen Shop basteln und bekomme immer wieder beim reinlegen eines Artikels eine Fehlermeldung. Habe schon einiges probiert aber komme einfach nicht weiter.

    Schaut mal bitte auf:
    http://shadowroot.sh.funpic.de/PHP03/
    Kennung und Passwort sind beide Male "admin".

    Die Files findet Ihr unter:
    http://shadowroot.sh.funpic.de/php03.zip

    Hoffe Ihr findet das Problem weil ich bin einfach nur verzweifelt.
    Danke schon ein Mal im vorraus.

    Mfg Shadow13Nova

  • Setz die Tabellen-/Feld-Namen im MySQL-Query immer in Backtick damit diese auch als solche erkannt werden.

    SCHLECHT:

    SQL
    SELECT tabelle.* FROM tabelle WHERE tabelle.id = 5

    RICHTIG:

    SQL
    SELECT `tabelle`.* FROM `tabelle` WHERE `tabelle`.`id` = '5'
  • Ich meine, irgendwo gelesen zu haben, dass man die 5 nicht in Hochkommata zu nehmen bräuchte (bzw nicht soll), wenn das Feld ein Zahlentyp ist. Stimmt das?

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Wenn ich warenkorb.php aufrufe kommt eine Fehlermeldung. Wenn ich in die Datei schaue ist mir vermutlich auch klar wieso. Das Statement solltest Du so schreiben:

    Code
    $anzahl = "SELECT count(*) as anzahl FROM warenkorb WHERE kundennummer=".$nummer." AND artikel-id=".$id;

    Und natürlich solltest Du vorher prüfen, ob in $nummer auch wirklich etwas steht. Wenn nicht wäre hier sehr gut erklärbar wieso der Fehler kommt. ;)

    Außerdem würde ich Spaltennamen mit Bindestrich und anderen Sonderzeichen vermeiden, also nicht "artikel-id" schreibe.

    Afrael: ja, hast recht. Aber auch ich schreibe das immer in Anführungszeichen. Erleichtert das Lesen etwas und MySQL hat damit scheinbar ohnehin kein Problem.

  • @shadow13nova
    Ähm... da sind jetzt noch ein paar erhebliche logische bzw. Sicherheitsfehler drin. Machts dir was aus, wenn ich die hier anspreche (dann haben andere evtl auch was davon), oder soll ich dir lieber eine PM schreiben?

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Du scheinst register_globals zu benutzen, d.h., dass Variablen, die über die URL übergeben werden, direkt in deinem Script eingesetzt werden. Das sollte man niemals nie machen. Jemand könnte über die URL deine internen Variablen überschreiben und somit dein Script ordentlich durcheinanderbringen. Benutz stattdessen
    ini_set("register_globals","Off");
    $meldung=$_GET['meldung'];
    usw.

    Außerdem solltest du genau sowas

    PHP
    if (isset($meldung))
        {
          print "<font color='red'>Fehler: $meldung</font>";
        }

    nicht machen. Informiere dich mal über XSS. Ich schlage vor, dass du jeder Fehlermeldung eine Nummer zuweist und diese über GET-Parameter übergibst. Anschließend pickst du anhand des Errorcodes die Meldung aus einem Array.

    In bestellung.php:

    PHP
    $sql = "DELETE FROM warenkorb";
    mysql_query($sql) or die (mysql_error());

    Du willst doch sicherlich nicht, dass alle Einträge in allen Warenkörben gelöscht werden, oder?
    Außerdem dürfen Feldnamen, meine ich, keine Bindestriche enthalten, nimm lieber Unterstriche.

    Zitat

    "INSERT INTO bestellungen (bestellid,artikelid,kundennummer,anzahl) SELECT artikelid, kundennummer FROM warenkorb WHERE warenkorb.kundennummer=".$_SESSION['nummer']"

    Wie soll das gehen, was auch immer das soll? 8|
    warenkorb.php

    PHP
    $sql = "select name, preis, anzahl from artikel, warenkorb where warenkorb.kundennummer=".$_SESSION['nummer']." AND artikel.id=warenkorb.artikel-id";

    wird, meine ich, so nicht funktionieren. Was du suchst, ist ein INNER JOIN.
    Ich glaube, bis auf ein paar kleine HTML-Details wars das.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • @Koko
    Feldnamen dürfen Bindestriche haben, allerdings müssen sie dann in ` ` gesetzt werden.

    nova
    Du solltest nach Möglichkeit statt " " lieber ' ' verwenden. Ist schneller bei der Auswertung. Schau dir mal bei php.net an, was bei " " alles für ein Unsinn gemacht werden kann, da willst du lieber was einfaches haben.
    Außerdem ist <font> veraltet. Du solltest <span> mit CSS-Vorgaben verwenden. Also statt <font color='red'> (<-- Da übrigens müssen " ", weil es HTML und nicht PHP ist) besser <span style="color: red;">. In (X)HTML Strict und XHTML 1.1 ist <font> sogar verboten.

    Viele liebe Grüße
    The User

  • @all Vielen Dank für die Antworten.
    Ihr könnt hier auch über Sicherheitsmängel aufmerksam machen.
    Soll aber ein ganz einfacher Warenkorb werden. Brauch keine Sicherheitsfeatures! Will nur das dieses Teil funktioniert^^.

    Mfg Shadow13Nova