Archivlink: javarea.de Forum > PHP, MySQL & CGI > checked(Checkbox) in mySQL-Tabelle speichern
Vollständigen Link anzeigen: javarea.de Forum > PHP, MySQL & CGI > checked(Checkbox) in mySQL-Tabelle speichern

Pages: [1]

geschrieben von body18 am 31.01.2006 - 20:47
Hallo erstmal, ich würde gern in eine SQL-Tabelle speichern lassen ob eine Checkbox markiert ist oder nicht. Dazu hab ich 2 Seiten gemacht. In der ersten befindet sich das Formular und in der zweiten das Script.

Aber leider Funktioniert es noch nicht so richtig, ich hab mir überlegt das es in allen Datenfeldern den Wert 1 einträgt, wenn checked den wert on zurück gibt, aber leider trägt es in meine Tabelle immer nur 0 ein : (

Was könnte falsch sein und könnte man das auch anders umsetzen, thx schonmal

PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 

<?
form  method
="post" action="cbox_eintragen.php">
<
table cellpadding="10">
<
tr>

<
td>
    <
input type="checkbox" name="jan" value="januar"Januar<br>
    <
input type="checkbox" name="feb" value="februar"Februar<br>

 </
td>
</
tr>
<
tr><td></td>
<
td><input type="submit" name="speichern" value="speichern"></td>
</
tr>
</
table>
</
form>
?>



die dazugehörige Seite, die das Script enthält:

PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 

<?php
$db 
mysql_connect('localhost','xxx''xxx') or die ("Kann Datenbank nicht connecten");
$csql=mysql_select_db("xxx") or die ("Kann Datenbank nicht oeffnen");
if ( isset(
$_POST['speichern']) )
{



    if (
$jan == "on")
      {
$januar='1' ; }
    else
     { 
$januar='0'; }

    if (
$feb == "on")
     { 
$februar='1' ;}
    else
     { 
$februar='0' ;}

       
$sql "insert into test_checkbox (januar,februar)
        VALUES
        ('" 
$januar "',
        '" 
$februar "')";

     
    
$result mysql_query($sql);
    echo 
mysql_error();
         echo 
"Erfolgreich in die Liste eingetragen!";
}


?>

<br><br><a href="cbox.php">zurück</a>


geschrieben von René am 31.01.2006 - 21:15
Dein "on" stimmt nicht sondern es muss das sein was im <input ... value="...." > steht.

geschrieben von body18 am 31.01.2006 - 22:11
ok, ich hab jetzt on mit dem ersetzt was hinter dem value der CHeckbox steht:

PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 

<?
if ($jan == "januar")
      {
$januar='1' ; }
    else
     { 
$januar='0'; }

    if (
$feb == "februar")
     { 
$februar='1' ;}
    else
     { 
$februar='0' ;}
?>



klappt leider immernoch nicht, es steht wider nur 0 in der Tabelle

geschrieben von Matneu am 01.02.2006 - 08:24
1. würde ich nicht mit $jan sondern mit $_POST['jan'] arbeiten, ist wesentlich sicherer,
2. Checkboxen werden überhaupt nicht gesendet, wenn sie nicht angeklickt sind. Deshalb versuch's mal mit (isset($_POST['jan']) ? '1' : '0') was soviel heisst wie
PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 

<?
if(isset($_POST['jan'])) {
    echo(
'1');
} else {
    echo(
'0');
?>



Alternativ lass' Dir mit print_r($_POST); das Array ausgeben.

So far...
Matthias

geschrieben von body18 am 01.02.2006 - 16:55
vielen Dank Matthias! Ich hab es mit isset($_POST['jan']) gemacht und es geht. Das Problem wäre damit gelöst!

Jetzt werd ich mit noch gedanken machen wie man die ganze Sache wider auslesen kann, also eine Liste und ein Button, wenn man was auswählt und auf den Button klickt, sollen die Checkboxen wider checked sein, so wie es in der SQL-Tabelle steht. Mal sehn obs was wird.

Danke nochmal für eure Hilfe!

geschrieben von Matneu am 01.02.2006 - 18:24
Zitat
 Original geschrieben von body18 am 01.02.2006 - 16:55
Jetzt werd ich mit noch gedanken machen wie man die ganze Sache wider auslesen kann

Direkt in den Quelltext:
PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 

<?php

echo('<input type="checkbox" name="jan"' . (($ausgelesen->jan == 1) ? ' checked="checked"' '') . ' class="bla" />');

?>



Sollte funktionieren.

So far...
Matthias

P.S.: Das Syntax-Highlightning von PHP ist - wie man oben sieht - nicht das beste, der Code sollte aber (zumindest sinngemäss) funktionieren.

geschrieben von zippy am 08.02.2006 - 15:12
1, Soll nur jeweils ein Monat ausgewählt werden? Dann sind Radiobuttond das Objekt der Wahl, scheint mir. Dann aber auch nur eine Tabelle in der DB, und in der steht in jedem Datensatz eine Zahl zwischen 0 und 11 (bei allen Monaten). Brauchst dann nur noch eine switch-case Dingsbums.

2. Sollen Mehrfachklixe (=mehrere Monate) gleichzeitig ausgewählt werden? Dann die Checkboxen, klar.

Formular etwa so:

PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 

<?
<form  method="post" action="cbox_eintragen.php">
<
table cellpadding="10">
<
tr>
<
td>
    <
input type="checkbox" name="m0" value="1" unchecked/> Januar<br/>
    <
input type="checkbox" name="m1" value="1" unchecked/> Februar<br/>
     [...
etc.]
</
td></tr><tr><td></td>
<
td>
<
input type="submit" name="speichern" value="speichern"/>
</
td>
</
tr>
</
table>
</
form>
?>



Das Formular geht natürlich auch als Schleife, wennst die Monatsnamen in ein Array schreibst, je nachdem, wie der html-code erzeugt wird.

und php etwa so, allerdings freihändig geschrieben, also sicher sehr fehlerhaft...


PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 

<?
$checkedmonate 
= array("0""0""0""...", ...);
$sql="insert into test_checkbox (januar,februar,[...etc.]) VALUES (";
for (
$i=0;$i<12;$i++)
{
if(isset(
$_POST["m$i"]))
    {
    if(
$_POST["m$i"]==1){$checkedmonate[$i]=1;}
    
$sql.="'\" . $checkedmonate[$i] . \"',";    
    }
}
$sql.=")\"";
$result mysql_query($sql);
echo 
mysql_error();
echo 
"Erfolgreich in die Liste eingetragen!";
?>



zum Auslesen etwas kürzer:

PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 

<?
$monate 
= array("Januar""Februar""März""...", ...);
$checkedmonate = array("0""1""0""...", ...);//Dieses Array hast Du aus der Tabelle gefüllt ...
for ($i=0;$i<12;$i++)
    {
    echo 
"<input type=\"checkbox\" name=\"m$i\" value=\"1\" ";
    if(
$checkedmonate[$i]==1){echo "checked />$monate[$i]<br/>";}
    else {echo 
"unchecked/>$monate[$i]<br/>";}
    }
?>



Wie gesagt, beim freihändigen Scripten passieren mir immer wieder fürchterliche Fehler, aber so in etwa sollte es funzen, mit beliebig vielen Monaten ohne Mehraufwand.

So, jetzt schau ich mir das ganze mal bunt an. Isat echt schwer, so grau in grau...


Zum Schluss natürlich die Frage, WARUM jedes Monat ein eigenes Tabellenfald bekommt. Es würde doch - für dieses Beispiel . reichen, ein einziges Feld "Monate" Mit einem String aus Nullen und Einsen zu füllen, oder gar zwei Bytes binär, und dann auflösen. Mir scheint, das würde dem Server ne Menge Rechenzeit und SQL ersparen. Das php wär auch recht einfach, dadurch.



Nachtrag:
Also, hab ja selber etliche Bugs gesehen und korrigiert, findest sicher auch noch welche an meinen Vorschlägen, AAAABER: Die $_POST[XXX] direkt in den Schleifen tun mir weh. Wenn da böse Leute böse Formulare schreiben, also ich weiß nicht ..

Kenn mich zuwenig aus mit PHP, um dafür Sicherheit garantieren zu können. Mir schickens jedenfalls dauernd Mailheader in die Formularscripts, oder SQL-Zeugs.

Warum zerreißt Du das ganze nicht in mehrere Funktionen?
Zum Beispiel:

*function getposts() ... zum Einlesen der gesendeten (und geprüften) Werte in ein Array
*function writedb()... zum Eintragen in die Datenbank
*function readdb($felder) ... mit $felder als Array für vielseitige Verwendbarkeit, gibt ein Array mit den erfragten Werten aus
*function writeform()... schreibt das Formular mit den Daten aus readdb($felder)

Das ganze in eine Klasse verpacken, und schon kann alles von überall her (in deiner Seite) auf diese Funktionen zugreifen ....


geschrieben von body18 am 08.02.2006 - 17:35
Danke nochmal, aber das Problem ist ja schon seit dem 31.01.2006 gelöst, ihr könnt das Thema also schließen ;)

Hab das ganze in Delphi auch noch als Programm geschrieben, nach dem gleichen Muster und es kam sehr gut an : D jetzt kann ich über einen Browser und zuhause über mein Programm drauf zugreifen

geschrieben von zippy am 08.02.2006 - 18:33
Delphi, hmmm, ist das nicht ein Orakel mit lauter nackerten, völlig berauschten jungfräulichen Priesterinnen?


Ist mir gar nicht aufgefallen, wie lange der Thread schon steht. Hab das Forum vor zwei Jahren kennen gelernt und viel davon profitiert. Da waren immer mindestens zehn, zwanzig aktuelle Beiträge pro Rubrik.

Schade eigentlich, dass es so still wurde...


P.S.: Die $_POST.... direkt in die Datenbank zu schreiben find ich dennoch ein bisserl gefährlich. Ich selber kenn mich damit ja nicht aus, aber frag mal die Meisterhacker hier im Forum. Was würde zB passieren, wenn jemand ein böses SQL-Kommando reinschreibt, sozusagen Deine Anfrage (=wie gescriptet) beendet, und dann eine neue, eigene Anfrage startet? Kann ja sein, dass dies unmöglich ist, aber sicher bin ich nicht.

Wenn Du einen Wert wie 0 oder 1 übergibst, statt einen Monatsnamen, ist das sehr leicht zu prüfen. Bei den Checkboxen gehts auch mit Texten leicht, weil Du ja vorher weißt, was das Formular unter der jeweiligen ID (Namen) posten kan. Alles andere wird einfach gestanzt. So, wie es oben steht, könnte man aber einfach ein identisches Formular basteln, das ganz schlimme Sachen versendet. Auf diese Weise habens mir schon alles mögliche unterjubeln wollen.

Vielleicht ist ja php mittlerweile sicher gegen solche Umtriebe. Die Vorsicht gewöhn ich mir dennoch nicht ab.

geschrieben von Matneu am 08.02.2006 - 21:40
Zitat
 Original geschrieben von zippy am 08.02.2006 - 18:33
P.S.: Die $_POST.... direkt in die Datenbank zu schreiben find ich dennoch ein bisserl gefährlich. Ich selber kenn mich damit ja nicht aus, aber frag mal die Meisterhacker hier im Forum. Was würde zB passieren, wenn jemand ein böses SQL-Kommando reinschreibt, sozusagen Deine Anfrage (=wie gescriptet) beendet, und dann eine neue, eigene Anfrage startet? Kann ja sein, dass dies unmöglich ist, aber sicher bin ich nicht.

Dann meldet mein SQL-Server, dass ein Fehler statt gefunden hat. Pro mysql_query() darf nur ein SQL-Statement (SELECT, UPDATE, INSERT, DELETE, Bla) stattfinden. Was aber passieren kann ist Unfug mit Quotes (also Anführungszeichen). Dagegen hilft entweder eine Suche nach Magic_quotes oder jede "einzusetzende" Variable vorher mit addslashes() zu behandeln.

PHP-Source:
PHP-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 

<?
$_POST
['username'] = "Fritz', `role` = 'admin"// Wird natürlich im Formular übergeben

$sql "UPDATE `user` SET `username` = '".$_POST['username']."'";
echo(
$sql);
// ergibt
// UPDATE `user` SET `username` = 'Fritz', `role` = 'admin'
// Man gibt sich also Admin-Rechte

$_POST['username'] = addslashes($_POST['username']);
$sql "UPDATE `user` SET `username` = '".$_POST['username']."'";
echo(
$sql);
// ergibt
// UPDATE `user` SET `username` = 'Fritz\', `role` = \'admin'
// Man gibt sich also den Usernamen "Fritz\', `role` = \'admin" (ohne Anführungszeichen)
?>



So far...
Matthias

So far...
Matthias

geschrieben von Gast am 06.12.2008 - 15:21
ich habs genau wie oben beschrieben gemacht, aber er übergibt einfach immer nur eine 0 obwohl die checkbox gecheckt ist, wer kann helfen?

geschrieben von Klaush am 08.12.2008 - 07:15
Zitat
 
ich habs genau wie oben beschrieben gemacht, aber er übergibt einfach immer nur eine 0 obwohl die checkbox gecheckt ist, wer kann helfen?

Ohne deine Programmstruktur zu können, kaum.


Powered by: JBB v.2.0.4 Copyright ©2000-2006, www.javarea.de.