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)
SKRIPT 2 (Führt UPDATE-Befehl aus)
Über einen Denkanstoß wäre ich euch sehr verbunden.
Gruß, Lukas.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 82376
Url: https://administrator.de/contentid/82376
Ausgedruckt am: 23.11.2024 um 00:11 Uhr
12 Kommentare
Neuester Kommentar
@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.
Hoffe, das hilft dir weiter.
Gruß
Günni
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>
Gruß
Günni
@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
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
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:
Gruß
Günni
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
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:
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:
Den Inhalt des Arrays speichere ich in einem versteckten Textfeld:
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:
Falls das Checkboxen-Array kat gesendet wurde, sind 1 oder mehrere Checkboxen
angewählt, die setze ich wieder auf 1:
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":
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');
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');