Checkboxen mittels PHP in Datenbank eintragen

Hallo,

ich arbeite seit zirka zwei Monaten an einem kleinen Internetportal. Trotz 0 PHP und MySQL Kenntnissen zu Beginn bin ich mittlerweile in die Zielgerade eingebogen. Einerseits freue ich mich darüber, andererseits bin ich nervlich am Ende :confused: Leider habe ich noch ein Problem, welches ich trotz aller Anstrengunen (etwa einem Thread in einem anderen Forum) bisher nicht lösen konnte: Checkboxen mittels PHP in eine MySQL Datenbank eintragen! Mein Formular sieht beispielhaft wie folgt aus.

Produktname:
USB
Firewire
eSata

Dazu meine Datenbank mit dem Namen „Produktdatenbank“ inklusive einiger Beispieldaten:

Tabelle „Produkt“
ProduktID | Produktname
1, Speed PC
2, Power PC

Tabelle „Anschluss“
AnschlussID | Anschlussname
1, USB
2, Firewire
3, eSata

Tabelle „Beziehung“
ProduktID | AnschlussID
1, 1
1, 3
2, 1
2, 2

Zum Thema Checkboxen/MySQL gibt es zwar unzählige Foreneinträge, leider habe ich bis jetzt nicht geschafft mein Problem zu lösen. Scheinbar benötige ich eine vorgekaute Lösung :confused: Meines Wissens werden Checkboxen (hier $_POST[‚AnschlussID‘]) - sofern sie geklickt wurden - als Array übergeben. Es wurde mich freuen wenn mir jemand zeigen würde, wie ich im Auswertungsskript vorgehe. Ich habe bewusst ein kompaktes Beispiel gewählt, da ich hoffe, dass sich die Lösung meines Problems somit mit wenigen Zeilen Code zeigen lässt.

also

$checkboxenwerte = $_POST[‚AnschlussID‘]);

// für jede checkbox
foreach ( $checkboxenwerte as $einwert) {

// sql fuer eintrag in tabelle
$sql = „insert into Anschluss values(’“.$einwert."’)";
// dann noch ausfßühren
$result = mysql_query($sql);

}

oder wie genau wills tdu wo was eintragen :smile:

Danke Lacta für deine schnelle Antwort. Ich glaube mit deinem Beitrag bin ich der Lösung einen Schritt näher gekommen. Gleichzeitig muss ich auch das Produkt ($_POST[‚Produktname‘)] mit dem Formular an die Datenbank übermitteln. In der Datenbank soll ja jedes Produkt mit den dazugehörigen Anschlüssen zu finden sein (siehe Tabelle „Beziehung“). Die ProduktID wird jedem Produktnamen automaisch in der Tabelle „Produkt“ per auto_increment zugeordnet.

EDIT: In die Tabelle „Anschluss“ will ich gar nichts eintragen (der Inhalt, quasi die Codierung, ist schon vorgegeben). Werte sollen nur in „Produkt“ und „Beziehung“ eingetragen werden.

ProduktID wird jedem Produktnamen automaisch in der Tabelle
„Produkt“ per auto_increment zugeordnet.

EDIT: In die Tabelle „Anschluss“ will ich gar nichts eintragen
(der Inhalt, quasi die Codierung, ist schon vorgegeben). Werte
sollen nur in „Produkt“ und „Beziehung“ eingetragen werden.

Anschlüssen zu finden sein (siehe Tabelle „Beziehung“). Die
ProduktID wird jedem Produktnamen automaisch in der Tabelle
„Produkt“ per auto_increment zugeordnet.

EDIT: In die Tabelle „Anschluss“ will ich gar nichts eintragen
(der Inhalt, quasi die Codierung, ist schon vorgegeben). Werte
sollen nur in „Produkt“ und „Beziehung“ eingetragen werden.

hmm so … grr … heute nicht mein tag, 4 post und immernoch der flasche lol-

<?php if (isset($_POST['Produktname'])) {
$checkboxenwerte = $\_POST['AnschlussID']); $produktname = $\_POST['Produktname']); // insert produkt name und get id (last\_insert auto\_insert value) $sql = "INSERT INTO Produkt values ('','".$produktname."')"; $results = mysql\_query($sql); if (!$results) { echo 'Abfrage konnte nicht ausgeführt werden: ' . mysql\_error(); exit; } $neue\_produkt\_ID = mysql\_insert\_id(); // für jede checkbox foreach ( $checkboxenwerte as $Anschluss\_id) { // sql fuer eintrag in tabelle $sql = "insert into Beziehung values('".$neue\_produkt\_ID."','".$Anschluss\_id."')"; $results = mysql\_query($sql); if (!$results) { echo 'Abfrage konnte nicht ausgeführt werden: ' . mysql\_error(); exit; } } } ?\>Test produkt neu eingabe und anschluss eingabe Produktname: <?php // anschluesse raussuchen und ausgeben als checkboxen
$sql = "SELECT AnschlussID,Anschlussname FROM Anschluss WHERE 1=1"; $results = mysql\_query($sql); if (!$results) { echo 'Abfrage konnte nicht ausgeführt werden: ' . mysql\_error(); exit; } while($row=mysql\_fetch\_array($results)) { echo " ".$row['Anschlussname']." "; } ?\> ungetestet

