Dynamische Checkbox in DB eintragen

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich Sitze hier bei einem kleinen Problem:

Ich erstelle Checkboxen aus einer Datenbanktabelle und will damit Daten in eine andere Tabelle eintragen.
PHP:
  $query = "SELECT klasse_id, klassenname FROM swtor_klasse";
  $erg = mysql_query($query);

  while($obj = mysql_fetch_object($erg))
    {
      $checkbox = '<label for="'.$obj->klasse_id.'">'.$obj->klassenname.'<input type="checkbox" name="'.$obj->klasse_id.'" id="'.$obj->klasse_id.'" />';
    }

Das ganze wird dann über ein Template ausgegeben.

Wie kann ich das dann in eine DB eintragen?

Ich komm da auf keine Lösung.

Das ganze soll dann in die Speziestabelle eingetragen werden als erlaubte Klassen pro Spezies.

Kann mir da wer nen Tip geben?

Danke im voraus.
 
Zuletzt bearbeitet:
Erstelle doch eine Tabelle mit den Spalten [ checkboxId | checkboxWert ].
Falls die Werte noch einem Bestimmten user zugeordnet werden müssen,
kannst du noch eine spalte wie z.B. "userId" hinzufügen.
Dan hättest du als Primärschlüssel entweder "checkboxId"
oder einen geteilten Primärschlüssel bestehend aus "checkboxId" und "userId".

Der SQL Query könnte dan wie folgt aussehen:
Code:
DELETE FROM `tabellenname` WHERE `checkboxId` = 'aktuelleCheckboxId';
INSERT INTO `tabellenname` (checkboxId,checkboxWert) VALUES ('aktuelleCheckboxId', 'aktuellerCheckboxWert');

bzw.:
Code:
DELETE FROM `tabellenname` WHERE `checkboxId` = 'aktuelleCheckboxId' AND `userID` = 'idDesAktuellenUsers';
INSERT INTO `tabellenname` (checkboxId,userId,checkboxWert) VALUES ('aktuelleCheckboxId', 'idDesAktuellenUsers', 'aktuellerCheckboxWert');

Wenn du dan deine checkboxen in "blahX" benennst wobei X für eine Zahl steht,
kannst du mit einer schleife immer den SQL-Query für jede checkbox wiederholen..

Beispiel(PHP):


PHP:
for($i=0;isset($_POST['blah'.$i]);$i++)
{
    $id = 'blah'.$i;
    $value = ( $_POST['blah'.$i] ? 1 : 0 ); // So filter ich gerne checkboxen ;)
    mysql_query("DELETE FROM `tabellenname` WHERE `checkboxId` = '".$id."'");
    if(!mysql_query("INSERT INTO `tabellenname` (checkboxId,checkboxWert) VALUES ('".$id."', '".$value."')"))
    {
         echo "ERROR: Id(".$id.") mit Wert(".$value.") wurde nicht gespeichert!<br>";
    }
}

Der String vor der Zahl muss leider da sein,
da ein name eines HTML-Elements keine Zahl sein darf.

Die Codes dienen natürlich nur als Beispiel
und müssen entsprechend für deinen gebrauch angepasst werden. ;)


Hoffe der Post hat dir geholfen.

EDIT:
Hatte gerade langeweile und habe dir deshalb mal den PHP Code Fertig erstellt.
PHP:
$query = "SELECT klasse_id, klassenname FROM swtor_klasse";
$erg = mysql_query($query);

while($obj = mysql_fetch_object($erg))
{
    if(isset($_POST[$obj->klasse_id])) // Prüfen ob die Checkbox gesetzt ist (das Formular abgesendet wurde)
    {
        $value = ( $_POST[$obj->klasse_id] ? 1 : 0 ); // Den wert der Checkbox gefiltert (Nur 1 (true) oder 0 (false))
        $id = $obj->klasse_id; // die id zwischenspeichern um ne kürzere variable zu haben
        mysql_query("DELETE FROM `tabellenname` WHERE `checkboxId` = '".$id."'");
        if(!mysql_query("INSERT INTO `tabellenname` (checkboxId,checkboxWert) VALUES ('".$id."', '".$value."')"))
        {
            echo "ERROR: Id(".$id.") mit Wert(".$value.") wurde nicht gespeichert!<br>";
        } 
    }
}
 
Zuletzt bearbeitet:
Wow das ist ausführlich,

Danke.

Ich wollte eigentlich in der Tabelle swtor_spezies das so speichern:

spezies_id,speziesname,erlaubte klassen
1 , twilek , 1,2,3,4

Das wird wohl ned gehen denk ich mal oder?
 
wie ist den das mit den spezies und klassen gemeint?
kann damit rellativ wenig anfangen^^

