Formular für Website erstellen

Mister.Y

Neues Mitglied
Hallo zusammen,

ich müsste ein für einen Benutzer eine Auswahlmöglichkeit erstellen, welche anschließend in einem Formular, 2 Auswahlmöglichkeiten bieten soll.
Auswahlmöglichkeiten:
- aktuelles Jahr
- vorheriges Jahr

Zeitraumeinschränkung:
- aktuelles Jahr: 01.01.AKTUELLESJAHR - 31.12.AKTUELLESJAHR
- vorheriges Jahr: 01.01.AKTUELLESJAHR-1 - 31.12.AKTUELLESJAHR - 1

je Nach Auswahl wird dann ja der Zeitraum festgelegt, welches in einem SQL-Statement verarbeitet werden soll.

Ich kann das Formular über HTML erzeugen oder direkt über PHP.
Was wäre hier der beste Weg?

Anschließend habe ich noch das SQL-Problem, weil ich irgendwie die Daten der Auswahl nicht verarbeitet bekomme.
Vielleicht kann mir hier auch jemand kurz den richtigen SQL-Statement kurz beschreiben, wie ich nur Werte aus dem Zeitraum bekommen kann. Ich hätte vermutet, dass ich dazu einen BETWEEN Operator nutzen müsste... funktioniert aber - ohne Fehlermeldung - leider nicht.

Irgendwie hört sich das ganze nicht super schwer an, aber vor allem das Formular bzw. die Auswahlmöglichkeit hat irgendwie nur Ergebnisse für mich parat, die nicht zum gewünschten Ergebnis führen :-(
Vermutlich für euch... ein Einfaches. Aber irgendwie hab ich immer irgendwelche Dreher drin :-(
 

Mat

Aktives Mitglied
Mit Bezug auf deine vorigen Threads:

Benutzt du im Frontend noch deinen JavaScript-Kalender? Bei dem könntest du die Beschränkung einrichten und zusätzlich mit PHP prüfen, ob die Werte erlaubt sind (falls das wichtig ist).

PHP:
PHP:
// Ein paar Beispiele mit der Standardbibliothek
$heute = new \DateTime();     // Aktuelles Datum als DateTime Objekt
$jahrAktuell    = (int)$heute->format('Y');     // Aktuelles Jahr als Zahl
$jahrZuvor      = $jahrAktuell -1;             // Voriges Jahr als Zahl

$jahrZuvorStart      = new \DateTime("{$jahrZuvor}-01-01");   // VORJAHR-01-01
$jahrZuvorEnde       = new \DateTime("{$jahrZuvor}-12-31");   // VORJAHR-12-31
$jahrAktuellStart    = new \DateTime("{$jahrAktuell}-01-01"); // AKTUELL-01-01
$jahrAktuellEnde     = new \DateTime("{$jahrAktuell}-12-31"); // AKTUELL-12-31

// Validierungsbeispiel
$inputDatum = new \DateTime('2021-05-17'); // Bereinigte Formulardaten als String eingeben
if($inputDatum > $jahrAktuellEnde || $inputDatum < $jahrZuvorStart) { exit('Ups!'); }

Wenn du da komplexere Sachen mit Daten machen möchtest, lohnt sich die Bibliothek Carbon


funktioniert aber - ohne Fehlermeldung - leider nicht.
Welche Fehlermeldung denn? Wie sieht deine Abfrage aus?
Werden die Daten in SQL jetzt als DATE/DATETIME gespeichert?
 

Mister.Y

Neues Mitglied
das SQL_Statement gibt ja KEINEN Fehler aus.
Teilweise werden Werte vom Type Calendar gespeichert:
1634636254644.png

Teilweise aber auch als normaler Text:
1634636306724.png


Begründet ist das hier in der Software, die uns das Formular zur Verfügung stellt. Das eine wird automatisch via PHP erzeugt und dann wird es wohl als TEXT in der DB gespeichert. Das zweite wird über eine händische Auswahl vom User selbst in einem Calender-Modul ausgewählt, was dann als Calendar abgespeichert wird.
Da hab ich nicht so viel Einfluss drauf :-(

Was ich auswerten muss für den Between-Bereich: Den Text-Dateneintrag :-(

Sprich: Ich wähle in einem noch nicht genauer definierten Formular aus, welchen Zeitraum man auswerten muss und würde dann die SQL mit Between einschränken.

Der Rest wird einfach in einer CSV bzw. normalen Tabelle ausgegeben. Da ist nicht so schlimm, ob es ein Date oder Text-Wert ist :)

Aber... danke dir für die Hilfe beim SQL-Date-Problem, das ist auch eine sehr gute Hilfe :)
Darf ich kurz fragen, warum du Datetime nutzt? Reicht hier nicht einfach ein "einfaches" date() anstelle von datetime()? Man sieht, ich bin hier sicherlich noch Anfänger... wenn ich sowas blöde frage :-( Sorry... nur für mich fürs Verständnis!

Meine Frage ging aber ja auch noch eher in die Richtung...
Form mit PHP oder HTML generieren - vermutlich ist es einfach via PHP? Dann kann ich mit PHPSELF meinen Code wieder aufrufen und dann direkt auswerten?
 

Mat

Aktives Mitglied
Uff, das ist dann ja nervig für dich, wenn das mal Text, mal Datum, mal Uhrzeit ist. :oops:

Eigentlich würde ich sagen, die DB ist kaputt. Was soll man aus dem Datum "09:28" machen?
Das wird doch sicher automatisch zu 1971-01-01 09:28:00:000" interpretiert oder sowas, wenn man Glück hat.

Da muss was repariert oder eine neue Spalte angelegt werden. Wenn du keine Möglichkeit hast, es umzustellen, könntest du den Code von @JR Cologne anpassen, für eine Abfrage mit gemischten Datentypen:

Also zum Beispiel: SELECT * FROM `xyz` WHERE LENGTH(`xyz`) >5 AND `eingabedatum_kalender` BETWEEN STR_TO_DATE(`irgendein_mindatum_string`, '%d.%m.%Y') AND BETWEEN `irgendein_maxdatum_calendar`;

Das würde alle komischen Uhrzeitenstrings ignorieren (wegen Länge = 5, also zB 12:45) .. die Werte sind dann einfach nicht im Ergebnis drin. Ist aber nicht schön.

Je nachdem, was davon String und was davon Calendar ist, müsstest du es dann entsprechend anpassen.

Edit: Calendar-Datentyp sagt mir jetzt direkt nix, aber ich gehe hier davon aus, dass das ein anderer Name für DATE in einem bestimmten SQL-Dialekt ist. Wenn nicht, dann muss Calendar in der Prüfung noch in DATE umgewandelt werden.

Wichtig ist, dass du, falls du die Daten als Strings in der Datenbank abspeicherst, sie dann auch richtig formatierst (tag.monat.jahr), damit sie mit den anderen Daten vergleichbar sind.

Darf ich kurz fragen, warum du Datetime nutzt? Reicht hier nicht einfach ein "einfaches" date() anstelle von datetime()?

DateTime ist die PHP-Klasse für Daten und Uhrzeiten. Je nachdem, was man braucht, kann man die Uhrzeit, das Datum oder beides darin verwenden. Dadurch, dass es eine Klasse ist, werden DateTime-Objekte erzeugt, die ihre eigenen Hilfsmethoden mitbringen (wie zB format, add, sub, diff und andere Sachen). Ist also für objektorientierten Code. date() hingegen ist eine reine Funktion, die einfach nur einen String zurückgibt, den man für die weitere Bearbeitung dann erst transformieren muss.

Edit2: Achja, zu deiner PHP-Frage
Du sendest das so oder so als Formular an dein PHP-Skript. Also spielt es keine große Rolle, womit du es erzeugt hast. Es kommt in Form von Strings bei dir an, die du dann zB mit $inputDatum = new \DateTime($_POST["mein_datum"]) usw auslesen kannst.

HTML reicht also:
HTML:
<form action="/blubb.php" method="POST">
  <input type="date" name="mein_datum" max="2021-05-15" min="2020-01-01">
  <input type="submit">
</form>
Kannst auch min und max dynamisch aus PHP übergeben.
 
Zuletzt bearbeitet:
Oben Unten