Puh, jedesmal wenn ich deinen Code ausdrucken wollte, war der Beitrag wieder verschwunden :wink: Jetzt hat es aber geklappt. Ich werde deinen Lösungsvorschlag gleich genauer unter die Lupe nehmen und melde mich dann wieder. Jedenfalls schon mal ein großes danke.

Sehr schön, die Checkboxen an die Datenbank zu übermitteln funktioniert bereits beinahe! Einzig mysql_insert_id() liefert immer den Wert „0“ obwohl Werte in der Spalte „ProduktID“ mittels „auto_increment“ erzeugt werden.

Edit: So, jetzt funktioniert es. Ich stellte meine Datenbankverbindung mit „$verbindung = new mysqli(‚localhost‘, ‚root‘, ‚passwort‘, ‚datenbankname‘);“ her. Mein Code zum Auslesen der auto_increment Spalte muss daher so aussehen:

$neue_produkt_id = $verbindung->insert_id;

So, Checkboxen in die Datenbank schreiben funktioniert top, vielen Dank! Der Code wirkt auch sehr verständlich, als Jungspund wäre ich aber trotzdem nicht selbst auf die Lösung gekommen. Nun arbeite ich an einer kleinen Suchfunktion, die mir die Produkte mit den zugehörigen Anschlüssen aus der Datenbank auslesen soll. Dazu meine Tabellen und die Select Anfrage:

Tabelle „Produkt“
ProduktID | Produktname | Produkthersteller
1, Speed PC, Pegasus
2, Power PC, Accelerate
3, Speed PC II, Pegasus

Tabelle „Anschluss“
AnschlussID | Anschlussname
1, USB
2, Firewire
3, eSata

Tabelle „Beziehung“
ProduktID | AnschlussID
1, 1
1, 3
2, 1
2, 2
3, 1
3, 2
3, 3

$querry = „select Produkt.*, Beziehung.AnschlussID, Anschluss.Anschlussname
from Produkt, Beziehung, Anschluss
where Produkt.Produktname like ‚%$Produktname%‘
and Produkt.Produktherstellter like ‚%$Produkthersteller%‘
and Produkt.ProduktID = Beziehung.ProduktID
and Beziehung.AnschlussID = Anschluss.AnschlussID“; // Produktname und Produkthersteller werden über das Suchformular übergeben

Jetzt benötige ich nur noch eine Schleife, die mir die abgerufenen Werte korrekt abbildet. Etwa für die Suche nach „Pegasus“ und „Speed PC“:

Pegasus Speed PC
Anschlüsse: USB, eSate

Pegasus Speed PC II
Anschlüsse: USB, Firewire, eSata

Ich denke, das kann ich schaffen …zumindest arbeite ich gerade daran :wink:

$querry = „select Produkt.*, Beziehung.AnschlussID,
Anschluss.Anschlussname
from Produkt, Beziehung, Anschluss
where Produkt.Produktname like ‚%$Produktname%‘
and Produkt.Produktherstellter like ‚%$Produkthersteller%‘
and Produkt.ProduktID = Beziehung.ProduktID
and Beziehung.AnschlussID = Anschluss.AnschlussID“; //

also die schleife um zeile für zeile daten von der datenbank abzurufen ist , zum verstehen hier nachlesen .

while ($row = mysql_fetch_assoc($result)) {
echo $row[„userid“];
echo $row[„fullname“];
echo $row[„userstatus“];
}

Also muss du dir erstmal angugen was du als ergebnis erhälst. Was produziert deine SQL Abfrage

