• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[GELOEST] warum wird meine IF-Abfrage ignoriert?

Status
Für weitere Antworten geschlossen.

hugofant

Neues Mitglied
Hallo,
ich muss euch leider nochmals belästigen: ich bin mit meinem Geocachingchecker schon weiter gekommen, habe aber das Problem, dass ich den Output bei einem Refresh der Seite nicht gelöscht bekomme. Gedacht war es so, dass ich das Buttonfeld im PHPCode abfrage, danach meine Berechnungen anstelle und ausgebe und danach das Buttonfeld wieder zurücksetze. Bei einem Refresh ist dieses nicht gesetzt und die Ausgabe wird gelöscht. Das Problem, trotz Reset des Feldes springt er immer wieder in die IF Abfrage hinein und nicht in den ELSE Zweig - was mache ich falsch?

Code:
<form id="contact-form" action="" method="POST">
    <div class="form-group mb-4">
        <input type="text" name="cacheid" class="form-control" placeholder="Cache-ID" required="" />
    </div>
    <div class="form-group mb-4">
        <input type="number" name="code" class="form-control" placeholder="Code" onkeypress="if (this.value.length > 5) return false;" required="" />
    </div>
    <div class="form-group mb-4">Datum optional (ansonsten Tagesdatum)</div>
    <div class="form-group mb-4">
        <input type="date" name="date" class="form-control" placeholder="Datum optional" />
    </div>
    <div class="text-right">
        <button type="submit" class="btn btn-big btn-primary" name="mein_button" value="mein_button" >Überprüfen</button>
    </div>

    <?php
        include 'checkit.php';
    ?>

</form>




<?php
ob_start();
if(isset($_POST['mein_button']) && $_POST['mein_button'] == "mein_button") {
//if (isset($_POST['mein_button'])) {
//if(!empty($_POST['mein_button'])){
echo("Buttonisset: " . isset($_POST['mein_button']) . "<br>");
echo("Buttonpost: " . $_POST['mein_button'] . "<br>");

$cacheid = $_POST['cacheid'];
$inpcode = $_POST['code'];
//$inpdate = $_POST['date'];

if(!empty($_POST['date'])){
    $inpday = date('d', strtotime($_POST['date']));
    $inpmonth = date('m', strtotime($_POST['date']));
    $inpyear = date('y', strtotime($_POST['date']));
}
else {
    $inpday = date('d', time());
    $inpmonth = date('m', time());
    $inpyear = date('y', time());
}
date_default_timezone_set('UTC');  // optional
//mktime ( $hour, $minute, $second, $month, $day, $year );
echo ($cacheid . " - " . $inpcode . " - " . $inpday . $inpmonth . $inpyear . "<br>");

$t = time();
$code = substr($t, 2, 6);
echo ("aktueller Timestamp: " . "<br>");
echo(date("d-m-Y H:i:s",$t) . "<br>");
echo($t . "<br>");
echo($code . "<br>");


// example: generate epoch for actual date  (all PHP versions)
echo ("aktuelles Datum: " . "<br>");
$actdate = mktime(0, 0, 0, date("m",time()), date("d",time()), date("y",time()));
echo(date("d-m-Y H:i:s",$actdate) . "<br>");
echo($actdate . "<br>");
$code = substr($actdate, 2, 6);
echo($code . "<br>");

// example: generate epoch for defined date Aug -21-2022 (all PHP versions)
echo ("definiertes Datum: " . "<br>");
$defdate = mktime(0, 0, 0, 8, 21, 22);
echo(date("d-m-Y H:i:s",$defdate) . "<br>");
echo($defdate . "<br>");
$code = substr($defdate, 2, 6);
echo($code . "<br>");

// example: generate epoch for defined input date (all PHP versions)
echo ("Input Datum: " . "<br>");
$inpdate = mktime(0, 0, 0, $inpmonth, $inpday, $inpyear);
echo(date("d-m-Y H:i:s",$inpdate) . "<br>");
echo($inpdate . "<br>");
$code = substr($inpdate, 2, 6);
echo($code . "<br>");

echo("Button: " . $_POST['mein_button'] . "<br>");
$_POST['mein_button'] = "cleaned";
echo("Button: " . $_POST['mein_button'] . "<br>");
unset($_POST['mein_button']);
echo("Button: " . $_POST['mein_button'] . "<br>");
}
else{
echo("i'm in else" . "<br>");
ob_end_clean();
}
?>

ich habe schon Einiges herumprobiert, deswegen ist der PHP Code auch etwas überladen :frown:
 
Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Ich würde gerne helfen, verstehe nur nicht, was du da genau machst?
Du redest vom Refresh, wo ist der?
Wie sieht der aus ?
Dann der Code
PHP:
echo("Button: " . $_POST['mein_button'] . "<br>");
$_POST['mein_button'] = "cleaned";
echo("Button: " . $_POST['mein_button'] . "<br>");
unset($_POST['mein_button']);
echo("Button: " . $_POST['mein_button'] . "<br>");

Warum?
Ist logisch, dass da ein Notice kommt.

Refresh sendet in den meisten Fällen die Daten nochmal ab.
Lege doch eine Umleitung auf der gleichen Seite anstatt Refresh
 
Du bist bei Punkt 2!

Ich gehe davon aus, dass du dieses else meinst?
PHP:
else{
echo("i'm in else" . "<br>");
ob_end_clean();
}
Das bedeutet ja, dass hier was nicht stimmt:
PHP:
if(isset($_POST['mein_button']) && $_POST['mein_button'] == "mein_button")
Ich würde mal $_POST mit var_dump vor dem if ausgeben lassen. Aber da du ja schon bei Punkt 8 bist ....
 
@basti1012: der Ansatz war, ich surfe die Seite checker.php, auf der befindet sich das Formular, sobald der Button "mein_button" gedrückt wird, kommt er in die IF Schleife, macht die Berechnung, setzt $_POST['mein_button'] auf einen anderen Wert und wenn ich dann über den Browser ein Refresh mache, kommt er in den "ELSE"-Zweig und soll die Ausgabe wieder löschen....aber "isset($_POST['mein_button'])" bleibt auf "1" und obwohl $_POST['mein_button'] ja auf "cleaned" gesetzt wurde, geht er nicht in den ELSE-Zweig hinein.
Möglicherweise habe ich da auch irgend ein Caching-Problem.....
@m.scatello:
Du bist bei Punkt 2!
Ein Blick auf den Code zeigt, dass ich Variablen schon an unterschiedlichen Stellen ausgebe (bei dir Punkt 5)
PHP Fehler gebe ich sehr wohl aus (bei dir Punkt 3), kommen aber keine. MySql spielt da nicht mit...

ich habe schon Einiges herumprobiert,
damit sollte auch Punkt 6 erfüllt sein...und hätte ich mit Punkt 7 das Problem selbst lösen können, hätte ich nicht fragen müssen.
....und ja, genau um diesen ELSE geht es....und dass ich ein Problem mit der IF Abfrage habe geht doch schon auf dem Titel des Threads hervor.
 
Ein Blick auf den Code zeigt, dass ich Variablen schon an unterschiedlichen Stellen ausgebe
Ja, aber doch nicht an der wichtigen Stelle. Du willst doch wissen, was in $_POST steht, was bringt dir die Ausgabe in dem if-Block, wenn das Script nicht da rein kommt? Und nein, du bist immer noch bei Punkt 2, da du das Error-Reporting nicht hochgedreht hast.
 
"isset($_POST['mein_button'])" bleibt auf "1" und obwohl $_POST['mein_button'] ja auf "cleaned" gesetzt wurde, geht er nicht in den ELSE-Zweig hinein.
Auf cleaned gesetzt und danach direkt gelöscht, also irgendwie gibt es den Wert mein_button dann ja nicht mehr.

