Einzelnen Beitrag anzeigen
  #7 (permalink)  
Alt 27-02-2014, 15:18
anihex
 Registrierter Benutzer
Links : Onlinestatus : anihex ist offline
Registriert seit: Feb 2014
Beiträge: 28
anihex befindet sich auf einem aufstrebenden Ast
Standard

Hallo mbspeedy,

zu 1.): Die mysql_* Abfragen sind - wie gesagt - veraltet und werden in einer späteren Version entfernt. MySQLi (=MySQL improved) ist eine etwas bessere Variante. Man kann sie prozedual (also wie mysql_*) nutzen.
Der Vorteil ist jedoch, dass man sie auch Objekt orientiert (=OOP) verwenden kann.
PDO (=PHP Database Object) ist ein allgemein gültiges Datenbank-Objekt. Wie der Name schon vermuten lässt, ist auch hier OOP angesagt. Dafür kann man PDO aber für MySQL, SQLite, MS SQL etc. verwenden (Nur die Abfragen selbst müsste man umgestalten).
Weil PDO komplett OOP ist (im Gegensatz zu MySQLi) würde ich dies bevorzugen.
Peter hat auf seiner Website sehr viele Informationen dazu, die auch gut erklärt sind. (Meiner Meinung nach)

Zu 2.): Jetzt verstehe ich den Aufbau deines Formulars (denke ich jedenfalls).
In deinem Beispiel gibt es ein Problem.
Du gehst davon aus, dass die Seite auf jeden Fall über eine POST-Abfrage aufgerufen wird. Das ist aber natürlich nicht immer gewähleistet.
Daher setzt man erstmal Default-Werte. In meinem Beispiel sind das diese Zeilen: (Korrigiert)
PHP-Code:
    // Aktuelles Datum ermitteln
    
$Jahr date"Y" );
    
$Monat date"n" ); 
Wie du siehst, rufe ich die Funktion "date" auf und übergebe ihr nur ein Format an das sie sich halten soll. Das hat einen einfachen Grund: Übergebe ich der Funktion keinen Timestamp, wird die aktuelle Zeit benutzt. Und durch "Y" bzw. "n" bekomme ich das aktuelle Jahr (vierstellig) bzw. den Monat (ohne führende Null).
Mit diesen Werten wird das Skript nun arbeiten. Es sei denn, der Nutzer hat über POST andere Werte übermittelt.
Seiten können dabei über POST oder GET aufgerufen werden. GET ist dabei der Standard. Sollte die Seite aber über POST aufgerufen werden (z.B. über ein Formular), dann enthält die Superglobale $_SERVER einen Hinweis darauf. Was eine Superglobale ist, hat Peter im Abschnitt "Grundlagen" erklärt.
Eines der möglichen Werte hierbei ist "REQUEST_METHOD". Dort ist dann entweder POST oder GET enthalten.
Sollte die Seite nun über POST aufgerufen werden (und nur dann), dann versuchen wir einen Wert auszulesen.
PHP-Code:
        // Monat aus der Post Abfrage filtern
        
$TmpMonat filter_inputINPUT_POST "tab"FILTER_VALIDATE_INT ); 
Um den Wert von $Monat nicht blindlings zu überschreiben, speichern wir den Wert erstmal in einer temporären Variable. Die Funktion "filter_input" übernimmt in diesem Fall so ziemlich alles, was wir sonst manuell machen müssten.
Als da wären:
- Prüfen ob das Feld gesetzt ist
- Sicherstellen, dass der Wert eine Zahl ist
Solltest du dich fragen: "Wie? Prüfen ob das Feld gesetzt ist? Das Formular enthält die Daten doch!", dann lass mich dir Folgendes sagen: Die Daten könnten von überall kommen. Nicht nur von deinem Formular. Daher gilt: Prüfen, prüfen, prüfen!
Oberste Regel lautet: "Misstraue deinem Nutzer." Klingt hart, aber nur so kannst du Angriffe versuchen vorzubeugen.

Kommen wir zum letzten Schritt in der Überprüfung:
PHP-Code:
        if ( ($TmpMonat >= 1) && (!empty( $MonatsID$TmpMonat ])) ) {
            
$Monat $TmpMonat;
        } 
Hier wird nun geprüft, ob $TmpMonat einen gültigen Wert hat. Denn nach der Wertzuweisung durch filter_input hat $TmpMonat eines von drei möglichen Werten:
- false
- NULL
- Einen Integer
In den ersten beiden Fällen ist $TmpMonat (als Zahl betrachtet) unter 1. Im Fall, dass $TmpMonat mindestens 1 ist, wird versucht den Monat in der Tabelle möglicher Monats-IDs zu finden. Und nur wenn der Monat auch dort gefunden wird, bekommt $Monat den Wert von $TmpMonat.

Da du die ID ja nicht brauchst, kannst du auch einen Bereichs-Check durchführen.
Also
PHP-Code:
        if ( ($TmpMonat >= 1) && ($TmpMonat <= 12) ) {
            
$Monat $TmpMonat;
        } 
Allerdings ist mir vorhin aufgefallen, wäre es vielleicht besser, wenn man den Wert von $TmpMonat vorher auf jeden Fall zu einem Integer umwandelt.
intval bietet sich hierfür eigentlich an.
Hier nochmal der komplette Code. Aber ein wenig korrigiert und angepasst.
PHP-Code:
 <?php
    
// Aktuelles Datum ermitteln
    
$Jahr date"Y" );
    
$Monat date"n" );

    
// Vom Benutzer festgelegt
    
if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {
        
// Monat aus der Post Abfrage filtern
        
$TmpMonat intvalfilter_inputINPUT_POST "tab"FILTER_VALIDATE_INT ) );

        if ( (
$TmpMonat >= 1) && ($TmpMonat <= 12) ) {
            
$Monat $TmpMonat;
        }
    }

    
// Zugriff auf die Monats-ID
    
echo $MonatsID$Monat ];

    
// Hier dann deine Datenbank-Abfrage
?>
Ich hoffe das hilft dir ein wenig weiter.

Geändert von anihex (27-02-2014 um 15:24 Uhr) Grund: Zu früh auf "Abschicken" geklickt. Post vervollständigt.
Mit Zitat antworten