ich glaub sowas wie

Name | Anschluss
PC | USB
PC | Wireless
Mobil | Wireless
Mobil | Infrarot

was fällt auf ?

solange sich der name wiederholt , ist es ein weiteres zubehör.

also brauchen wir einen anzeiger das der Name wechselt , tut er dass haben wir ein neues Produkt, tut er das nicht so ist es ein Anchluss des aktuellen Produktes.

$altesprodukt = „“;
while ($row = mysql_fetch_assoc($result)) {
// fals neu ungleich alt dann neues produkt
if ($altesprodukt != $row[„Produktname“] ) {
echo "
„; // neue Zeile für neues Produkt ;
echo $row[„Produktname“].“ : ".$row[„Anschlussname“]; // produktname und 1. anschluss ausgeben
$altesprodukt = $row[„Produktname“]; // aktuallisieren
} else {
// produkt ist noch das gleiche , also nur anschluss anhängen
echo ", ".$row[„Anschlussname“]; // x ten anschluss ausgeben
$altesprodukt = $row[„Produktname“]; // aktuallisieren
}
}

fehler musst du selber finden :smile:

Danke für deinen Beitrag. Ja, meine SQL Abfrage produziert die von dir vermutete Ausgabe. Ich habe diese Ausgabe mit group_concat() manipuliert, siehe hier. Sie sieht dann in etwa so aus:

Produktname | Anschluss
Speed PC | USB, Firewire
Power PC II | USB, Firewire, eSATA

Diese Ausgabe lässt sich leicht mit einer Schleife auslesen.

for ($i = 0; $i fetch\_assoc();
 echo $row['produktname'] . '
';
 echo 'Anschlüsse: ' . $row['anschluss'] . '

';
}

Mittlerweile habe ich aber zwei m:n Beziehungen in meiner Datenbank und dadurch viele neue Probleme:

Tabelle „Produkt“
ProduktID | Produktname
1, Speed PC
2, Power PC
3, Speed PC II

Tabelle „Anschluss“
AnschlussID | Anschlussname
1, USB
2, Firewire
3, eSata

Tabelle „Anschluss_Beziehung“
ProduktID | AnschlussID
1, 1
1, 3
2, 1
2, 2
3, 1
3, 2
3, 3

Tabelle „Drahtlos“
DrahtlosID | Drahtlosname
1, WLAN
2, Bluetooth
3, Infrarot

Tabelle „Drahtlos_Beziehung“
ProduktID | DrahtlosID
1, 1
1, 2
2, 1
3, 1
3, 2
3, 3

Ich vermute, alle meine Daten lassen sich nicht mehr mit einer einzigen Select Abfrage aus der Datenbank holen. Anfangs hast du erklärt, wie man mit mehreren Insert Befehlen den Produktnamen und die Anschlüsse (mittels Checkboxen) einträgt. Analog könnte ich mir vorstellen, dass man in einer ersten Select Abfrage das gesuchte Produkt auswählt und dann mit weiteren Select Abfragen anhand der ProduktID die Anschlüsse bzw. Drahtlosanschlüsse ausliest (sicher bin ich mir aber nicht, ob diese Vorgehensweise korrekt ist). Ich hoffe, ich kann mich trotzdem bald mit einer Lösung melden. Nochmals vielen Dank für deine Postings, die immer sehr verständlich und hilfreich sind.

Es hat etwas gedauert, aber ich habe das Problem gelöst. In der ersten Select Abfrage rufe ich nur Daten aus der Tabelle „Produkt“ ab. Diese Daten gebe ich in einer Schleife aus. In dieser Schleife führe ich gleichzeitig eine weitere Abfrage aus und hole mithilfe der ProduktID die passenden Anschlüsse aus der Datenbank.

Ich hoffe das ist ein „korrekter“ Lösungsweg. Genauers kann ich morgen posten.

Gute Nacht!

Ich hoffe das ist ein „korrekter“ Lösungsweg. Genauers kann
ich morgen posten.

Es ist mindestens ein möglicher Weg . Wie weit sich das dann Optimieren lässt liegt auch offt an der Weiterverarbeitung der Daten .

Machmal ist eine Extra Tabelle (auch temporär) der schnellere Weg als PHP alleine .
Ich hab 100000 Einträge , da wären 100000 querys einfach viel zu viel , das kann die Datenbank selber besser (z.b. mit prozeduren oder funktionen oder views) .

