set-feld mit Ausgabe der Vars in "checkbox"

Alles, was PHP betrifft, kann hier besprochen werden.

set-feld mit Ausgabe der Vars in "checkbox"

Postby juergen&lx » 08. August 2004 21:55

Hallo miteinander,

Ich habe ein SET-Feld in Mysql mit 16 Variablen.
Die Ausgabe über PHP in ein " textform " funktioniert auch einwandfrei.

Jetzt möchte ich aber die Ausgabe in eine Tabelle mit 16 "checkbox"-Felder
ausgeben, damit ich sie leichter selektieren kann.
Die Summe der Häkchen geht als Integer in die Mysql-Tabelle zurück.

die
Code: Select all
<select multiple>
-Anweisung möchte ich jedoch nicht benutzen.

Aber:
wie kann ich die Integer-Ausgabe auf die einzelnen Binärwerte aufteilen?

Hat da schon jemand Erfahrungen gemacht?
Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Man muß das nur geschickt anfangen

Postby TConnect » 08. August 2004 23:48

Hallo,

also wenn ich Dich richtig vertanden habe, dann bist Du auf der Suche nach einem Formular mit insgesamt 16 Checkboxen, also den kleinen anhakbaren Vierecken. Richtig? Das ist kein Thema:

<?php
echo "<form bla...>\n";

echo "<input type=\"checkbox\" name=\"mycheckbox[]\" value=\"a\">\n";
echo "<input type=\"checkbox\" name=\"mycheckbox[]\" value=\"b\">\n";
[...]
echo "<input type=\"checkbox\" name=\"mycheckbox[]\" value=\"p\">\n";

echo "</form>\n";


Beim Wegsenden des Forms erscheinen die einzelnen Values der einen Variabel "mycheckbox" als Array. Dabei muß man wissen, dass verschiedene Checkboxen als ein einziges Array betrachtet werden und dass wenn verschiedene Checkboxen unterschiedliche Namen haben, diese dann auch nicht mehr zu einer Gruppe bzw. zu einer Informationseinheit gehören.

Weiterhin muß man wissen, dass nicht angehakte Kästchen auch nicht übertragen werden. Daraus ergibt sich konsequenter Weise, dass das übertragene Array auch unterschiedlich lang sein kann und daraus ergibt sich, dass man "eigentlich" nur anhand der Values erkennen kann, welcher Haken denn nun gesetzt wurde... Die annehmende Datei könnte so aussehen:

<?php

if(is_array($_POST["mycheckbox"])) {

foreach($_POST["mycheckbox"] as $current_nr => $current_val) {

echo $current_nr . " - " . $current_val . "<br>\n";

}

}


?>


Grüße Tim
TConnect
 
Posts: 100
Joined: 31. March 2004 22:26

Postby juergen&lx » 09. August 2004 00:37

Hi TConnect,

danke für die Hilfe, aber ich habe mich wohl etwas undeutlich ausgedrückt.

Die HTML-Maske als solche ist fertig und die unterschiedlichen Häkchen werden addiert und als Integer an das Mysql-Datenfeld übergeben.
Bis hierher ist alles klar.
Das Auslesen eines SET-Feldes
Code: Select all
SELECT set_field+0 FROM db
lässt die eingegebenen Stringdaten außen vor.

Mit $var=$row['set_field'] sollte ich jetzt einen Integerwert (max.65.535) in $var erhalten und dieser müsste IMHO jetzt in den Binärcode umgewandelt werden.
z.B.:
Code: Select all
22(dec) = 00000000.00010110 (bin)

oder eben auf eine andere Art und Weise,
und hier habe ich meine Probleme.

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 09. August 2004 08:33

Code: Select all
22(dec) = 00000000.00010110 (bin)


Du suchst decbin() ?
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby juergen&lx » 09. August 2004 12:40

Hi Wiedmann,

ja danke, habe allerdings auf der de-Seite gesucht und da ist es nicht so gut erklärt

http://de2.php.net/manual/de/function.decbin.php

jetzt müssen die Bit noch irgenwie zerlegt werden und als value='bit#'
den checkboxen bekannt gemacht werden

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 09. August 2004 15:55

Halllo Jürgen,