Ich bin mir jetzt nicht genau sicher , aber bei einem Refresh der Seite wird der alte Wert, gesetzt(gesendet) den du beim Ausfüllen schon gesendet hast .
Das kannst du aber eigentlich in der Konsole sehen, was wirklich noch mal gesendet wird.

Aber was ist hier mit
Du redest vom Refresh, wo ist der?
Wie sieht der aus ?

Lege doch eine Umleitung auf der gleichen Seite anstatt Refresh
 
zuerst habe ich ihn auf "cleanded" gesetzt, hat nicht funktioniert, dann habe ich noch versucht ihn mit "unset" komplett zu löschen, hat auch nicht geklappt.
Refresh über den Browser, also händisch. Aber die Werte werden dabei nicht zurück gesetzt.
...ich würde gerne verstehen, warum sich das so verhält....denn wenn es den Wert "mein_button" nicht mehr gibt, dann müßte er doch in den ELSE-Zweig gehen, was er aber offenbar nicht tut.....
 
Den wert mein Button gibt es aber noch bei dem Refresh im Browser.
Der sendet das, ab was du vorher gesendet hast.
Wenn du mit dem PHP Script umleitest, dann kannst du den Wert ändern , aber nicht so wie du es vorhast.

Warum Refresh Händisch?
Wer macht den sowas?
Außerdem ist das eigentlich überall so im Netz , wo man Formulare, absendet kann man mit dem Refresh es nochmal absenden.

Man kann sowas verhindern , damit nicht Formulare doppelt gesendet werden , bzw. E-Mails oder sonst was.
Das heißt, glaube ich, CSRF.

Vielleicht hilft dir das ja weiter

Ich würde mit PHP umleiten , oder ein zurück Button einbauen,. ob man das wiederholte senden des Browsers beim Refresh deaktivieren kann weiß ich so jetzt auch nicht , muss ich mal selber Googeln.

Eine Idee habe ich noch, wie es gehen sollte.
Deine ganze Ausgabe packst du in einer Session.
Dann direkt auf der gleichen Seite umleiten mit PHP
Dann Session Inhalt anzeigen.
Session zerstören.

Beim Browser Refresh ist dann alles wie am Anfang. Fertig

Wahrscheinlich wird jetzt wieder gemeckert, weil das nicht so üblich ist , doch das ist die einzigste Möglichkeit dir mir, einfällt um deinen Wunsch zu erfüllen.

EDIT:
Oder nach den ersten senden , bindest du ein Javascript mit ein.
Javascript:
<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>
Das geht auch.

Eigentlich ist das alles unnötig, weil fast jeder User weiß eigentlich das nach dem Senden ein erneuter Refresh die Seite nochmal absendet , bzw. der Browser fragt dann, nach ob er nochmal senden soll
 
@basti1012 : herzlichen Dank für deine Ideen und Hinweise. Sie haben mich zu einer ganz simplen Lösung geführt - am Beginn des Formulardokuments folgendes einfügen:
Code:
<?php
header("Pragma: no-cache");
?>

Wahrscheinlich wird jetzt wieder gemeckert, weil das nicht so üblich ist
Das ist mir egal. Ich finde es durchaus reizvoll die "ausgelatschten" Wege des Üblichen einmal zu verlassen und komplett neue Ansätze zu versuchen. Hauptsache technisch machbar und auch zulässig.

Sollte meine Lösung diese Voraussetzungen nicht erfüllen bin ich für entsprechenden Hinweis natürlich offen.

bzw. direkt im HTML Header:
Code:
    <meta http-equiv="cache-control" content="no-cache" />
 
Zuletzt bearbeitet:
@basti1012 : herzlichen Dank für deine Ideen und Hinweise. Sie haben mich zu einer ganz simplen Lösung geführt - am Beginn des Formulardokuments folgendes einfügen:
Code:
<?php
header("Pragma: no-cache");
?>
Das funktioniert?
Das kann ich gerade gar nicht beurteilen, werde es aber mal selber testen.
Komisch dass ich das nicht googeln konnte.
Hast du nur den Header gesetzt, oder noch irgendwas anderes?

Ich werde es mal selbe testen und wenn es so geht wie du sagst, habe ich auch wieder was gelernt.
 
ja, habe beides ausprobiert, bin dann bei dem "meta" tag geblieben.
Kannst du dir auf meiner "Checkerseite" ansehen.
Ist noch im Werden, aber die Prüfung funkt zumindest schon (der richtige Code wird aktuell noch rechts vom Image angezeigt).
PHP Code dazu sieht so aus:

Code:
<?php
if(!empty($_POST['cacheid'])){

$cacheid = strtoupper($_POST['cacheid']);
$inpcode = $_POST['code'];

date_default_timezone_set('UTC');  // optional

if(!empty($_POST['date'])){
    $inpday = date('d', strtotime($_POST['date']));
    $inpmonth = date('m', strtotime($_POST['date']));
    $inpyear = date('y', strtotime($_POST['date']));
    $inpyearf = date('Y', strtotime($_POST['date']));  //year full for display
    $inpdate = mktime(0, 0, 0, $inpmonth, $inpday, $inpyear);
    $codechk = substr($inpdate, 2, 6);
}
else {
    $inpday = date('d', time());
    $inpmonth = date('m', time());
    $inpyear = date('y', time());
    $inpyearf = date('Y', time());  //year full for display
    $actdate = mktime(0, 0, 0, date("m",time()), date("d",time()), date("y",time()));
    $codechk = substr($actdate, 2, 6);
}

echo("<br>");
echo ("Cache-ID: " . $cacheid . "<br>");
echo ("Code: " . $inpcode . "<br>");
echo ("Datum: " . $inpday . "-" . $inpmonth ."-" . $inpyearf . "<br>");
echo("<br>");

if($inpcode == $codechk) {
echo("<img src='img/right.png' alt='right' class='tm-service-img'>");
}
else {
echo("<img src='img/wrong.png' alt='wrong' class='tm-service-img'>");
}

echo($codechk . "<br>");

}

?>
 
Wenn ich den Header bei mir teste, funktioniert das nicht.
Der Browser fragt mich trotzdem, ob ich nochmal senden will.
Hast du nur den Header gesetzt oder noch irgendwas anderes am Code geändert?

Vielleicht meldet sich ja gleich einer von den PHP Profis , weil ich verstehe es nicht, ganz, warum das bei dir gehen soll und bei mir nicht.

Deine Lösung finde ich auch nicht beim Googeln , das verwirrt mich noch mehr
 
muss mich da jetzt selbst korrigieren - offenbar spielt da noch ein Javascript mit - das habe ich reinkopiert, nicht angepasst und ganz vergessen....war schon spät gestern.
Code:
                        <form id="contact-form" action="" method="POST">
                            <div class="form-group mb-4">
                                <input type="text" name="cacheid" class="form-control" placeholder="Cache-ID" required="" />
                            </div>
                            <div class="form-group mb-4">
                                <input type="number" name="code" class="form-control" placeholder="Code" onkeypress="if (this.value.length > 5) return false;" required="" />
                            </div>
                            <div class="form-group mb-4">Datum optional (ansonsten Tagesdatum)</div>
                            <div class="form-group mb-4">
                                <input type="date" name="date" class="form-control" placeholder="Datum optional" />
                            </div>
                            <div class="text-right">
                                <button type="submit" class="btn btn-big btn-primary" name="mein_button" value="mein_button" >Überprüfen</button>
                            </div>

                            <?php
                                include 'checkit.php';
                            ?>
                            <script>
                                if ( window.history.replaceState ) {
                                    window.history.replaceState( null, null, window.location.href );
                                }
                            </script>
                        </form>

Ergänzung: es ist definitiv das Script - den Mega-tag habe ich jetzt rausgeschmissen und es funkt immer noch. :oops:

Danke dir für das Nachhaken/Überprüfen
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben