luckyluke
Goto Top

Eindeutige Zusweisung mit Checkbox fällt fehl

Hallo liebe PHP'ler,

ich habe ein Problem, dem ich nicht auf die schliche komme.
Und zwar: Eine Auflistung von Parametern wird dynamisch aus der Datenbank ausgelesen. Diese Parameter sind Kategorisiert. Es existiert eine Verwaltungstabelle, die die Verknüpfungen alle enthält. Unter all den Spalten, gibt es die Spalte "cb_status" die 1 (aktiv) und 0 (inaktiv) ist.
Ob diese Spalte nun 1 oder 0 ist entscheidet der Benutzer im Frontend per Checkbox. Setzt er in ein Kästchen ein Hächcken, so wird der Wert 1 in die Tabelle geschrieben, und so weiter...
Realisiert habe ich es ganz einfach mit UPDATE ... SET ... Es geht so weit, jedoch schlägt bei mir die eindeutige Zuordnung fehl. Im Klartext: Klicke ich ein Kästchen an und schicke das Formular ab, dann werden ALLE Zeilen auf "1" gesetzt und nicht das ausgewählte.
Grübele schon seit einiger Zeit dran und komme zu keinem Ziel. Ich hoffe, es findet jemand von Euch einen Anhaltspunkt aus meinem Code:

SKRIPT 1 (Per DropDown wird Datenbank ausgelesen und zeigt Inhalt an)

<?php
error_reporting(E_ALL);
// Verbindungsdaten zur Datenbank und deren Datenbanktabellen \\
	require("../../../db.inc.php");  