sowas wäre eine Frage im Board Datenbanken

Aber da wir gerade heir sind :wink:

wie siehts denn hier mit aus :

SELECT produkt.Produktname , anschluss.Anschlussname , drahtlos.Drahtlosname
FROM produkt
JOIN anschluss_beziehung
ON produkt.ProduktID = anschluss_beziehung.ProduktID
JOIN drahtlos_beziehung
ON drahtlos_beziehung.ProduktID = produkt.ProduktID
JOIN anschluss
ON anschluss.AnschlussID = anschluss_beziehung.AnschlussID
JOIN drahtlos
ON drahtlos_beziehung.DrahtlosID = drahtlos.DrahtlosID

macht

Produktname Anschlussname Drahtlosname
Speed PC USB WLAN
Speed PC USB Bluetooth
Speed PC eSata WLAN
Speed PC eSata Bluetooth
Power PC USB WLAN
Power PC Firewire WLAN
Speed PC II USB WLAN
Speed PC II USB Bluetooth
Speed PC II USB Infrarot
Speed PC II Firewire WLAN
Speed PC II Firewire Bluetooth
Speed PC II Firewire Infrarot
Speed PC II eSata WLAN
Speed PC II eSata Bluetooth
Speed PC II eSata Infrarot

die sql datei dazu

– phpMyAdmin SQL Dump
– version 3.2.0.1
http://www.phpmyadmin.net

– Host: localhost
– Erstellungszeit: 17. April 2011 um 17:16
– Server Version: 5.1.36
– PHP-Version: 5.3.0

SET SQL_MODE=„NO_AUTO_VALUE_ON_ZERO“;

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;


– Datenbank: helptheworld



– Tabellenstruktur für Tabelle anschluss