Müsstest die verbindung zwischen den sachen mal erklären^^

Aber sieht für mich so aus (zumindest ohne erklärung) als ob du 2 tabellen brauchst damit das ordentlich funktioniert.
 
Also das ganze is für meine Gilde in starwars the old republic.

Da kannst du nicht jede Spezies für jede Klasse hernehmen.

Twilek kann z.b. kein Sith-Krieger werden und chiss kein Sith-Inquisitor.

Und um das ganze übers ACP verwaltbar zu machen, habe ich eine Klassenverwaltung erstellt und das will ich jetzt mit der Speziesverwaltung koppeln
 
Spezies Tabelle: [ Id(int)*+AUTO_INCREMENT | name(string/varchar) ]
Spezies Klassen verknüpfung: [ speziesId(int)* | klassId(int)* | allow(tinyint) ]

PHP:
$query = "SELECT klasse_id, klassenname FROM swtor_klasse";
$erg = mysql_query($query);

while($obj = mysql_fetch_object($erg))
{
    if(isset($_POST[$obj->klasse_id])) // Prüfen ob die Checkbox gesetzt ist (das Formular abgesendet wurde)
    {
        $value = ( $_POST[$obj->klasse_id] ? 1 : 0 ); // Den wert der Checkbox gefiltert (Nur 1 (true) oder 0 (false))
        $id = $obj->klasse_id; // die id zwischenspeichern um ne kürzere variable zu haben
		$sId = "... keine ahnung wo ich die SpeziesId her nehme in deinem Script^^";
		
        mysql_query("DELETE FROM `verknuepfungstabelle` WHERE `speziesId` = '".$sId."' AND `klassId` = '".$id."'");
        if(!mysql_query("INSERT INTO `verknuepfungstabelle` (speziesId,klassId,allow) VALUES ('".$sId."', '".$id."', '".$value."')"))
        {
            echo "ERROR: Id(".$id.") mit Wert(".$value.") wurde nicht gespeichert!<br>";
        } 
    }
}

Hoffe mal ich habe keinen fehler gemacht^^
Die SpeziesId ($sId) musst du noch eintragen wo die her kommt^^
ob aus irgend einem Eingabefeld oder... keine ahnung^^
 
Zuletzt bearbeitet:
Also ich hab deinen Code mal versucht anzugleichen, haut aber nich wirklich hin.

Hier mal mein kompletter Code fürs hinzufügen der Rasse

speziesadd.php

PHP:
<?php
require_once('acpcore/check_login.func.php');

$query = "SELECT klasse_id, klassenname FROM swtor_klasse";
$erg = mysql_query($query);

while($obj = mysql_fetch_object($erg))
{
  $checkbox = '<label for="'.$obj->klasse_id.'">'.$obj->klassenname.'<input type="checkbox" name="'.$obj->klasse_id.'" id="'.$obj->klasse_id.'" />';
}


include('tpl/acp_speziesadd.tpl');
?>

acp_speziesadd.tpl
PHP:
<form action="index.php?p=admin" method="post" enctype="multipart/form-data" >
<fieldset class="form">
<legend>Neue Spezies</legend>

<!--<span class="error">Login Fehlerhaft</span><br />-->

<label for="name">Speziesname</label>
<input type="text" name="speziesname" id="speziesname" value="" /><br />
Erlaubte Klassen:<br/>
<?=$checkbox?>
<br/>

<label for="submit">&nbsp;</label>
<input class="button" type="submit" value="Speichern" id="submit" /><br />
<input  type="hidden" name="a" value="insert_spezies" />
</fieldset>
</form>

admin.php

PHP:
if(isset($_POST['a']) AND $_POST['a']=='insert_spezies'){
var_dump($_POST);
}

Ich find einfach keinen funktionierenden Weg, mit dem ich die Checkbox auslesen und in die DB eintragen kann und zwar ohne, das ich jedes mal einen neuen Insertbefehl machen muss. Das sollte in einem Rutsch gehen.
 
Ändert sich die Anzahl der Klassen bzw. ist die Anzahl variabel?
Falls nein kannste des auch in eine Tabelle machen wenn es nicht zu viele sind..
[speziesId|speziesName|klasse1|klasse2|klasse3|klasse4|.....]

und dan einen INSERT Query machen.
Wie das auslesen der Checkboxen geht
siehst du ja zumindest Theoretisch
in meinen vorherigen posts.

Funktion zum Auslesen der Felder:
PHP:
function read_fields()
{
    $query = "SELECT klasse_id, klassenname FROM swtor_klasse";
    $erg = mysql_query($query);
    $Arr = array();
    while($obj = mysql_fetch_object($erg))
    {
        $Arr[$obj->klasse_id] = ( $_POST[$obj->klasse_id] ? 1 : 0 );
    }
	return $Arr;
}

Nun musst du nurnoch die funktion aufrufen zum auslesen
und du bekommst alle checkboxen in einem Array zurück.
Als Key die id der klasse, mit dem entsprechenden Wert (true(1) oder false(0)).
PHP:
$meineCheckboxen = read_fields();

dann musst du nurnoch den/die SQL-Query(s) machen.
 
Momentan gibbet 4 Klassen pro Seite allerdings kann sich dies ja bei MMO's immer ändern.

Deswegen will ich das ganze über ACP machen, um es so einfach wie möglich zu machen, wenn was geändert gehört.

Achja: spezies_id ist AI mit Primary.


//EDIT

Ich habe jetzt nen weiteren Versuch gestartet, funktioniert irgendwie nicht.

PHP:
if(isset($_POST['a']) AND $_POST['a']=='insert_spezies'){
	$name = strip_tags(mysql_real_escape_string($_POST['speziesname']));
	for($i=0;isset($_POST['klasse_'+$i]);$i++){
		$a = ( $_POST['klasse_'+$i] ? 1 : 0 );
		$sql = "INSERT INTO swtor_spezies (speziesname,erlaubteklassen) VALUES ('".$name."', '".$a."')";
		mysql_query($sql);
	}
}

Der Code innerhalb der for-Schleife wird nicht ausgeführt.

//Edit 2

Also ich hab das jetzt mal halbwegs zum laufen gebracht.

PHP:
if(isset($_POST['a']) AND $_POST['a']=='insert_spezies'){
	$sql = ("SELECT MAX(klasse_id) AS maxklasse FROM swtor_klasse");
	$res = mysql_query($sql);
	if($result = mysql_num_rows($res)){
	while($row = mysql_fetch_assoc($res)){
	$maxklasse = $row['maxklasse'];
	}
	}
	$name = strip_tags(mysql_real_escape_string($_POST['speziesname']));
	
	for($i=1;$i < $maxklasse;$i++){
		$a = ( $_POST['klasse_'.$i] ? 1 : 0 );
		mysql_query("INSERT INTO swtor_spezies (speziesname,erlaubteklassen) VALUES ('".$name."', '".$i."')");
	}
}

Jetzt trägt er mir zwar was in die DB ein, allerdings nur 1 Klasse, Unabhängig davon, wieviele ich anhacke.

Wenn ich jetzt z.b. nur die 2 Klasse anklicke, krieg ich nen Index fehler das es die Checkboxen nicht gibt.

Naja,

ich wünsch euch einen guten Rutsch und ein besseres Jahr 2012.
 
Zuletzt bearbeitet:
ersetze mal das
PHP:
$a = ( $_POST['klasse_'.$i] ? 1 : 0 );
durch
PHP:
$a .= ( $_POST['klasse_'.$i] ? 1 : 0 ).";";

EDIT:
PHP:
if(isset($_POST['a']) AND $_POST['a']=='insert_spezies'){
    $sql = ("SELECT MAX(klasse_id) AS maxklasse FROM swtor_klasse");
    $res = mysql_query($sql);
    $a = "";
    if($result = mysql_num_rows($res)){
    	while($row = mysql_fetch_assoc($res)){
    		$maxklasse = $row['maxklasse'];
    	}
    }
    $name = strip_tags(mysql_real_escape_string($_POST['speziesname']));
    
    for($i=1;$i < $maxklasse;$i++){
        $a .= ( $_POST['klasse_'.$i] ? 1 : 0 ).";";  
    }
	mysql_query("INSERT INTO swtor_spezies (speziesname,erlaubteklassen) VALUES ('".$name."', '".$i."')");
}
so sieht es nach deinem Code aus.
Allerdings finde ich die lösungen voher waren schöner,
da bei deinem Code durch das löschen fehler entstehen können.
PHP:
if(isset($_POST['a']) AND $_POST['a']=='insert_spezies'){
    $sql = ("SELECT klasse_id FROM swtor_klasse");
    $res = mysql_query($sql);
    $a = "";
    $name = strip_tags(mysql_real_escape_string($_POST['speziesname']));
    
    while($obj = mysql_fetch_object($res)){
        $a .= ( $_POST['klasse_'.$obj->klasse_id] ? 1 : 0 ).";"; // falls das klasse_ auch in der datenbank steht bitte entfernen^^
    }
	mysql_query("DELETE FROM swtor_spezies WHERE speziesname = '".$name."'");
	mysql_query("INSERT INTO swtor_spezies (speziesname,erlaubteklassen) VALUES ('".$name."', '".$a."')");
}
 
Zuletzt bearbeitet:
Zurück