# Checkboxen in Mysql speichern



## swamp1001 (24. März 2009)

Guten Morgen, vieleicht kann mir jemand helfen.
Ich habe ein Formular mit 2 Checkboxen und das soll alles in eine Mysql Datenbank gespeichert werden, ich habe schon alles abgesucht aber nix gefunden was bei mir funktioniert.
Er schreibt mir immer 0 in die Datenbank egal ob die Checkbox markiert ist oder nicht
Hier mal der Code:


```
<!-insert.php->
       <html>
       <body>
       <?PHP
       if ($button==" OK ") {
        include("db.php");
        mysql_query("INSERT INTO
        cds(titel,interpret,kv,backup)VALUES('$titel','$interpret','$kv','$backup')");
        mysql_close();
        ?>
        Die Daten wurden eingetragen<br>
        <a href="insert.php">neuer Eintrag</a><br>
        <a href="fetcharr.php">zur Übersicht</a>
        <?PHP
       } else { ?>
        <form method="post" action="insert.php">
        <input type="text" name="interpret" value="interpret"><br>
        <input type="text" name="titel" value="titel"><br>
<input type="checkbox" name="kv"value="JA" ><br>
<input type="checkbox" name="backup"value="JA" ><br>
        <input type="submit" name="button" value=" OK ">
        </form>
        <?PHP
       } ?>
       </body>
       </html>
```


----------



## Steusi (24. März 2009)

```
mysql_query("INSERT INTO
        cds(titel,interpret,kv,backup)VALUES($_POST['titel'],$_POST['interpret'],$_POST['kv'],$_POST['backup'])");
```
Du sendest die Formulardaten doch per post, warum sind diese nicht bei dir aufgelistet?


----------



## swamp1001 (24. März 2009)

Danke erstmal für die schnelle Antwort.
Es hatte so immer bei mir funktioniert, wenn ich es aber so mache wie du schreibst dann kommt eine Fehlermeldung

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /Applications/xampp/xamppfiles/htdocs/rep/insert.php on line 49


----------



## Steusi (24. März 2009)

Komisch, wenn ich es so schreibe:

```
<html>
       <body>
       <?PHP
       if ($_POST['button']==" OK ") {      
		echo($_POST['interpret']);
		echo($_POST['titel']);
		echo($_POST['kv']);
		echo($_POST['backup']);
        ?>
        Die Daten wurden eingetragen<br>
        <a href="insert.php">neuer Eintrag</a><br>
        <a href="fetcharr.php">zur Übersicht</a>
        <?PHP
       } else { ?>
        <form method="post" action="test.php">
        <input type="text" name="interpret" value="interpret"><br>
        <input type="text" name="titel" value="titel"><br>
<input type="checkbox" name="kv"value="JA" ><br>
<input type="checkbox" name="backup"value="JA" ><br>
        <input type="submit" name="button" value=" OK ">
        </form>
        <?PHP
       } ?>
       </body>
       </html>
```
Gibt er alles korrekt aus



> Fehlermeldung
> 
> Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in E:\php-fehler\test_code.php on line 3
> 
> ...


----------



## swamp1001 (24. März 2009)

Hm, das hilft mir leider nicht weiter es muss in die Datenbank .


----------



## Steusi (24. März 2009)

Wenn du die Variablen so hast kannst du sie auch einfügen, bei mir klappt es auch mit der DB!


----------



## swamp1001 (24. März 2009)

Hm bei mir geht es nicht, kommt wieder die selbe fehlermeldung.
Bist du so nett und schreibst mir bitte den gesamten Code, irgendwo mach ich da einen fehler.


----------



## asipak4you (24. März 2009)

kann ja nicht funktionieren. wenn dein editor ne highlight-funktion hat, sollte man den fehler sofort erkennen können:


```
mysql_query("INSERT INTO
                    cds
             SET
                    titel = '" . $_POST['titel'] . "',
                    interpret = '" . $_POST['titel'] . "',
                    kv = '" . $_POST['kv'] . "',
                    backup = '" . $_POST['backup'] . "'
");
```


----------



## Steusi (24. März 2009)

Na klar, ich hab es so geschrieben. War außer Haus deshalb so spät:


```
<html>
       <body>
       <?PHP
	   
	    mysql_connect("localhost", "root","****");
		mysql_select_db("***")  or die ("Die Datenbank existiert nicht");
	   
	   
$erstellen ="CREATE TABLE IF NOT EXISTS `musik` (
  `ID` int(11) NOT NULL auto_increment,
  `interpret` varchar(200) NOT NULL,
  `titel` varchar(200) NOT NULL,
  `kv` tinyint(1) NOT NULL,
  `backup` tinyint(1) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1";

$erstell = mysql_query($erstellen) or die("Tabelle konnte nicht erstellt werden: ".mysql_error()); 
	   
if ($_POST['button']==" OK ") { 
 
$interpret = $_POST['interpret'];
$titel = $_POST['titel'];
$kv = $_POST['kv'];
$backup = $_POST['backup'];

		 	   
$eintragen = "INSERT INTO musik (interpret, titel, kv, backup) VALUES ('$interpret', '$titel', '$kv', '$backup')";  
$eintrag = mysql_query($eintragen) or die("Eintrag nicht möglich: ".mysql_error()); 	   

        ?>
        Die Daten wurden eingetragen<br>
        <a href="insert.php">neuer Eintrag</a><br>
        <a href="fetcharr.php">zur Übersicht</a>
        <?PHP
       } else { ?>
        <form method="post" action="insert.php">
        <input type="text" name="interpret" value="interpret"><br>
        <input type="text" name="titel" value="titel"><br>
<input type="checkbox" name="kv"value="1" ><br>
<input type="checkbox" name="backup"value="1" ><br>
        <input type="submit" name="button" value=" OK ">
        </form>
        <?PHP
       } ?>
       </body>
       </html>
```

Dann hast du dein Problem mit den Anführungsstrichen nicht mehr ;-) Manchmal ist es schon verwirrend


----------



## swamp1001 (24. März 2009)

Super Danke probiere ich gleich aus


----------



## DeluXe (24. März 2009)

Steusi hat gesagt.:


> Dann hast du dein Problem mit den Anführungsstrichen nicht mehr ;-)


Deine Variante ist aber - wie ich finde - nicht gerade besonders gut lesbar.

Was jedoch alle die hier geannten Queries gemeinsam haben ist der nicht vorhandene Schutz gegen Injections. Wenn jemand zum Beispiel ein Single Quote (Hochkomma) eingibt, kann der Query nicht ausgeführt werden. Mit ein bisschen Gefummel kann jemand so alle Daten löschen.

Ein einfaches mysql_real_escape_string hilft da ungemein, um so etwas vorzubeugen.

```
mysql_query("INSERT INTO cds SET titel = '" . mysql_real_escape_string( $_POST['titel'] ) . "', interpret = '" . mysql_real_escape_string( $_POST['titel'] ) . "', kv = '" . mysql_real_escape_string( $_POST['kv'] ) . "', backup = '" . mysql_real_escape_string( $_POST['backup'] ) . "'");
```
Und gleich noch ein Beispiel wie ich den Query schreiben würde. 



```
mysql_query(sprintf(
  'INSERT INTO cds SET titel = "%s", interpret = "%s", kv = "%s", backup = "%s"',
  mysql_real_escape_string( $_POST['titel'] ) ,
  mysql_real_escape_string( $_POST['interpret'] ),
  mysql_real_escape_string( $_POST['kv'] ),
  mysql_real_escape_string( $_POST['backup'] )
));
```

Dabei ist lediglich zu beachten, das %s einen String erwartet, erwartet man einen Integer so nimmt man %d.


----------



## swamp1001 (24. März 2009)

Du bist ein Held für mich funktioniert super.
Bist du bitte auch so lieb und würdest mir das selbe schreiben wenn ich einen Eintrag ändern will. Bekomme das mit dem Code noch nicht so ganz hin.


----------



## asipak4you (24. März 2009)

learning by doing

http://dev.mysql.com/doc/refman/5.0/en/update.html


----------



## Steusi (24. März 2009)

Das ist natürlich richtig, SQL-Injection wurde nicht beachtet und vieles andere auch nicht, klar kann man es viel schöner machen.
Es ging doch aber nur um das Problem mit der Checkbox. Würde man ihm ein fertiges Script vorlegen, versteht er vielleicht die ein oder andere Methode gar nicht, jeder fängt klein an und es ist doch viel schöner es sich selbst beizubringen.

Aber DeluXe hat natürlich völlig recht. für Sicherheit und guten Code solltest du seine Ideen annehmen!


----------



## DeluXe (24. März 2009)

Fertige Skripte gibt es von mir sowieso nur in Ausnahmefällen. 

Aber ich denke anhand der Beschreibung sollte man es verstehen können, ansonsten einfach mal ausprobieren was passiert wenn Single und Double Quotes einmal mit und einmal ohne mysql_real_escape_string() übergibt.


----------



## swamp1001 (24. März 2009)

Vielen Dank für eure hilfe, das hat mir super geholfen, ich werde das mal mit dem Sicheren Code Probieren.


----------