hab ich das so ungefähr richtig verstanden?:
Code: Select all
<html>
    <head>

        <title>Testformular f&uuml;r SET-Feld</title>

    </head>

    <body>
        <h1>Testformular f&uuml;r SET-Feld</h1>

        <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
            <table border="1">
                <?php
                for ($y = 1; 2 >= $y; $y++) {
                    echo '<tr>'."\n";
                    for ($x = 1; $x <= 8; $x++) {
                        $bit = $x;
                        if (2 == $y) {
                            $bit = $bit + 8;
                        }
                        echo '<td><input type="checkbox" name="bits['.$bit.']" value="value" />Bit '.$bit.'</td>'."\n";
                    }
                    echo '<tr>'."\n";
                }
                ?>

                <tr>
                    <td colspan="4"><input type="submit" /></td>

                    <td colspan="4"><input type="reset" /></td>
                </tr>
            </table>
        </form>

        <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
            <table border="1">
                <tr>
                    <td><input type="text" name="mysql" /> Wert von MySQL</td>
                </tr>

                <tr>
                    <td><input type="submit" /><input type="reset" /></td>
                </tr>
            </table>
        </form>
        <hr />

        <br />
        <table border="1">
            <tr>
                <?php
                $bit = '';
                if (!empty($_POST['bits'])) {
                    $bits = $_POST['bits'];
                    for ($i = 1; 16 >= $i; $i++) {
                        if (array_key_exists($i, $bits)) {
                            $bit = '1'.$bit;
                        } else {
                            $bit = '0'.$bit;
                        }
                    }
                } else {
                    $bit = str_repeat('0', 16);
                }
                echo '<td><input type="text" readonly="readonly" value="'.bindec($bit).'"/> Wert nach MySQL</td>';
                ?>
            </tr>
        </table>

        <br />
        <table border="1">
            <?php
            if (!empty($_POST['mysql'])) {
                $mysql = $_POST['mysql'];
            } else {
                $mysql = '0';
            }
            $mysql = decbin($mysql);
            if (16 > strlen($mysql)) {
                $mysql = str_repeat('0', 16 - strlen($mysql)).$mysql;
            }
            for ($y = 1; 2 >= $y; $y++) {
                echo '<tr>'."\n";
                for ($x = 1; $x <= 8; $x++) {
                    $i = $x;
                    if (2 == $y) {
                        $i = $i + 8;
                    }
                    $bit = substr($mysql, -$i, 1);
                    switch ($bit) {
                        case '0':
                        echo '<td><input type="checkbox" name="bits['.$i.']" value="value" readonly="readonly" />Bit '.$i.'</td>'."\n";
                        break;
                        case '1':
                        echo '<td><input type="checkbox" name="bits['.$i.']" value="value" checked="checked" readonly="readonly" />Bit '.$i.'</td>'."\n";
                        break;
                    }
                }
                echo '<tr>'."\n";
            }
            ?>
        </table>
    </body>
</html>


Es gibt IMHO zwei Wege.
Den wo du bisher wohl gegangen bist, ist, bei jeder Checkbox als Value den Integer vom zugehörigen Bit abzuspeichern und im Script diese dann zusammenzuzählen und in MySQL einzutragen.

Ich bin hier mal den anderen Weg gegangen und werte nur aus, ob eine Checkbox überhaupt gesetzt ist und erhalte so das Bitmuster und rechne das dann mit der Funktion in den Interger zum Eintragen in MySQL um. Beim Auslesen geh ich dann mehr oder weniger genau den umgekehrten Weg.Das Ergebnis ist aber eigentlich das selbe.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby juergen&lx » 09. August 2004 22:34

Hallo Wiedmann,

Das ist genau die Lösung.

Ich habe mal versucht meinen Lösungsansatz zu zeigen:
dies zeigt aber nur den Ansatz zu "checked"
Code: Select all
   ---snip
   $sel="select stat+0 from medien where id='$n'";
      $result=mysql_query($sel) or die(mysql_error()); $q=0;   
              while($row=mysql_fetch_array($result))
             { $f15=$row['stat+0']; $q++; }
      $binstring=strrev(str_pad(decbin($f15),16,"0",STR_PAD_LEFT));
      $bitarray = explode(":",chunk_split($binstring, 1, ":"));
      
       if ($bitarray[0]==1) { $chk0 ="checked"; }
       if ($bitarray[1]==1) { $chk1 ="checked"; }
       if ($bitarray[2]==1) { $chk2 ="checked"; }
       if ($bitarray[3]==1) { $chk3 ="checked"; }
       if ($bitarray[4]==1) { $chk4 ="checked"; }
       if ($bitarray[5]==1) { $chk5 ="checked"; }
 usw.  bis
       if ($bitarray[15]==1) { $chk15 ="checked"; }

  ----snip     

//1 Line of 16
echo"<tr><td><input type='checkbox' name=\"st\" value=\"1\" ".$chk0."> keine Daten</td></tr>";
     
Ich muss gestehen, dass deine Lösung ausgesprochen Elegant ist und super funktioniert :D
Danke für die Hilfe. Ich werde meine Seite jetzt nochmal umbauen.

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux


Return to PHP

Who is online

Users browsing this forum: No registered users and 11 guests