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

html checkbox vor Post überprüfen

Status
Für weitere Antworten geschlossen.

P51D

Mitglied
hallo miteinander

das Problem wurde im Internet schon recht breit diskutiert, doch leider konnte ich keine Lösung auf mein Problem abändern.

Die checkboxen haben einen "onclick" event, bei dem man eine JS-Funktion aufrufen kann, die wiederum einen Submit-Button freigibt (hab ich das richtig verstanden?).

Ich möchte bei mir die Mögichkeit anbieten, Bilder via ZIP-File herunterladen zu können. Das funktioniert, nur kann ich jetzt auch ein Zip-File herunterladen, wenn ich gar kein Bild mittels Checkbox ausgewählt habe.
Wie könnte ich dies unterbinden?

Die Bilder und die Checkboxen werden dynamisch erzeugt. Das einfügen der Checkbox erfolgt so:
PHP:
echo "\r\n\t\t\t\t",'<div id="schrift_norm">';        
    echo "\r\n\t\t\t\t\t\t",'<input name="checkbx[]" type="checkbox" value="', $zip_dir, $bilder[$i], '">Bild-', $bilder_anzahl, '</input>';
                                                    // Zip-File Checkbox        
echo "\r\n\t\t\t\t",'</div>';
also für jedes Bild wird in der checkbx-Array ein neuer Platz hinzugefügt.

ganz elegant wäre natürlich, wenn jemand kein Bild ausgewählt hat, der Input-Button nicht dargestellt wird, sondern ein Bild und erst bei einer Auswahl die darstellung toggelt.

Ich hoffe, ihr versteht was ich meine.
MFG
P51D
 
Du musst bei einer Umsetzung mit JavaScript daran denken, dass JavaScript abschaltbar ist, wenn das jemand tut, dann funktioniert Deine Prüfung nicht mehr. Deshalb musst Du auf jeden Fall eine serverseitige Prüfung des Formulars erstellen (z.B. mit PHP, Perl, o.ä.). Dann kannst Du Deine JavaScript-Lösung auch gleich weglassen.
 
die Serverseitige Prüfung ist klar, nur wie mache ich dies sauber?
wenn jemand ein Bild möchte herunterladen, so wird via PopUp "Datei öffnen mit..., speichern unter..." geöffnet.

Wenn er aber nichts angewählt hat, so kann ich zwar unterbinden, dass sich ein ZIP zusammenstellt und dem Betrachter geschickt wird, aber dann wird mir eine neue Seite geladen.

Ich möchte dass es einen Warnhinweis anzeigt, aber die alte Seite bestehen bleibt.

So generiere ich das ZIP:
PHP:
echo "\r\n", '<form method="POST" action="../zipdownload.php">';
echo "\r\n\t\t\t\t\t\t",'<input name="checkbx[]" type="checkbox" value="', $zip_dir, $bilder[$i], '">Bild-', $bilder_anzahl, '</input>';
echo "\r\n\t\t", '<input type="image" src="harmonie/images/zip_button.gif" alt="Ausgewählte Bilder als ZIP downloaden"/>';
echo "\r\n", '</form>';

und dann die zipdownload.php
PHP:
if(count($_POST['checkbx']) != 0){
    // Zip Libary einbinden
    require("library/zip.lib.php");
    
    // neuse Zip Objekt erstellen
    $zipfile = new zipfile();
    
    // Für jede Datei die in Checkbox übermittelt wurde
    for ($i=0;$i < count($_POST['checkbx']);$i++){
        // Dateinamen aus POST ermitteln
        $filename = $_POST['checkbx'][$i];
        $clearfilename = substr($filename, strrpos ($filename, "/") + 1);
        
         // Datei einlesen
         $handle = fopen ($filename, "r");
        $content = fread ($handle, filesize ($filename));
        fclose ($handle);
        
        // Datei in Zipfile speichern
        $zipfile->addFile($content, $clearfilename, filemtime($filename));
    }

    // Header für Download senden
    header("HTTP/1.1 200 OK");
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename="bilder.zip"');
    header("Content-Transfer-Encoding: binary");

    // Zip File senden
    echo $zipfile->file(); 
}
Danke für die Antwort
MFG
P51D
 
dein fehler dürfte hier liegen:
PHP:
if(count($_POST['checkbx']) != 0){
das formular übergibt alle deine checkboxen, egal ob ausgewählt oder nicht, folglich ist dieser wert immer grösser als 0.
bei jedem durchlauf deiner schleife setzt du eine checkbox, der du keinen wert zuordnest. nur weil sie leer ist, ist sie aber nicht NICHT-DA.

du muss auf den inhalt (value) deiner checkboxen prüfen, ob sie gesetzt wurden oder nicht. ausserdem musst du deinen checkboxen einen wert zuordnen.

<input name="checkbx[]" type="checkbox" value=1

nun kannst du prüfen, ob der inhalt der checkbox gesetzt wurde oder nicht.

ps
mit einem simplen print_r($_POST['checkbx']) kannst du dir deine leeren checkboxen ansehen.

pps
komisch kommt mir auch das formular an sich vor.
<input name="checkbx[]" type="checkbox" value="', $zip_dir, $bilder[$i], '">Bild-', $bilder_anzahl, '</input>';

sollte das nicht so heissen
<input name="checkbx[$i]" type="checkbox" value="', $zip_dir, $bilder[$i], '">Bild-', $bilder_anzahl, '</input>';
wenn du keine schleife durchläufst, bräuchtest du auch kein array checkbx befüllen
 
Zuletzt bearbeitet von einem Moderator:
Der Wert der Checkbox ist der Pfad des Bildes.

Wiso startet er mir dann den Download so nicht, sondern öffnet nur eine neue lehre Seite?
Aber sobald eine Chechbox gesetzt wurde, läuft alles normal ab.
 
mann bin ich blöd..

erweitere dein script mal um das:
PHP:
if(count($_POST['checkbx']) > 0){
    // Zip Libary einbinden
    require("library/zip.lib.php");

    // neuse Zip Objekt erstellen
    $zipfile = new zipfile();

    // Für jede Datei die in Checkbox übermittelt wurde
    for ($i=0;$i < count($_POST['checkbx']);$i++){
        // Dateinamen aus POST ermitteln
        $filename = $_POST['checkbx'][$i];
        $clearfilename = substr($filename, strrpos ($filename, "/") + 1);

         // Datei einlesen
         $handle = fopen ($filename, "r");
        $content = fread ($handle, filesize ($filename));
        fclose ($handle);

        // Datei in Zipfile speichern
        $zipfile->addFile($content, $clearfilename, filemtime($filename));
    }

    // Header für Download senden
    header("HTTP/1.1 200 OK");
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename="bilder.zip"');
    header("Content-Transfer-Encoding: binary");

    // Zip File senden
    echo $zipfile->file();
}

else
{
    echo "keine Auswahl getroffen..";
}
habe auf >0 geändert und die else anweisung eingefügt...
 
Zuletzt bearbeitet von einem Moderator:
mann bin ich blöd..
wieso dass den?

deiene Änderungen bewirken fast das selbe wie vorhin:
Es wird eine NEUE weisse Seite geöffnet, auf der neu steht "keine Auswahl getroffen..". Der Rest hat die gleiche Funktion.

Ich möchte aber NICHT dass eine neue Seite geöffnet wird, sondern die alte beibehalten wird, und diese mit einer Warnung ergänzt wird.
 
statt des keine auswahl getroffen setzt du z.b. ein frefresh auf die formularseite

deine formular.php (oder wie sie halt heisst):
PHP:
<?PHP
    echo "\r\n", '<form method="POST" action="zipdownload.php">';
    echo "\r\n\t\t\t\t\t\t",'<input name="checkbx[]" type="checkbox" value="1">Bild-', $bilder_anzahl, '</input>';
    echo "\r\n\t\t", '<input type="image" src="harmonie/images/zip_button.gif" alt="Ausgewählte Bilder als ZIP downloaden"/>';
    echo "\r\n", '</form>';

    if($_GET['error'])
    {
        echo "keine Auswahl getroffen..";
    }

?>
deine zipdownload.php
PHP:
<?php

if(count($_POST['checkbx']) > 0)
{
    // Zip Libary einbinden
    require("library/zip.lib.php");

    // neuse Zip Objekt erstellen
    $zipfile = new zipfile();

    // Für jede Datei die in Checkbox übermittelt wurde
    for ($i=0;$i < count($_POST['checkbx']);$i++){
        // Dateinamen aus POST ermitteln
        $filename = $_POST['checkbx'][$i];
        $clearfilename = substr($filename, strrpos ($filename, "/") + 1);

         // Datei einlesen
         $handle = fopen ($filename, "r");
        $content = fread ($handle, filesize ($filename));
        fclose ($handle);

        // Datei in Zipfile speichern
        $zipfile->addFile($content, $clearfilename, filemtime($filename));
    }

    // Header für Download senden
    header("HTTP/1.1 200 OK");
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename="bilder.zip"');
    header("Content-Transfer-Encoding: binary");

    // Zip File senden
    echo $zipfile->file();
}

else
{
    echo '<meta http-equiv="refresh" content="0;URL=test.php?error=1">';}

?>

und blöd, weil ich mal wieder viel zu schnell gelesen habe....
 
Danke, funktioniert.

Ich hab im gleichen Zug noch eine weitergreifende Frage:
Wenn ich die bildergalerie.php in die inde.php include sieht der Link dann etwa so aus:
index.php?page=bildergalerie
Wie müsste ich jetzt den Error-Report zurückgeben?
index.php?page=bildergalerie;error=1
oder wie?

EDIT:
Ich habs mitlerweile selber zum laufen gebracht:
In einem hidden Input sende ich bei submit noch zusätlich $_SERVER['REQUEST_URI'] für die "Rücksprung-Adresse" bei einem Fehler.
Und in der zipdowload.php hab ich die Rückkehradresse so definiert:
PHP:
echo '<meta http-equiv="refresh" content="0;URL=',$_POST["aktuelle_seite"],'&error=1">';
so funktioniert dann die if(error==true) Abfrage bestens.

Nochmals danke für die Hilfe
MFG
P51D
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben