Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Eindeutige Zusweisung mit Checkbox fällt fehl

Frage Entwicklung PHP

Mitglied: LuckyLuke

LuckyLuke (Level 1) - Jetzt verbinden

05.03.2008, aktualisiert 28.03.2008, 4044 Aufrufe, 12 Kommentare

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)

01.
<?php 
02.
error_reporting(E_ALL); 
03.
// Verbindungsdaten zur Datenbank und deren Datenbanktabellen \\ 
04.
	require("../../../db.inc.php"); 
05.
// ********************************************************** \\ 
06.
$res=mysql_db_query("datenbank_edv",   "SELECT edv.prdNr, PAR.parameter, PW.parameterwert, edv.prdZusatz, PW.cb_status, edv.id,  
07.
											   PW.para_id, PW.prd_position, PW.prdkat_id 
08.
										FROM prd_parawert PW, edv_produkte Edv, prd_parameter PAR, para_kat KAT 
09.
										WHERE PW.prdid = Edv.id 
10.
										AND PW.para_id = PAR.para_id 
11.
										AND PW.prdkat_id = PAR.prd_kategorie 
12.
										AND PW.Prdkat_id = KAT.prdkat_id 
13.
										ORDER BY Edv.prdNr, Edv.prdZusatz, PW.prd_position ASC"); 
14.
 
15.
while($row=mysql_fetch_array($res,MYSQL_NUM)) 
16.
17.
    $pr_nrn[]=$row[0]; 
18.
	$pr_nrn_zu[]=$row[3]; 
19.
	$pr_para[]=$row[1]; 
20.
	$pr_parawert[]=$row[2]; 
21.
	$cb_status[]=$row[4]; 
22.
	$pr_id[]=$row[5]; 
23.
	$pr_para_id[]=$row[6]; 
24.
	$pr_position[]=$row[7]; 
25.
	$pr_kat[]=$row[8]; 
26.
 
27.
	 
28.
	if(isset($_GET['produkt']) && $_GET['produkt']==$row[0].$row[3]) 
29.
30.
		$zeige_produkt=$row
31.
32.
33.
 
34.
 
35.
echo
36.
<form name="produktwahl" method="get" action="'.$_SERVER['PHP_SELF'].'"
37.
<select name="produkt" onchange="document.produktwahl.submit()"
38.
<option value="-1">Bitte wählen</option><option value="-1"></option>'; 
39.
$test=0; 
40.
	for($z=0;$z<count($pr_nrn);$z++) 
41.
42.
        if(isset($_GET['produkt']) && $_GET['produkt']==$pr_nrn[$z].$pr_nrn_zu[$z]) 
43.
44.
			if($test!=$pr_nrn[$z].$pr_nrn_zu[$z]) 
45.
46.
                echo '<option value="'.$pr_nrn[$z].$pr_nrn_zu[$z].'" selected>'.$pr_nrn[$z].$pr_nrn_zu[$z].'</option>'; 
47.
48.
49.
		 
50.
		else 
51.
52.
			if($test!=$pr_nrn[$z].$pr_nrn_zu[$z]) 
53.
54.
                echo '<option value="'.$pr_nrn[$z].$pr_nrn_zu[$z].'">'.$pr_nrn[$z].$pr_nrn_zu[$z].'</option>'; 
55.
56.
57.
		$test=$pr_nrn[$z].$pr_nrn_zu[$z]; 
58.
59.
echo '</select>'; 
60.
 
61.
if(isset($zeige_produkt)) 
62.
63.
	echo
64.
	<table width="650" border="1" cellspacing="0" cellpadding="3"
65.
	<tr><td colspan="3" class="Stil4">Option '; echo $zeige_produkt[0]; 
66.
	echo '</tr></td>'; 
67.
 
68.
	for($z=0;$z<count($pr_nrn);$z++) 
69.
70.
		if($zeige_produkt[0].$zeige_produkt[3]==$pr_nrn[$z].$pr_nrn_zu[$z]) 
71.
72.
			if($pr_para[$z]!="" && $pr_parawert[$z]==""
73.
74.
75.
			else 
76.
77.
				if($cb_status[$z]=="1"
78.
79.
					echo '<tr><td><input type="checkbox" name="prdpara['.$pr_para[$z].']" value="'.$pr_position[$z].'" checked></tr></td>'; 
80.
81.
				else 
82.
83.
					echo '<tr><td><input type="checkbox" name="prdpara['.$pr_para[$z].']" value="'.$pr_position[$z].'"></tr></td>'; 
84.
85.
				echo
86.
				<td width="250" class="Stil3">'.$pr_para[$z].'</td> 
87.
				<td width="400" class="Stil4">'.$pr_parawert[$z].'</td> 
88.
				</tr>'; 
89.
			}			 
90.
91.
92.
 
93.
 
94.
		for($z=0;$z<count($pr_nrn);$z++) 
95.
96.
			if($zeige_produkt[0].$zeige_produkt[3]==$pr_nrn[$z].$pr_nrn_zu[$z]) 
97.
98.
					echo
99.
					<input type="hidden" name="pr_id[]" value="'.$pr_id[$z].'"
100.
					<input type="hidden" name="pr_para_id[]" value="'.$pr_para_id[$z].'"
101.
					<input type="hidden" name="pr_kat[]" value="'.$pr_kat[$z].'">'; 
102.
103.
104.
105.
?>
SKRIPT 2 (Führt UPDATE-Befehl aus)

01.
<?php  
02.
error_reporting(E_ALL); 
03.
 
04.
// Verbindungsdaten zur Datenbank und deren Datenbanktabellen \\ 
05.
	require("../../../db.inc.php"); 
06.
// ********************************************************** \\ 
07.
 
08.
$prdid = $_POST['pr_id']; 
09.
$prdparaid = $_POST['pr_para_id']; 
10.
$prdkat = $_POST['pr_kat']; 
11.
$cb_status = $_POST['prdpara']; 
12.
$position = $_POST['pr_pos']; 
13.
 
14.
var_dump($cb_status); 
15.
if(isset($_POST['prdpara'])) 
16.
17.
	for($z=0;$z<count($cb_status);$z++) 
18.
19.
		$query_para = "UPDATE prd_parawert  
20.
						 
21.
						SET prd_parawert.cb_status = '1' 
22.
	 
23.
							WHERE prd_parawert.prdid = '".$prdid[0]."
24.
								 
25.
									AND prd_parawert.para_id = '".$prdparaid[$z]."
26.
									 
27.
										AND prd_parawert.prdkat_id = '".$prdkat[$z]."
28.
										 
29.
											AND prd_parawert.prd_position = '".$position[$z]."'"
30.
	 
31.
		$result=mysql_query($query_para);  
32.
33.
34.
 
35.
echo mysql_error(); 
36.
mysql_close($link); 
37.
?>
Über einen Denkanstoß wäre ich euch sehr verbunden.

Gruß, Lukas.
Mitglied: sleipnir
05.03.2008 um 13:50 Uhr
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
Bitte warten ..
Mitglied: LuckyLuke
05.03.2008 um 13:57 Uhr
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...
Bitte warten ..
Mitglied: sleipnir
05.03.2008 um 14:56 Uhr
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[0]."'

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

Gruß
Sleipnir
Bitte warten ..
Mitglied: LuckyLuke
05.03.2008 um 15:13 Uhr
Also die Zuordnung zum Produkt stimmt in diesem Fall. Denn $prdid[0] 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...
Bitte warten ..
Mitglied: Guenni
07.03.2008 um 06:44 Uhr
@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.
01.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
02.
<html> 
03.
<head> 
04.
<title>Untitled</title> 
05.
</head> 
06.
<body> 
07.
<? 
08.
include("net-comm/inc/session.inc.php"); 
09.
//Hier wird das Update ausgeführt 
10.
if(isset($_POST[cmd])){ 
11.
 if(isset($_POST['kat'])){ 
12.
  $query="select * from t_check where prid=".$_POST['id']; 
13.
  $result=mysql_query($query)or die(mysql_error()); 
14.
	$row=mysql_fetch_array($result,MYSQL_ASSOC); 
15.
	$wert=$row[cb_status] ? 1 : 0; 
16.
	if($wert){ 
17.
	 echo "Keine Änderung"
18.
	}else{	 
19.
	 			$query="update t_check set cb_status=1 where prid=".$_POST['id']; 
20.
	 			$result=mysql_query($query)or die(mysql_error()); 
21.
22.
23.
 if(!isset($_POST['kat'])){ 
24.
  $query="select * from t_check where prid=".$_POST['id']; 
25.
  $result=mysql_query($query)or die(mysql_error()); 
26.
	$row=mysql_fetch_array($result,MYSQL_ASSOC); 
27.
	$wert=$row[cb_status] ? 1 : 0; 
28.
	if(!$wert){ 
29.
	 echo "Keine Änderung"
30.
	}else
31.
	 			$query="update t_check set cb_status=0 where prid=".$_POST['id']; 
32.
	 			$result=mysql_query($query)or die(mysql_error()); 
33.
34.
35.
 unset($_POST['selwahl']); 
36.
 echo "<br>"
37.
38.
//Selectbox füllen 
39.
$query="select * from t_check,t_produkt"
40.
$query.=" where t_check.prid=t_produkt.id"
41.
$result=mysql_query($query) or die(mysql_error()); 
42.
echo "<form action=\"test-check2.php\" method=\"post\" name=\"auswahl\">"
43.
echo "<select name=\"selwahl\" onchange=document.auswahl.submit()>"
44.
echo "<option selected> -- Bitte Produkt wählen -- </option>"
45.
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ 
46.
 echo "<option value=$row[id]>$row[produkt]</option>"
47.
48.
echo "</select>"
49.
 
50.
if(isset($_POST['selwahl'])){ 
51.
 $query="select * from t_check,t_produkt"
52.
 $query.=" where t_check.prid=t_produkt.id"
53.
 $query.=" and t_produkt.id=".$_POST['selwahl']; 
54.
 $result=mysql_query($query) or die(mysql_error()); 
55.
 echo "<table border=\"1\">"
56.
 while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ 
57.
  echo "<tr>"
58.
  if($row[cb_status]){ 
59.
   echo "<td> Datensatz-ID: $row[id] </td>"
60.
	 echo "<td> Produkt: $row[produkt] </td>"
61.
   echo "<td><input type=\"checkbox\" checked name=\"kat\"><input type=\"hidden\" value=$row[id] name=\"id\"></td>"
62.
  }else
63.
 			 echo "<td> Datensatz-ID: $row[id] </td>"
64.
			 echo "<td> Produkt: $row[produkt] </td>"
65.
 			 echo "<td><input type=\"checkbox\" name=\"kat\"><input type=\"hidden\" value=$row[id] name=\"id\"></td>"
66.
67.
  echo "</tr>"
68.
69.
 echo "</table>"
70.
71.
echo "<br><br><input type=\"submit\" name=\"cmd\" value=\"Update\">"
72.
echo "</form>"
73.
?> 
74.
</body> 
75.
</html>
Hoffe, das hilft dir weiter.
Gruß
Günni
Bitte warten ..
Mitglied: LuckyLuke
07.03.2008 um 10:18 Uhr
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:
01.
<? 
02.
	if(isset($_POST['kat'])) 
03.
04.
		$query="SELECT * FROM edv_produkte Edv, prd_parameter PAR, para_kat KAT, prd_parawert PW 
05.
				WHERE PW.prdid = Edv.id  
06.
				AND PW.para_id = PAR.para_id 
07.
				AND PW.prdkat_id = PAR.prd_kategorie 
08.
				AND PW.Prdkat_id = KAT.prdkat_id 
09.
				AND PW.prdid = '".$_POST['id']."' 
10.
				AND PW.prd_position = '".$_POST['pos']."'"
11.
		$result=mysql_query($query)or die(mysql_error()); 
12.
		$row=mysql_fetch_array($result,MYSQL_ASSOC); 
13.
		$wert=$row['cb_status'] ? 1 : 0; 
14.
		if($wert
15.
16.
			echo "Keine Änderung"
17.
18.
			else 
19.
20.
				$query="UPDATE prd_parawert SET cb_status = 1   
21.
						WHERE prdid = '".$_POST['id']."' 
22.
						AND   prd_position = '".$_POST['pos']."'"
23.
				$result=mysql_query($query)or die(mysql_error()); 
24.
25.
26.
 
27.
	if(!isset($_POST['kat'])) 
28.
29.
		$query="SELECT * FROM edv_produkte Edv, prd_parameter PAR, para_kat KAT, prd_parawert PW 
30.
				WHERE PW.prdid = Edv.id  
31.
				AND PW.para_id = PAR.para_id 
32.
				AND PW.prdkat_id = PAR.prd_kategorie 
33.
				AND PW.Prdkat_id = KAT.prdkat_id 
34.
				AND PW.prdid = '".$_POST['id']."' 
35.
				AND PW.prd_position = '".$_POST['pos']."'"
36.
		$result=mysql_query($query)or die(mysql_error()); 
37.
		$row=mysql_fetch_array($result,MYSQL_ASSOC); 
38.
		$wert=$row['cb_status'] ? 1 : 0; 
39.
		if(!$wert
40.
41.
		echo "Keine Änderung"
42.
43.
			else 
44.
45.
				$query="UPDATE prd_parawert SET cb_status = 1   
46.
						WHERE prdid = '".$_POST['id']."' 
47.
						AND   prd_position = '".$_POST['pos']."'"
48.
				$result=mysql_query($query)or die(mysql_error()); 
49.
50.
51.
	unset($_POST['selwahl']); 
52.
	echo "<br>"
53.
54.
?>
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.
Bitte warten ..
Mitglied: Guenni
08.03.2008 um 12:45 Uhr
@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
Bitte warten ..
Mitglied: LuckyLuke
10.03.2008 um 00:21 Uhr
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.
Bitte warten ..
Mitglied: Guenni
10.03.2008 um 19:47 Uhr
@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:

01.
<? 
02.
include("net-comm/inc/session.inc.php"); 
03.
//Hier wird das Update ausgeführt 
04.
if(isset($_POST[cmd])){ 
05.
 if(isset($_POST[kat])){ 
06.
  /* 
07.
    Da nicht angewählte Checkboxen nicht gesendet werden, 
08.
    wird die komplette Spalte cb_status erstmal auf Null 
09.
    gesetzt. Falls kat gesetzt ist, werden in der folg. 
10.
    foreach-Schleife die entsprechenden Reihen wieder auf 
11.
    eins gesetzt. 
12.
 */ 
13.
  mysql_query("update t_check set cb_status=0"); 
14.
  foreach($_POST[kat] as $id){ 
15.
   $query="update t_check set cb_status=1 where kat2id=$id"
16.
	 mysql_query($query)or die(mysql_error()); 
17.
18.
	 
19.
 }else
20.
 			 /* 
21.
			 Wenn kat nicht gesendet wurde, alles auf Null setzen 
22.
			 */ 
23.
 			 mysql_query("update t_check set cb_status=0"); 
24.
25.
 // Seite nach dem Update aktualisieren 
26.
	header("location:test-check4.php"); 
27.
28.
?> 
29.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
30.
<html> 
31.
<head> 
32.
<title>Spalten mit Checkboxen bearbeiten</title> 
33.
</head> 
34.
<body> 
35.
<? 
36.
$query="select produkt,kat1,kat2,kat2id,cb_status from"
37.
$query.=" t_produkt,t_kat1,t_kat2,t_check where"
38.
$query.=" t_kat2.id=t_check.kat2id and"
39.
$query.=" t_kat1.id=t_kat2.katid and"
40.
$query.=" t_kat2.proid=t_produkt.id"
41.
$query.=" order by 1,2,3"
42.
$result=mysql_query($query) or die(mysql_error()); 
43.
$row=mysql_fetch_array($result,MYSQL_ASSOC); 
44.
echo "<form action=\"test-check4.php\" method=\"post\">"
45.
echo "<table border=\"1\">"
46.
/* 
47.
Tabellenköpfe ausgeben 
48.
*/ 
49.
while($field=key($row)){ 
50.
 if($field=="kat2id"){ 
51.
 }else
52.
 			 echo "<th>$field</th>"
53.
54.
 next($row); 
55.
56.
/* 
57.
Da durch obige Anweisung "$row=..." bereits der erste 
58.
Datensatz abgerufen wurde, muß das Query nochmals 
59.
ausgeführt werden. 
60.
*/ 
61.
$result=mysql_query($query) or die(mysql_error()); 
62.
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ 
63.
 echo "<tr>"
64.
  echo "<td> $row[produkt] </td>"
65.
	echo "<td> $row[kat1] </td>"
66.
	echo "<td> $row[kat2] </td>"
67.
  if($row[cb_status]){ 
68.
	 echo "<td><input type=\"checkbox\" name=kat[] checked value=$row[kat2id]></td>"
69.
  }else
70.
 			 echo "<td><input type=\"checkbox\" name=kat[] value=$row[kat2id]></td>"
71.
72.
73.
echo "</table>"
74.
echo "<br>"
75.
echo "<input type=\"submit\" name=\"cmd\" value=\"Update\">"
76.
echo "</form>"
77.
?> 
78.
</body> 
79.
</html> 
80.
 
81.
 
Gruß
Günni
Bitte warten ..
Mitglied: LuckyLuke
12.03.2008 um 10:02 Uhr
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.
Bitte warten ..
Mitglied: Guenni
15.03.2008 um 09:19 Uhr
@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:
01.
<? 
02.
if($row[cb_status]){ 
03.
 echo "<td><input type=\"checkbox\" name=kat[] checked value=$row[kat2id]></td>"
04.
 }else
05.
  echo "<td><input type=\"checkbox\" name=kat[] value=$row[kat2id]></td>"
06.
07.
?>
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:
01.
<? 
02.
$sets[]=$row[kat2id]; 
03.
?>
Den Inhalt des Arrays speichere ich in einem versteckten Textfeld:
01.
<? 
02.
echo "<input type=\"hidden\" name=\"sets\" value=".implode("+",$sets).">"
03.
?<
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:
01.
<? 
02.
if(isset($_POST[cmd])){ 
03.
 $sets=explode("+",$_POST[sets]); 
04.
 foreach($sets as $id){ 
05.
  $query="update t_check set cb_status=0 where kat2id=$id"
06.
  mysql_query($query)or die(mysql_error()); 
07.
08.
. . . . .  
09.
?>
Falls das Checkboxen-Array kat gesendet wurde, sind 1 oder mehrere Checkboxen
angewählt, die setze ich wieder auf 1:
01.
<? 
02.
if(isset($_POST[kat])){ 
03.
  foreach($_POST[kat] as $id){ 
04.
   $query="update t_check set cb_status=1 where kat2id=$id"
05.
	 mysql_query($query)or die(mysql_error()); 
06.
07.
08.
?>
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":
01.
<? 
02.
include("net-comm/inc/session.inc.php"); 
03.
//Hier wird das Update ausgeführt 
04.
if(isset($_POST[cmd])){ 
05.
 $sets=explode("+",$_POST[sets]); 
06.
 foreach($sets as $id){ 
07.
	$query="update t_check set cb_status=0 where kat2id=$id"
08.
	mysql_query($query)or die(mysql_error()); 
09.
10.
 if(isset($_POST[kat])){ 
11.
  foreach($_POST[kat] as $id){ 
12.
   $query="update t_check set cb_status=1 where kat2id=$id"
13.
	 mysql_query($query)or die(mysql_error()); 
14.
15.
16.
  /* 
17.
	  Seite nach dem Update aktualisieren 
18.
	*/ 
19.
	header("location:test-check4.php"); 
20.
21.
?> 
22.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
23.
<html> 
24.
<head> 
25.
<title>Spalten mit Checkboxen bearbeiten</title> 
26.
</head> 
27.
<body> 
28.
<? 
29.
if(isset($_POST[selwahl])){ 
30.
$id=$_POST[selwahl]; 
31.
$query="select produkt,kat1,kat2,kat2id,cb_status,bus from"
32.
$query.=" t_produkt,t_kat1,t_kat2,t_check where"
33.
$query.=" t_kat2.id=t_check.kat2id and"
34.
$query.=" t_kat1.id=t_kat2.katid and"
35.
$query.=" t_kat2.proid=t_produkt.id and t_produkt.id=$id"
36.
$query.=" order by 1,2,3"
37.
$result=mysql_query($query) or die(mysql_error()); 
38.
$row=mysql_fetch_array($result,MYSQL_ASSOC); 
39.
echo "<form action=\"test-check4.php\" method=\"post\">"
40.
echo "<table border=\"1\">"
41.
/* 
42.
Tabellenköpfe ausgeben 
43.
*/ 
44.
while($field=key($row)){ 
45.
 if($field=="kat2id"){ 
46.
 }else
47.
 			 echo "<th>$field</th>"
48.
49.
 next($row); 
50.
51.
/* 
52.
Da durch obige Anweisung "$row=..." bereits der erste 
53.
Datensatz abgerufen wurde, muß das Query nochmals 
54.
ausgeführt werden. 
55.
*/ 
56.
$result=mysql_query($query) or die(mysql_error()); 
57.
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ 
58.
 $sets[]=$row[kat2id]; 
59.
 echo "<tr>"
60.
  echo "<td> $row[produkt] </td>"
61.
	echo "<td> $row[kat1] </td>"
62.
	echo "<td> $row[kat2] </td>"
63.
  if($row[cb_status]){ 
64.
	 echo "<td><input type=\"checkbox\" name=kat[] checked value=$row[kat2id]></td>"
65.
  }else
66.
 			 echo "<td><input type=\"checkbox\" name=kat[] value=$row[kat2id]></td>"
67.
68.
	echo "<td> $row[bus] </td>"
69.
	echo "</tr>"
70.
71.
echo "</table>"
72.
echo "<br>"
73.
echo "<input type=\"hidden\" name=\"sets\" value=".implode("+",$sets).">"
74.
echo "<input type=\"submit\" name=\"cmd\" value=\"Update\">"
75.
echo "<input type=\"submit\" name=\"cmd_reset\" value=\"Auswahl löschen\">"
76.
echo "</form>"
77.
}else
78.
			$query="select id,produkt from t_produkt order by produkt"
79.
			$result=mysql_query($query) or die(mysql_error()); 
80.
			echo "<form action=\"test-check4.php\" method=\"post\" name=\"frmwahl\">"
81.
			echo "<select name=\"selwahl\" onchange=\"document.frmwahl.submit()\">"
82.
			echo "<option> - Produkt wählen - </option>"
83.
			while($row=mysql_fetch_array($result,MYSQL_ASSOC)){ 
84.
			 echo "<option value=$row[id]>$row[produkt]</option>"
85.
86.
			echo "</select>"
87.
			echo "</form>"
88.
89.
?> 
90.
</body> 
91.
</html> 
92.
 
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');
Bitte warten ..
Mitglied: LuckyLuke
28.03.2008 um 13:54 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Windows 7
gelöst Windows Updates shlagen immer fehl (3)

Frage von Floh21 zum Thema Windows 7 ...

Windows Server
WSUS Neuinstallation auf SBS2011 schlägt fehl (3)

Frage von Blongmon zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...