2, 3, 4 sind gut aber 1 nicht

  • Heyho,
    ich habe ein komisches Problem mit PHP und MySQL. Es ist zusätzlich noch ein wenig schwierig zu erklären. Also ich versuche es einmal:


    Es gibt um einen Admin Panel, welcher bisjetzt so aussieht:
    [attachment=1]<!-- ia1 -->Unbenannt.PNG<!-- ia1 -->[/attachment]


    Eine kleine MySQL Tabelle ist die Basis dafür. Diese Tabelle ist echt simpel aufgebaut:
    [attachment=0]<!-- ia0 -->Unbenannt2.PNG<!-- ia0 -->[/attachment]


    Die Tabelle dient zur "Statusabfrage". Es gibt vier Optionen, die im Admin Panel eingestellt werden können:

    • Anzeige (Ob die Seite angezeigt wird oder momentan gesperrt ist)
    • IP-Sperre (Per IP können bestimmte Besucher "verbannt" werden)
    • .htaccess Sicherung (Die Seite kann durch .htaccess gesichert werden)
    • IP-Listing (Auflistung aller Besucher mit IP, Browser...)


    Ich weiß, dass ich die Spalte status leiber boolean gemacht hätte, aber nehmt es einfach hin. Das hat seine Gründe^^
    Die rechte Spalte der Tabelle (das obere Bild, nicht MySQL) ist dazu da, den Status der Option zu ändern. Der Code funktioniert komischerweise aber nur bei Option 2, 3 und 4. Aber 1 funktioniert irgendwie nicht. Irgendwie wird der Status immer nur aktiviert. Die kleinen Werkzeugbilder sind ein Link mit REQUEST Angabe. Diese REQUEST Angabe enthält einfach die id der Option. Hier ist der Code:



    Warum ist das so? Warum funktioniert 1 nicht?


    Am Rande könnt ihr mir auch sagen, wie ihr mein Ergebnis findet. Ich glaube selbst, dass es nicht gerade gut ist.


    Mit freundlichen Grüßen,
    Philipp Escher

  • Woa.. mir haben sich gerade einige male meine Fußnägel gekräuselt als ich den Code gesehen habe O.o


    1. MySQL-Tabele.. okey, wenn du unbedingt bei Status diese Angaben machen möchtest. Sinnvoller wäre es eigentlich mit einem tinyint zu arbeiten.
    Aber okey, dann arbeite mit Text, tue mir aber bitte einen gefallen und verwende dann ENUM anstelle von VARCHAR.
    (ENUM wird von MySQL wie ein Int behandelt, liefert aber VARCHARS zurück. Ist quasi ein Array, index 0 hat den Wert "red", index 1 den Wert "yellow" usw.. tut ein bisschen was der Serverperformence gut^^)
    2. Request ist gaaanz dreckig. Verwende Post oder Get.
    3. $_REQUEST > '4' .. bitte was? O.o wir vergleichen 2 Strings als ob sie zahlen wären? Sorry, geht gar nicht.. und zur Serversicherheit solltest du diese Eingabe mittels intval(); besonders bei der MySQL-Abfrage absichern. Übrigens auch nicht schön, dass das soooo dynamisch Funktioniert.. :/
    4. SELECT * IS EVIL! Nenne genau die Felder die du haben willst, geht schneller für MySQL und liefert mehr Übersicht. Außerdem ist es eigentlich feiner wenn man mit $r["status"] arbeiten kann, denn was passiert, wenn du mal eine Spalte hinzufügst? Dann musst du alle Indexe anpassen.
    5. `id` LIKE ? Was genau möchtest du damit versuchen? Im Schlimmsten Fall hast du damit auch schon eine weitere Fehlerquelle geschaffen, wenn du bei >10 ankommst.


    Wie heißt deine Tabelle? "status"?
    UPDATE [TABLE] ... nur zur Information.


    Sicher das auch 1 ankommt bei REQUEST?


    Gruß
    Sarkkan

  • Also, ich habe das, was ich verstanden entsprechend editiert:



    Wie soll ich das anstellen mit den Indexen, wo ich anstatt Zahlen die Feldernamen benutzen soll? Mit Arrays?


    Das mit der MySQL Tabelle und ENUM funktioniert nicht da kommt immer eine Fehlermeldung bei phpmyadmin.


    Das mit Request habe ich dann mal geändert. Aber warum ist das dreckig?


    intval() habe ich jetzt auch benutzt.


    `id` = ist auf jeden Fall besser.


    Natürlich kommt 1 im Request an, weil da ja steht ?id=1


    Was kann ich noch tun?




    EDIT


    Ich habe einfach mal die Einträge in der Tabelle um eine Nummer (id) hochgestetzt, jetzt funktioniert es. Komisch, aber wahr! Es liegt an der 1^^

  • Zitat von &quot;Yamram&quot;

    Wie soll ich das anstellen mit den Indexen, wo ich anstatt Zahlen die Feldernamen benutzen soll? Mit Arrays?

    Du? Garnicht. Du arbeitest weiter wie bisher.
    Du schreibst red in die Datenbank und bekommst yellow zurück und so weiter. Nur der MySQL-Server arbeitet für sich mit Zahlen wie mit einem Array.

    Zitat von &quot;Yamram&quot;

    Das mit der MySQL Tabelle und ENUM funktioniert nicht da kommt immer eine Fehlermeldung bei phpmyadmin.

    Wie oft muss man dir/euch eigentlich sagen, dass solche Fehlermeldungen für Leute die davon eine Ahnung haben sehr interessant sein kann? -.-
    Du wirst übrigens beim Ändern einfache Anführungszeichen und Kommata benutzen müssen, meine die "Länge" muss nachher so aussehen: 'red', 'yellow', 'green'

    Zitat von &quot;Yamram&quot;

    Das mit Request habe ich dann mal geändert. Aber warum ist das dreckig?

    Weil du alles als alles akzeptierst. via $_REQUEST werden nämlich Post, Get und Cookies zusammen gefasst. Und so kann ich ganz einfach mittels eines GET-Parameters jeden anderen Post und Cookie überschreiben. Man muss es Angreifern nicht unbedingt zu einfach machen :/

    Zitat von &quot;Yamram&quot;

    Ich habe einfach mal die Einträge in der Tabelle um eine Nummer (id) hochgestetzt, jetzt funktioniert es. Komisch, aber wahr! Es liegt an der 1^^

    [Sarkasmus]Sehr Professionell :)[/Sarkasmus]

  • Zitat von &quot;Sarkkan&quot;

    Du? Garnicht. Du arbeitest weiter wie bisher.
    Du schreibst red in die Datenbank und bekommst yellow zurück und so weiter. Nur der MySQL-Server arbeitet für sich mit Zahlen wie mit einem Array.


    Verstanden. Ich muss also garnichts machen^^




    Zitat von &quot;Sarkkan&quot;

    Wie oft muss man dir/euch eigentlich sagen, dass solche Fehlermeldungen für Leute die davon eine Ahnung haben sehr interessant sein kann? -.-
    Du wirst übrigens beim Ändern einfache Anführungszeichen und Kommata benutzen müssen, meine die "Länge" muss nachher so aussehen: 'red', 'yellow', 'green'


    Tut mir Leid, beim Schreiben der Antwort war ich in Eile und hatte keine Zeit die Fehlermeldung nochmal zu "holen". Hier ist mal ein kleines Bildchen:
    [attachment=0]<!-- ia0 -->Unbenannt.PNG<!-- ia0 -->[/attachment]




    Zitat von &quot;Sarkkan&quot;

    Weil du alles als alles akzeptierst. via $_REQUEST werden nämlich Post, Get und Cookies zusammen gefasst. Und so kann ich ganz einfach mittels eines GET-Parameters jeden anderen Post und Cookie überschreiben. Man muss es Angreifern nicht unbedingt zu einfach machen :/


    Ich hatte anscheinend eine kleinen Fehler in der Auffasssung von $_REQUEST :D Danke :P




    Zitat von &quot;Sarkkan&quot;

    [Sarkasmus]Sehr Professionell :)[/Sarkasmus]


    ?!

  • Zitat von &quot;Yamram&quot;

    Tut mir Leid, beim Schreiben der Antwort war ich in Eile und hatte keine Zeit die Fehlermeldung nochmal zu "holen". Hier ist mal ein kleines Bildchen:
    [attachment=0]<!-- ia0 -->Unbenannt.PNG<!-- ia0 -->[/attachment]

    ENUM hat keine "Länge" sondern ein "Set". Hier kommen also die vordefinierten Werte herein, also anstelle von 6 => "red", "yellow", "green".


    Zitat von &quot;Yamram&quot;

    ?!

    Was den? :) Das ist das perfekte vorgehen :)
    /sarkasmus

  • Zitat von &quot;Sarkkan&quot;

    ENUM hat keine "Länge" sondern ein "Set". Hier kommen also die vordefinierten Werte herein, also anstelle von 6 => "red", "yellow", "green".


    Was den? :) Das ist das perfekte vorgehen :)
    /sarkasmus



    OK.
    Ich wurde nur ein bisschen stutzig wegen Sarkasmus und Sarkkan O__o

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!