CREATE TABLE IF NOT EXISTS anschluss (
AnschlussID int(11) NOT NULL AUTO_INCREMENT,
Anschlussname varchar(255) NOT NULL,
PRIMARY KEY (AnschlussID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


– Daten für Tabelle anschluss

INSERT INTO anschluss (AnschlussID, Anschlussname) VALUES(1, ‚USB‘);
INSERT INTO anschluss (AnschlussID, Anschlussname) VALUES(2, ‚Firewire‘);
INSERT INTO anschluss (AnschlussID, Anschlussname) VALUES(3, ‚eSata‘);



– Tabellenstruktur für Tabelle anschluss_beziehung

CREATE TABLE IF NOT EXISTS anschluss_beziehung (
ProduktID int(11) NOT NULL,
AnschlussID int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


– Daten für Tabelle anschluss_beziehung

INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(1, 1);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(1, 3);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(2, 1);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(2, 2);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(3, 1);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(3, 2);
INSERT INTO anschluss_beziehung (ProduktID, AnschlussID) VALUES(3, 3);



– Tabellenstruktur für Tabelle drahtlos

CREATE TABLE IF NOT EXISTS drahtlos (
DrahtlosID int(11) NOT NULL AUTO_INCREMENT,
Drahtlosname varchar(255) NOT NULL,
PRIMARY KEY (DrahtlosID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


– Daten für Tabelle drahtlos

INSERT INTO drahtlos (DrahtlosID, Drahtlosname) VALUES(1, ‚WLAN‘);
INSERT INTO drahtlos (DrahtlosID, Drahtlosname) VALUES(2, ‚Bluetooth‘);
INSERT INTO drahtlos (DrahtlosID, Drahtlosname) VALUES(3, ‚Infrarot‘);



– Tabellenstruktur für Tabelle drahtlos_beziehung

CREATE TABLE IF NOT EXISTS drahtlos_beziehung (
ProduktID int(11) NOT NULL,
DrahtlosID int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


– Daten für Tabelle drahtlos_beziehung

INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(1, 1);
INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(1, 2);
INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(2, 1);
INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(3, 1);
INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(3, 2);
INSERT INTO drahtlos_beziehung (ProduktID, DrahtlosID) VALUES(3, 3);



– Tabellenstruktur für Tabelle produkt

CREATE TABLE IF NOT EXISTS produkt (
ProduktID int(11) NOT NULL AUTO_INCREMENT,
Produktname varchar(255) NOT NULL,
PRIMARY KEY (ProduktID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


– Daten für Tabelle produkt

INSERT INTO produkt (ProduktID, Produktname) VALUES(1, ‚Speed PC‘);
INSERT INTO produkt (ProduktID, Produktname) VALUES(2, ‚Power PC‘);
INSERT INTO produkt (ProduktID, Produktname) VALUES(3, ‚Speed PC II‘);

Danke, ich werde gleich versuchen eine Schleife dazu zu basteln.

Hier nochmal mein Lösungsweg im Detail:

$db = db\_connect();

$query = "select \* from Produkt
where Produkt.Produktname like '%$produktname%' and Produkt.Produkthersteller like '%$produkthersteller%';
// $produktname und $produkthersteller stammen aus dem Suchformular

$result = $db-\>query($query);

$num\_results = $result-\>num\_rows;

echo ' ' . $num\_results . ' Produkt(e) gefunden ';

for ($i = 0; $i fetch\_assoc();
 echo 
 echo $row['Produktname'] . $row['Produkthersteller'];
 echo '
 Anschlüsse: ';

 $ProduktID = $row['ProduktID'];

 $query\_anschluss = "select Anschluss\_Beziehung.AnschlussID, Anschluss.Anschlussname
 from Anschluss\_Beziehung, Anschluss
 where Anschluss\_Beziehung.ProduktID = '$ProduktID'
 and Anschluss\_Beziehung.AnschlussID = Anschluss.AnschlussID";
 $result\_anschluss = $db-\>query($query\_anschluss);
 
 $Anschlussname = array();
 while ($row = $result\_anschluss-\>fetch\_assoc()) {
 $Anschlussname[] = $row['Anschlussname'];
 }
 echo implode(", ", $Anschlussname);
 echo 



 // gleicher Vorgang hier für "Drahtlos"!!!


 echo ' ';
}

$result-\>free();

$db-\>close();

da du mir group_concat() gezeigt hast , dachte ich mir dieses :

SELECT produkt.Produktname , group_concat(anschluss.Anschlussname) , group_concat(drahtlos.Drahtlosname)
FROM produkt
JOIN anschluss_beziehung
ON produkt.ProduktID = anschluss_beziehung.ProduktID
JOIN drahtlos_beziehung
ON drahtlos_beziehung.ProduktID = produkt.ProduktID
JOIN anschluss
ON anschluss.AnschlussID = anschluss_beziehung.AnschlussID
JOIN drahtlos
ON drahtlos_beziehung.DrahtlosID = drahtlos.DrahtlosID
GROUP BY produkt.Produktname

ergibt

Produktname group_concat(anschluss.Anschlussname) group_concat(drahtlos.Drahtlosname)
Power PC USB,Firewire WLAN,WLAN
Speed PC USB,USB,eSata,eSata WLAN,Bluetooth,WLAN,Bluetooth
Speed PC II USB,USB,USB,Firewire,Firewire,Firewire,eSata,eSata… WLAN,Bluetooth,Infrarot,WLAN,Bluetooth,Infrarot,WL…

da braucht man nur noch doppelte filtern :smile:

Alles doppelt war genau das Problem, dass ich hatte :wink: Als Jungspund war ich gleich so verunsichert, dass ich meine Finger davon gelassen habe.

Alles doppelt war genau das Problem, dass ich hatte :wink: Als
Jungspund war ich gleich so verunsichert, dass ich meine
Finger davon gelassen habe.

group_concat(DISTINCT … SEPARATOR)

<?php // greetings iacta alea est
// Datenbank // Connect to Datenbank $dbs = array( "host"=\>"localhost", "user"=\>"helptheworld", "pass"=\>"password", "db"=\>"helptheworld", "dbi"=\>NULL ); // connect to db or error and die if (!$db=mysql\_connect($dbs['host'],$dbs['user'],$dbs['pass'])) { echo "Kein Datenbank Server"; exit; } else { $dbs["dbi"] = $db; // select database mysql\_select\_db($dbs['db']); // set db to utf-8 communication mysql\_query('SET NAMES \'utf8\''); } // programm anfang // query for test group\_concat DISTINCT SEPARATOR $gsep = ' | '; $query = ".$query; exit; } // output result row count echo ' ' . mysql\_num\_rows($res) . ' Produkt(e) gefunden '; // get all rows while ($row = mysql\_fetch\_array($res,MYSQL\_ASSOC)) { // output echo Produkt : {$row["Produktname"]} Anschluesse : {$row["Anschluesse"]} Drahtlos : {$row["Drahtlose"]} htmlout; } // programm end ?\> output 3 Produkt(e) gefunden Produkt : Power PC Anschluesse : USB | Firewire Drahtlos : WLAN Produkt : Speed PC Anschluesse : USB | eSata Drahtlos : WLAN | Bluetooth Produkt : Speed PC II Anschluesse : USB | Firewire | eSata Drahtlos : WLAN | Bluetooth | Infrarot

Zum x-ten mal Danke für deinen Code :wink: Ich habe ihn soeben gedruckt. Was ist denn von meiner Lösung in Beitrag „Re^9“ zu halten? Ich möchte meine Datenbank später erweitern, z.B. um eine Spalte Produkttyp (PC, Notebook, Tablet etc.).

ProduktID | Produktname | Produkthersteller | Produkttyp

Eine Tabelle mit Monitoreigenschaften (Größe, Auflösung etc.) ist dann natürlich nur für die Produkttypen Notebook und Tablett interessant. Mit einer switch Anweisung in PHP klappt das, wenn man den Ansatz mit den Einzelabfragen verfolgt (siehe „Re^9“), das habe ich bereits getestet.

Naja, für mich wird es wohl Zeit einen Programmierer gegen Bares anzuheuern. Du wohnst nicht zufällig in Wien :wink:

Naja, für mich wird es wohl Zeit einen Programmierer gegen
Bares anzuheuern.

Würd ich dir bei komplexen system auch raten, denn wenn da noch X-Produkte dazu kommen kann die ausführungszeit auf einmal proportional anwachsen zu den daten anwachsen.

Du wohnst nicht zufällig in Wien :wink:

Also wenn du jemanden zum Hände schütteln brauchst , ne ich wohn zum glück nicht in Wien , ich schüttel auch ungerne Hände .

Viel Glück !!! Hat spass gemacht !!!

da du gefragt hast was ich von der lösung halte , sag ich das möglichst objektiv.

Grundsätzlich gibt die mögliche Datenmenge und die damit verbundene Verarbeitungszeit den Optimierungsgrad.

Habe ich keine feste Menge an Daten und viel Zeit , ist jede Lösung eine gute , solange das ergebnis stimmt.

Habe ich eine feste Menge an Daten und Zeit , so sind auch noch langsame Lösungen gut, wenn sie besser dokumentiert ist und damit auch meist besser zu manipulieren ist.

Habe ich keine feste Menge und keine Zeit , so ist maximal die Lösung gut die unter der timeout zeit liegt.

Kommen dann noch X-User dazu , müssen wir auf Speicherplatzverbrauch und Cpu verbrauch und einem DOS achten, was dann immer eine optimale oder keine lösung ergibt.

soll heissen:
Machst du das nur für dein Laden mit 1000 Teile und 100 Kunden wird das wohl jeder heutige Server easy bewerkstelligen , ein MySQL server verträgt schon einige querys.
Willst du aber gleich (wie z.b. facebook) einer halben milliarde usern dann deine 10000 Teile anbieten , wird der Server nur noch querys bearbeiten und kaum noch was an input oder output leisten können.

querys brauchen zeit, denn php schickt an ein programm eine Kommandofolge und wartet auf das Ergebnis . das ist zwar immer noch sehr sehr schnell aber bei einer schleife (wie bei dir) und 10000 produkten braucht das schon einiges an zeit . Das gleiche im Hauptspeicher erledigt mit nur einem querry ist in der summe wesentlich schneller.

fazit : solange es deinen ansprüchen gerecht wird und du die menge der daten im verhältnis zu oben genannten möglichkeiten abschätzen kannst, ist die lösung gut solange du sie begreifst . Es bringt nix einem total optimierten code zu nutzen, wenn man daran dannnix ändern kann, weil man es nicht versteht.

Deto! Deine Hilfe hat mein Verständnis jedenfalls erweitert. Die komplexeren Fragen löse ich dann mithilfe eines Programmieres. Mein Portal ist zwar sehr überschaubar, aber die Datenbank und die zugehörigen Skripte sollen natürlich von Anfang an ordentlich programmiert sein. Das spart früher oder später sicher Ärger.

Achso, „DISTINCT“ heißt das Zauberwort, daher auch die Großschreibung. Nachdem ich sie genau studiert habe, gefällt mir deine Lösung besser als meine :wink: D-A-N-K-E!