// ********************************************************** \\
$res=mysql_db_query("datenbank_edv",   "SELECT edv.prdNr, PAR.parameter, PW.parameterwert, edv.prdZusatz, PW.cb_status, edv.id,   
											   PW.para_id, PW.prd_position, PW.prdkat_id
										FROM prd_parawert PW, edv_produkte Edv, prd_parameter PAR, para_kat KAT
										WHERE PW.prdid = Edv.id
										AND PW.para_id = PAR.para_id
										AND PW.prdkat_id = PAR.prd_kategorie
										AND PW.Prdkat_id = KAT.prdkat_id
										ORDER BY Edv.prdNr, Edv.prdZusatz, PW.prd_position ASC");  

while($row=mysql_fetch_array($res,MYSQL_NUM))
{
    $pr_nrn=$row;
	$pr_nrn_zu=$row[3];
	$pr_para=$row[1];
	$pr_parawert=$row[2];
	$cb_status=$row[4];
	$pr_id=$row[5];
	$pr_para_id=$row[6];
	$pr_position=$row[7];
	$pr_kat=$row[8];

	
	if(isset($_GET['produkt']) && $_GET['produkt']==$row.$row[3])  
	{
		$zeige_produkt=$row;
	}
}


echo '  
<form name="produktwahl" method="get" action="'.$_SERVER['PHP_SELF'].'">  
<select name="produkt" onchange="document.produktwahl.submit()">  
<option value="-1">Bitte wählen</option><option value="-1"></option>';  
$test=0;
	for($z=0;$z<count($pr_nrn);$z++)
    {
        if(isset($_GET['produkt']) && $_GET['produkt']==$pr_nrn[$z].$pr_nrn_zu[$z])  
        {
			if($test!=$pr_nrn[$z].$pr_nrn_zu[$z])
	        {
                echo '<option value="'.$pr_nrn[$z].$pr_nrn_zu[$z].'" selected>'.$pr_nrn[$z].$pr_nrn_zu[$z].'</option>';  
            }
		}
		
		else
        {
			if($test!=$pr_nrn[$z].$pr_nrn_zu[$z])
	        {
                echo '<option value="'.$pr_nrn[$z].$pr_nrn_zu[$z].'">'.$pr_nrn[$z].$pr_nrn_zu[$z].'</option>';  
	        }
		}
		$test=$pr_nrn[$z].$pr_nrn_zu[$z];
    }
echo '</select>';  

if(isset($zeige_produkt))
{
	echo'  
	<table width="650" border="1" cellspacing="0" cellpadding="3">  
	<tr><td colspan="3" class="Stil4">Option '; echo $zeige_produkt;  
	echo '</tr></td>';  

	for($z=0;$z<count($pr_nrn);$z++)
	{
		if($zeige_produkt.$zeige_produkt[3]==$pr_nrn[$z].$pr_nrn_zu[$z])
		{
			if($pr_para[$z]!="" && $pr_parawert[$z]=="")  
			{
			}
			else
			{
				if($cb_status[$z]=="1")  
				{
					echo '<tr><td><input type="checkbox" name="prdpara['.$pr_para[$z].']" value="'.$pr_position[$z].'" checked></tr></td>';  
				}
				else
				{
					echo '<tr><td><input type="checkbox" name="prdpara['.$pr_para[$z].']" value="'.$pr_position[$z].'"></tr></td>';  
				}
				echo'  
				<td width="250" class="Stil3">'.$pr_para[$z].'</td>  
				<td width="400" class="Stil4">'.$pr_parawert[$z].'</td>  
				</tr>';  
			}			
		}
	}


		for($z=0;$z<count($pr_nrn);$z++)
		{
			if($zeige_produkt.$zeige_produkt[3]==$pr_nrn[$z].$pr_nrn_zu[$z])
			{
					echo '  
					<input type="hidden" name="pr_id" value="'.$pr_id[$z].'">  
					<input type="hidden" name="pr_para_id" value="'.$pr_para_id[$z].'">  
					<input type="hidden" name="pr_kat" value="'.$pr_kat[$z].'">';  
			}
		}
}
?>

SKRIPT 2 (Führt UPDATE-Befehl aus)

<?php 
error_reporting(E_ALL);

// Verbindungsdaten zur Datenbank und deren Datenbanktabellen \\
	require("../../../db.inc.php");  
// ********************************************************** \\

$prdid = $_POST['pr_id'];  
$prdparaid = $_POST['pr_para_id'];  
$prdkat = $_POST['pr_kat'];  
$cb_status = $_POST['prdpara'];  
$position = $_POST['pr_pos'];  

var_dump($cb_status);
if(isset($_POST['prdpara']))  
{
	for($z=0;$z<count($cb_status);$z++)
	{
		$query_para = "UPDATE prd_parawert   
						
						SET prd_parawert.cb_status = '1'  
	
							WHERE prd_parawert.prdid = '".$prdid."'  
								
									AND prd_parawert.para_id = '".$prdparaid[$z]."'  
									
										AND prd_parawert.prdkat_id = '".$prdkat[$z]."'  
										
											AND prd_parawert.prd_position = '".$position[$z]."'";  
	
		$result=mysql_query($query_para); 
	}
}

echo mysql_error();
mysql_close($link);
?>

Über einen Denkanstoß wäre ich euch sehr verbunden.

Gruß, Lukas.

Content-ID: 82376

Url: https://administrator.de/contentid/82376

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

sleipnir
sleipnir 05.03.2008 um 13:50:46 Uhr
Goto Top
Hi,

vielleicht hilft es dir bei deiner Fehlersuche, wenn du dir mal das "$_POST Array" nach der Übergabe mit Hilfe von var_dump($_POST) ausgeben lässt.

Dann kannst du zumindest einmal überprüfen, ob alle checkbox felder vorhanden sind.

Gruß
Sleipnir
LuckyLuke
LuckyLuke 05.03.2008 um 13:57:26 Uhr
Goto Top
Habe var_dump bereits angewandt und die markierten Checkboxen werden ausgelesen. Die Zuordnung stimmt auch zu den Parametern und Parameterwerten und trotzdem wird falsch ausgeführt...
sleipnir
sleipnir 05.03.2008 um 14:56:01 Uhr
Goto Top
Hi,

lass dir doch deine SQL Abfragen mal ausgeben;)
Betreffend dieser Abfrage(n) wäre es hilfreich zu wissen, ob nachfolgende Stelle von dir so gewünscht ist:

WHERE prd_parawert.prdid = '".$prdid."'

Besonders ob du da wirklich immer den gleichen Wert aus dem Array haben willst...

Gruß
Sleipnir
LuckyLuke
LuckyLuke 05.03.2008 um 15:13:01 Uhr
Goto Top
Also die Zuordnung zum Produkt stimmt in diesem Fall. Denn $prdid ist in meinem Fall das Produkt ASUS mit der ID=2. Und diese ID stimmt in beiden Tabellen überein.
In diesem Fall setzt er immer die nächstkommende Zeile 1, die auf Null steht.
Wenn ich $prdid[$z] schreibe, dann füngt er jeweils immer sechs Zeilen auf 1, was sich mir in keinster Weise erschließt...
Guenni
Guenni 07.03.2008 um 06:44:38 Uhr
Goto Top
@LuckyLuke
Hi,
warum machst du dir die Mühe, alles in Arrays zu überführen?
Besonders bei den Checkboxen, wo du doch sowieso nur einen
Artikel zeigen willst, der durch die Selectbox ausgesucht wird.
Die ganze Zählerei mit den For-Schleifen ist doch dann unnötig.
Und was passiert eigentlich, wenn eine Checkbox abgewählt wurde?
Dann ist der Parameter in deinem Update nicht mehr auswertbar, weil
eine abgewählte Checkbox nicht gesendet wird.
Ich hab' hier 'ne Sparversion mit zwei Tabellen, in der einen id und produkt,
in der zweiten prid und cb_status.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<head>
<title>Untitled</title>
</head>
<body>
<?
include("net-comm/inc/session.inc.php");  
//Hier wird das Update ausgeführt
if(isset($_POST[cmd])){
 if(isset($_POST['kat'])){  
  $query="select * from t_check where prid=".$_POST['id'];  
  $result=mysql_query($query)or die(mysql_error());
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$wert=$row[cb_status] ? 1 : 0;
	if($wert){
	 echo "Keine Änderung";  
	}else{	
	 			$query="update t_check set cb_status=1 where prid=".$_POST['id'];  
	 			$result=mysql_query($query)or die(mysql_error());
				}
 }
 if(!isset($_POST['kat'])){  
  $query="select * from t_check where prid=".$_POST['id'];  
  $result=mysql_query($query)or die(mysql_error());
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$wert=$row[cb_status] ? 1 : 0;
	if(!$wert){
	 echo "Keine Änderung";  
	}else{
	 			$query="update t_check set cb_status=0 where prid=".$_POST['id'];  
	 			$result=mysql_query($query)or die(mysql_error());
				}
 }
 unset($_POST['selwahl']);  
 echo "<br>";  
}
//Selectbox füllen
$query="select * from t_check,t_produkt";  
$query.=" where t_check.prid=t_produkt.id";  
$result=mysql_query($query) or die(mysql_error());
echo "<form action=\"test-check2.php\" method=\"post\" name=\"auswahl\">";  
echo "<select name=\"selwahl\" onchange=document.auswahl.submit()>";  
echo "<option selected> -- Bitte Produkt wählen -- </option>";  
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
 echo "<option value=$row[id]>$row[produkt]</option>";  
}
echo "</select>";  

if(isset($_POST['selwahl'])){  
 $query="select * from t_check,t_produkt";  
 $query.=" where t_check.prid=t_produkt.id";  
 $query.=" and t_produkt.id=".$_POST['selwahl'];  
 $result=mysql_query($query) or die(mysql_error());
 echo "<table border=\"1\">";  
 while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
  echo "<tr>";  
  if($row[cb_status]){
   echo "<td> Datensatz-ID: $row[id] </td>";  
	 echo "<td> Produkt: $row[produkt] </td>";  
   echo "<td><input type=\"checkbox\" checked name=\"kat\"><input type=\"hidden\" value=$row[id] name=\"id\"></td>";  
  }else{
 			 echo "<td> Datensatz-ID: $row[id] </td>";  
			 echo "<td> Produkt: $row[produkt] </td>";  
 			 echo "<td><input type=\"checkbox\" name=\"kat\"><input type=\"hidden\" value=$row[id] name=\"id\"></td>";  
 			 }
  echo "</tr>";  
 }
 echo "</table>";  
}
echo "<br><br><input type=\"submit\" name=\"cmd\" value=\"Update\">";  
echo "</form>";  
?>
</body>
</html>
Hoffe, das hilft dir weiter.
Gruß
Günni
LuckyLuke
LuckyLuke 07.03.2008 um 10:18:25 Uhr
Goto Top
Guten Morgen Günni,

danke für deine Hilfe. Habe deinen Lösungsvorschlag auf meinen angepasst, doch leider funktioniert die Zuordnung auch nicht. Beim markieren einer Checkbox werden ALLE für das Produkt aktviert. Desweiteren lassen sich einzelne Checkboxen nicht deaktivieren.
Ich vermute es liegt an meiner mehrfachen Datenbanktabellenverknüpfung. Schließlich ist jedes Produkt Kategorisiert.
Habe eine zusätzliche Spalte "prd_position" angelegt und die ist von 1-121 durchgezählt für jedes Produkt, somit ist eine eindeutige Zuordnung möglich.
Habe es so mal probiert:
<?
	if(isset($_POST['kat']))  
	{
		$query="SELECT * FROM edv_produkte Edv, prd_parameter PAR, para_kat KAT, prd_parawert PW  
				WHERE PW.prdid = Edv.id 
				AND PW.para_id = PAR.para_id
				AND PW.prdkat_id = PAR.prd_kategorie
				AND PW.Prdkat_id = KAT.prdkat_id
				AND PW.prdid = '".$_POST['id']."'  
				AND PW.prd_position = '".$_POST['pos']."'";  
		$result=mysql_query($query)or die(mysql_error());
		$row=mysql_fetch_array($result,MYSQL_ASSOC);
		$wert=$row['cb_status'] ? 1 : 0;  
		if($wert)
		{
			echo "Keine Änderung";  
		}
			else
			{
				$query="UPDATE prd_parawert SET cb_status = 1    
						WHERE prdid = '".$_POST['id']."'  
						AND   prd_position = '".$_POST['pos']."'";  
				$result=mysql_query($query)or die(mysql_error());
			}
	}

	if(!isset($_POST['kat']))  
	{
		$query="SELECT * FROM edv_produkte Edv, prd_parameter PAR, para_kat KAT, prd_parawert PW  
				WHERE PW.prdid = Edv.id 
				AND PW.para_id = PAR.para_id
				AND PW.prdkat_id = PAR.prd_kategorie
				AND PW.Prdkat_id = KAT.prdkat_id
				AND PW.prdid = '".$_POST['id']."'  
				AND PW.prd_position = '".$_POST['pos']."'";  
		$result=mysql_query($query)or die(mysql_error());
		$row=mysql_fetch_array($result,MYSQL_ASSOC);
		$wert=$row['cb_status'] ? 1 : 0;  
		if(!$wert)
		{
		echo "Keine Änderung";  
		}
			else
			{
				$query="UPDATE prd_parawert SET cb_status = 1    
						WHERE prdid = '".$_POST['id']."'  
						AND   prd_position = '".$_POST['pos']."'";  
				$result=mysql_query($query)or die(mysql_error());
			}
	}
	unset($_POST['selwahl']);  
	echo "<br>";  
}
?>
Ich erhalte jedoch die Fehlermeldung
Notice: Undefined index: pos in ... Line ... (für erstes query)
und
Notice: Undefined index: pos in ... Line ... (für zweites query)

Was meinst du von der Idee her müsste es doch stimmen?

Gruß, Lucky.
Guenni
Guenni 08.03.2008 um 12:45:42 Uhr
Goto Top
@LuckyLuke
Hi,
also die Verknüpfung der Tabellen beim Update kannst du dir
sparen, du mußt ja nur die Tabelle ändern, in der die Spalte
cb_status gespeichert ist.
Zum Problem:
Ich hab' mir jetzt noch zwei Tabellen zusätzlich angelegt, heißt,
jetzt sind's derer vier:
Eine Tabelle enthält Hersteller, eine enthält Produktkategorien,
die dritte Produkte zu den Kategorien und die letzte enthält den
cb_status(ist zwar Quatsch, aber egal, es geht sich ja nur drum,
zu sehen, ob's geht).
Wenn ich mir jetzt nur ein einziges Produkt anzeigen lasse, so kann
ich die Checkbox an- und abwählen, und wenn ich in der Datenbank
nachsehe, so wird immer der richtige Datensatz aktualisiert,
so war es doch gedacht, oder läßt du dir mehrere Zeilen anzeigen,
in denen man jeweils den Status ändern kann(soll)?
Gruß
Günni
LuckyLuke
LuckyLuke 10.03.2008 um 00:21:58 Uhr
Goto Top
Guten Abend Günni,

ja genau, das ist eigentlich so gedacht.
Aus der Datenbank werden 120 Einträge in eine Tabelle geschrieben.
Jede Zeile enthält eine Checkbox. Wird die aktiviert, gilt nur für diese Zeile eine "1" unter cb_status.
Im Moment, auch bei deiner Lösung, markiert er nach Auswahl einer Box alle, was nicht sein darf. Deshalb kam meine Idee mit der Zusatzspalte "prd_position" damit die "1" richtig gesetzt wird.
Ich hoffe du kannst meiner Idee folgen.

Gruß, Lucky.
Guenni
Guenni 10.03.2008 um 19:47:15 Uhr
Goto Top
@LuckyLuke

Hi,

da du ja mehrere Datensätze ausgeben willst, hab' ich das
Script wieder(mal) umgeändert.

Erstmal zu den Tabellen von mir:

Tabelle t_produkt enthält:
id(eindeutig)
produkt
Tabelle t_kat1 enthält:
id(eindeutig)
kat1(eine Kategorie der Produkte)
Tabelle t_kat2 enthält:
id(eindeutig)
katid(enthält die id aus t_kat1)
proid(enthält die id aus t_produkt)
Tabelle t_check:
kat2id(enthält die id aus t_kat2)
cb_status(der Status)
Da du ja in einem deiner Kommentare "Asus" erwähnt hast, hab'
ich jetzt mal den Faden aufgenommen:
In Tabelle t_produkte sind gespeichert "Asus, ATI, Terratec, Gforce";
In Tabelle t_kat1 sind gespeichert "Grafikkarte, Mainboard, Videokarte" etc.
In Tabelle t_kat2 sind gespeichert irgendwelche Phanatsieprodukte zu t_kat1.
In Tabelle t_check ist der Status der Produkte in t_kat2 gespeichert.
Die Verknüpfungen:
Fangen wir mit Tabelle t_kat2 an.
Diese Tabelle enthält als Datensatz z.B GT8800S, ein Produkt
der Kategorie Grafikkarte, vom Hersteller Gforce. Das ergibt im Query:
$query.=" t_kat2.katid=t_kat1.id and";
$query.=" t_kat2.proid=t_produkt.id";
Da ich mit der Checkbox ja einen best. Datensatz markieren will,
kann dies nur ein Datensatz aus kat2 sein. Daraus ergibt sich:
query.=" t_kat2.id=t_check.kat2id";
Um nun das Ganze einem best. Produkt zu zuordnen, brauche ich
noch eine letzte Verknüpfung:
$query.=" t_kat2.proid=t_produkt.id";
Daraus ergibt sich folg. Abfrage:
$query="select produkt,kat1,kat2,kat2id,cb_status from";
$query.=" t_produkt,t_kat1,t_kat2,t_check where";
$query.=" t_kat2.id=t_check.kat2id and";
$query.=" t_kat2.katid=t_kat1.id and";
$query.=" t_kat2.proid=t_produkt.id";
$query.=" order by 1,2,3";
… wobei ich hier noch zusätzlich die Spalte kat2id abrufe, die ich
den Checkboxen als Wert übergebe.
Das Ganze arbeitet erstmal ohne Select-Box.
Das Script dazu:

<?
include("net-comm/inc/session.inc.php");  
//Hier wird das Update ausgeführt
if(isset($_POST[cmd])){
 if(isset($_POST[kat])){
  /*
    Da nicht angewählte Checkboxen nicht gesendet werden,
    wird die komplette Spalte cb_status erstmal auf Null
    gesetzt. Falls kat gesetzt ist, werden in der folg.
    foreach-Schleife die entsprechenden Reihen wieder auf
    eins gesetzt.
 */
  mysql_query("update t_check set cb_status=0");  
  foreach($_POST[kat] as $id){
   $query="update t_check set cb_status=1 where kat2id=$id";  
	 mysql_query($query)or die(mysql_error());
  }
	
 }else{
 			 /*
			 Wenn kat nicht gesendet wurde, alles auf Null setzen
			 */
 			 mysql_query("update t_check set cb_status=0");  
 			 }
 // Seite nach dem Update aktualisieren
	header("location:test-check4.php");  
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<head>
<title>Spalten mit Checkboxen bearbeiten</title>
</head>
<body>
<?
$query="select produkt,kat1,kat2,kat2id,cb_status from";  
$query.=" t_produkt,t_kat1,t_kat2,t_check where";  
$query.=" t_kat2.id=t_check.kat2id and";  
$query.=" t_kat1.id=t_kat2.katid and";  
$query.=" t_kat2.proid=t_produkt.id";  
$query.=" order by 1,2,3";  
$result=mysql_query($query) or die(mysql_error());
$row=mysql_fetch_array($result,MYSQL_ASSOC);
echo "<form action=\"test-check4.php\" method=\"post\">";  
echo "<table border=\"1\">";  
/*
Tabellenköpfe ausgeben
*/
while($field=key($row)){
 if($field=="kat2id"){  
 }else{
 			 echo "<th>$field</th>";  
			 }
 next($row);
}
/*
Da durch obige Anweisung "$row=..." bereits der erste 
Datensatz abgerufen wurde, muß das Query nochmals
ausgeführt werden.
*/
$result=mysql_query($query) or die(mysql_error());
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
 echo "<tr>";  
  echo "<td> $row[produkt] </td>";  
	echo "<td> $row[kat1] </td>";  
	echo "<td> $row[kat2] </td>";  
  if($row[cb_status]){
	 echo "<td><input type=\"checkbox\" name=kat checked value=$row[kat2id]></td>";  
  }else{
 			 echo "<td><input type=\"checkbox\" name=kat value=$row[kat2id]></td>";  
 			 }
}
echo "</table>";  
echo "<br>";  
echo "<input type=\"submit\" name=\"cmd\" value=\"Update\">";  
echo "</form>";  
?>
</body>
</html>

Gruß
Günni
LuckyLuke
LuckyLuke 12.03.2008 um 10:02:59 Uhr
Goto Top
Guten Morgen Günni,

wir kommen der Sache langsam näher, doch die Auswahlliste muss weiter bestehen bleiben.
Ich habe nämlich 300 Produkte in meiner Datenbank und diese einzeln ausgeben zu lassen ist der reinste Horror.
Ich will dir nochmal meine Tabellenstruktur näher bringen, denn ich habe es einen tick anders und evtl. sogar optimaler.

1. Tabelle: produkte (hier sind sämtliche 300 Produkte in der Tabelle vorhanden)
id | prdNr |prdNr_Zusatz

2. Tabelle: prd_parameter (die Parameterbezeichnung, die Kategorisiert ist. AGP, PCI, ....)
prd_kategorie | para_id | parameter

3. Tabelle: para_kat (Kategorien der Parameter)
prdkat_id | parakategorie

4. Tabelle: prd_parawert (Haupt Verwaltungstabelle)
prdid | cb_status | prd_position | prdkat_id | para_id | parameterwert


Wie du siehst etwas dicker aufgebläht das Ganze. Die Verwaltungstabelle hat mittlerweile über 27k Einträge. In deinem Beispiel hast du eine extra Tabelle, t_check erstellt, um den Status zu markieren. Ist das in meinem Fall nicht überflüssig, da ja sowieso die prdid, prdkat_id, ... sogesehn zugeordnet werden?
Ich hoffe du durchschaust meine DB_Struktur, die eigentlich relativ einfach ist. Weitere Tabellen möchte ich nur ungern hinzufügen, da das jetzt schon ein großer Haufen wird.

Gruß, Luke.
Guenni
Guenni 15.03.2008 um 09:19:33 Uhr
Goto Top
@LuckyLuke

Hi,

t_check ist keine extra Tabelle, um nur cb_status zu speichern, sie kann eine beliebige Tabelle sein,
die halt unter anderem diese Spalte enthält(siehe deine Beschreibung der Tabellen).

Es ging mir nur darum, die Spalte cb_status dem entsprechenden Produkt zuzuweisen, egal,
wieviel Spalten die Tabelle sonst noch enthält.

Die Tabelle muß nur eine Spalte mit einer eindeutigen id haben, damit
man die Zeile, die geändert wird, auch identifizieren kann.

Zur Auswahl:

Problem bei der Auswahl ist, dass abgewählte Checkboxen nicht gesendet
werden, also muß man sich merken, welche Zeilen ausgwählt wurden.

Die Spalte kat2id in der Tabelle t_check enthält pro Zeile eine eindeutige
id, die im Formular den Checkboxen zugewiesen wird:
<?
if($row[cb_status]){
 echo "<td><input type=\"checkbox\" name=kat checked value=$row[kat2id]></td>";  
 }else{
  echo "<td><input type=\"checkbox\" name=kat value=$row[kat2id]></td>";  
 }
?>

Und je nach dem, ob cb_status 1 oder 0 ist, wird die Box als checked dargestellt
oder nicht, das hast du ja auch in deinem Code.

Gleichzeitig speichere ich den Wert der Zeile kat2id in einem Array:
<?
$sets=$row[kat2id];
?>

Den Inhalt des Arrays speichere ich in einem versteckten Textfeld:
<?
echo "<input type=\"hidden\" name=\"sets\" value=".implode("+",$sets).">";  
?<

Wenn mir nach Auswahl durch die Selectbox 5 Datensätze angezeigt werden,
dann enthält das Textfeld z.B.: 3+7+1+2+4, das sind die Werte der Spalte
kat2id, die auch die Checkboxen haben(siehe Quelltext der PHP-Seite im Browser).

Wenn jetzt als Beispiel 4 dieser Checkboxen angewählt sind, ist der entsprechende
Wert cb_status in der Tabelle ja 1. Wähle ich nun 1 oder mehr Boxen ab, werden
sie nicht mehr gesendet, dafür aber das versteckte Textfeld, mit den 5 ausgewählten
Datensätzen und das Array kat mit den verbliebenden angewählten Checkboxen.
Klicke ich nun auf Update, so kann ich cb_status in der Tabelle entsprechend ändern.

Als erstes mache ich aus dem gesendeten Textfeld wieder ein Array, und setzte
cb_status in den entsprechenden Zeilen auf 0:
<?
if(isset($_POST[cmd])){
 $sets=explode("+",$_POST[sets]);  
 foreach($sets as $id){
  $query="update t_check set cb_status=0 where kat2id=$id";  
  mysql_query($query)or die(mysql_error());
 }
. . . . . 
?>

Falls das Checkboxen-Array kat gesendet wurde, sind 1 oder mehrere Checkboxen
angewählt, die setze ich wieder auf 1:
<?
if(isset($_POST[kat])){
  foreach($_POST[kat] as $id){
   $query="update t_check set cb_status=1 where kat2id=$id";  
	 mysql_query($query)or die(mysql_error());
  }
 }
?>

Und wenn nicht, dann bleiben sie halt auf 0.

Ich habe in der Tabelle t_check noch eine Spalte angefügt, um
zu verdeutlichen, dass es keine Tabelle ist, die nur cb_status enthält.

Gruß
Günni

Script "test-check4.php":
<?
include("net-comm/inc/session.inc.php");  
//Hier wird das Update ausgeführt
if(isset($_POST[cmd])){
 $sets=explode("+",$_POST[sets]);  
 foreach($sets as $id){
	$query="update t_check set cb_status=0 where kat2id=$id";  
	mysql_query($query)or die(mysql_error());
 }
 if(isset($_POST[kat])){
  foreach($_POST[kat] as $id){
   $query="update t_check set cb_status=1 where kat2id=$id";  
	 mysql_query($query)or die(mysql_error());
  }
 }
  /*
	  Seite nach dem Update aktualisieren
	*/
	header("location:test-check4.php");  
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<head>
<title>Spalten mit Checkboxen bearbeiten</title>
</head>
<body>
<?
if(isset($_POST[selwahl])){
$id=$_POST[selwahl];
$query="select produkt,kat1,kat2,kat2id,cb_status,bus from";  
$query.=" t_produkt,t_kat1,t_kat2,t_check where";  
$query.=" t_kat2.id=t_check.kat2id and";  
$query.=" t_kat1.id=t_kat2.katid and";  
$query.=" t_kat2.proid=t_produkt.id and t_produkt.id=$id";  
$query.=" order by 1,2,3";  
$result=mysql_query($query) or die(mysql_error());
$row=mysql_fetch_array($result,MYSQL_ASSOC);
echo "<form action=\"test-check4.php\" method=\"post\">";  
echo "<table border=\"1\">";  
/*
Tabellenköpfe ausgeben
*/
while($field=key($row)){
 if($field=="kat2id"){  
 }else{
 			 echo "<th>$field</th>";  
			 }
 next($row);
}
/*
Da durch obige Anweisung "$row=..." bereits der erste 
Datensatz abgerufen wurde, muß das Query nochmals
ausgeführt werden.
*/
$result=mysql_query($query) or die(mysql_error());
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
 $sets=$row[kat2id];
 echo "<tr>";  
  echo "<td> $row[produkt] </td>";  
	echo "<td> $row[kat1] </td>";  
	echo "<td> $row[kat2] </td>";  
  if($row[cb_status]){
	 echo "<td><input type=\"checkbox\" name=kat checked value=$row[kat2id]></td>";  
  }else{
 			 echo "<td><input type=\"checkbox\" name=kat value=$row[kat2id]></td>";  
 			 }
	echo "<td> $row[bus] </td>";  
	echo "</tr>";  
}
echo "</table>";  
echo "<br>";  
echo "<input type=\"hidden\" name=\"sets\" value=".implode("+",$sets).">";  
echo "<input type=\"submit\" name=\"cmd\" value=\"Update\">";  
echo "<input type=\"submit\" name=\"cmd_reset\" value=\"Auswahl löschen\">";  
echo "</form>";  
}else{
			$query="select id,produkt from t_produkt order by produkt";  
			$result=mysql_query($query) or die(mysql_error());
			echo "<form action=\"test-check4.php\" method=\"post\" name=\"frmwahl\">";  
			echo "<select name=\"selwahl\" onchange=\"document.frmwahl.submit()\">";  
			echo "<option> - Produkt wählen - </option>";  
			while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
			 echo "<option value=$row[id]>$row[produkt]</option>";  
			}
			echo "</select>";  
			echo "</form>";  
			}
?>
</body>
</html>

Die zugehörigen Tabellen. Die Tabellenbeschreibung kannst du
zum Testen in eine Textdatei speichern und z.B. mittels phpMyAdmin
importieren.

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-- Tabellenstruktur für Tabelle `t_check`
--

CREATE TABLE `t_check` (
`kat2id` int(11) NOT NULL default '0',
`cb_status` tinyint(1) NOT NULL default '0',
`bus` varchar(4) NOT NULL default '',
PRIMARY KEY (`kat2id`)
) TYPE=MyISAM;

--
-- Daten für Tabelle `t_check`
--

INSERT INTO `t_check` (`kat2id`, `cb_status`, `bus`) VALUES
(1, 0, 'PCIe'),
(2, 0, 'AGP'),
(3, 1, ''),
(4, 0, 'PCI'),
(5, 0, 'PCI'),
(6, 1, 'USB'),
(7, 1, 'PCI'),
(8, 0, 'PCIe'),
(9, 1, 'PCIe'),
(10, 0, 'AGP'),
(11, 0, 'AGP'),
(12, 1, 'PCI');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `t_kat1`
--

CREATE TABLE `t_kat1` (
`id` int(11) NOT NULL auto_increment,
`kat1` varchar(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=9 ;

--
-- Daten für Tabelle `t_kat1`
--

INSERT INTO `t_kat1` (`id`, `kat1`) VALUES
(1, 'Grafikkarte'),
(2, 'Mainboard'),
(3, 'Soundkarte'),
(4, 'TV-Karte'),
(8, 'Videokarte');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `t_kat2`
--

CREATE TABLE `t_kat2` (
`id` int(11) NOT NULL auto_increment,
`katid` int(11) NOT NULL default '0',
`proid` int(11) NOT NULL default '0',
`kat2` varchar(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=13 ;

--
-- Daten für Tabelle `t_kat2`
--

INSERT INTO `t_kat2` (`id`, `katid`, `proid`, `kat2`) VALUES
(1, 1, 1, 'G9900XLS'),
(2, 1, 1, 'G3400LS'),
(3, 2, 1, 'P5B433'),
(4, 3, 3, 'Musicman9900XLS'),
(5, 3, 3, 'Mozart709'),
(6, 4, 3, 'Cinergy T2 USB'),
(7, 4, 3, 'Kinetic507'),
(8, 1, 6, 'GT8800S'),
(9, 1, 6, 'GT9900XL'),
(10, 1, 5, 'Radeon9600'),
(11, 1, 5, 'Radeon9200'),
(12, 8, 5, 'Cinema2007L');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `t_produkt`
--

CREATE TABLE `t_produkt` (
`id` int(11) NOT NULL auto_increment,
`produkt` varchar(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;

--
-- Daten für Tabelle `t_produkt`
--

INSERT INTO `t_produkt` (`id`, `produkt`) VALUES
(1, 'Asus'),
(3, 'Terratec'),
(6, 'GForce'),
(5, 'Ati');
LuckyLuke
LuckyLuke 28.03.2008 um 13:54:29 Uhr
Goto Top
Hey Günni,
sorry für die lange Schweigephase.

Habe dank deiner Hilfe mein Problem gelöst, wirklich sehr simpel. Ich habe einfach eine durchgehende Nummerierung in meine Verwaltungstabelle hinzugefügt und dadurch konnte eine eindeutige Zuweisung gewährleistet werden.

Ich danke dir vielmals, du hast mir mit deinem Beispiel den richtigen Ruck in die richtige Richtung gegeben ;).

Gruß, Luke.