Update in foreach-Schleife funktioniert nicht

print147

Grünschnabel
Ich möchte die Spalte art_no updaten. Die Artikelnummer besteht aus einem fixen und einem variablen Teil. Der variable Teil repräsentiert die IDs der Produktoptionen Colors, Sizes und Material.
Echo $upd liefert das gewünschte Ergebnis. Beim Update der MySQL-Tabelle – zu finden im Anhang – wird jedoch immer nur die letzte Artikelnummer gespeichert. Was ist falsch an meinem Code?

Die Funktion generateCodes($arr) kombiniert Colors, Sizes und Material-IDs.
PHP:
function generateCodes($arr) {
    global $returnArray, $tempArray, $pos;
    if(count($arr)) {
        for($i=0; $i<count($arr[0]); $i++)
        {
            $tmp = $arr;
            $tempArray[$pos] = $arr[0][$i];
            $tarr = array_shift($tmp);
            $pos++;
            generateCodes($tmp);
        }
    } else {
        $returnArray[] = strtoupper(join(" ", $tempArray));
    }
    $pos--;
}
$colors = array("red", "green", "blue");
$sizes = array("s","m","l", "xl", "xxl");
$material = array("100%-Baumwolle","Polyester")

$colorsID = array("1", "2", "3");
$sizesID = array("4","5","6", "7", "8");
$materialID = array("9","10");

$valuesID = array($colorsID, $sizesID, $materialID);
$returnArray = array();
$tempArray = array();
$pos = 0;
generateCodes($valuesID);
foreach($returnArray as $key => $item)
{
    $j = explode(" ", $item);
    //$art_no =   '';
    $art_no = '1000-'.$j[0].$j[1].$j[2];

    $upd    =   "   UPDATE kombis SET art_no = \"$art_no\" ";
    $upd    .=  "   WHERE product_id = '1' ";
    echo $upd."<br>";
    $resUpd =   mysql_query($upd) or die(mysql_error());

}
Vielen Dank im voraus!
 

Anhänge

Schau dir das Resultat deines echos nochmals genau an. Jepp. du updatest immer den Datensazt mit der product_id 1.
PHP:
//Hier ist der Fehler. Die 1 durch die richtige ID ersetzen
    $upd    .=  "   WHERE product_id = '1' ";

Nachtrag:
item: Noch etwas zu deinem Script. Die Nummer so zusammensetzen ist nicht wirklich Toll. Wenn du weitere Elemente hast, weisst du nachher nicht mehr ob 1000-12 nun die Id 12 meint oder die Ids 1 & 2.
Du solltest da ein Trennzeichen einbauen oder mit Bit arbeiten.

item: Auch die Globalen Variablen sind 1) nicht nötig und 2) gibts so schnell ein Chaos. Verwende global() nur im Notfall.

item: Du machst join und anschliessend wieder explode. Arbeite einfach mit Arrays bis kurz vor Schluss

Ich würde das ganze so mit Bit-Codierung lösen:
PHP:
//Meine Testdaten -> Simulation der DB
$products[] = array('id' => 1, 'colors' => 'red', 'sizes' => 'S', 'material' => '100%-Baumwolle');
$products[] = array('id' => 2, 'colors' => 'red', 'sizes' => 'S', 'material' => 'Polyester');
$products[] = array('id' => 3, 'colors' => 'red', 'sizes' => 'M', 'material' => '100%-Baumwolle');
$products[] = array('id' => 4, 'colors' => 'red', 'sizes' => 'M', 'material' => 'Polyester');
$products[] = array('id' => 5, 'colors' => 'red', 'sizes' => 'L', 'material' => '100%-Baumwolle');
$products[] = array('id' => 6, 'colors' => 'red', 'sizes' => 'L', 'material' => 'Polyester');
$products[] = array('id' => 7, 'colors' => 'red', 'sizes' => 'XL', 'material' => '100%-Baumwolle');
$products[] = array('id' => 8, 'colors' => 'red', 'sizes' => 'XL', 'material' => 'Polyester');

//Mal ein Test mit Bit-Operationen
//Dabei sind die Ids immer in 2er Potenz aufsteigend. Bekanntes Beipspiel dazu ist
//die Berechtigungseinstellungen mit den Werten 1-7 (1=read, 2=write, 4=execute. 
//Daraus ergibt 3=read&write, 5= read&execute, 6=write&execute und 7 = read&write&execute)

//Die Farben
$colors = array(1 => 'red', 2 => 'green', 4 => 'blue');
//Eine Andere Schreibweise bei den sizes
$sizes[8] = 'S';
$sizes[16] = 'M';
$sizes[32] = 'L';
$sizes[64] = 'XL';
$sizes[128] = 'XXL';
//Und noch die Materialien
$material = array(256 => '100%-Baumwolle', 512 => 'Polyester');

//Alle Produkte durchgehen
foreach($products as $product){
    //Die Bits auslesen und aufsummieren
    $bit=0;    
    $bit = array_search($product['colors'], $colors);
    $bit += array_search($product['sizes'], $sizes);
    $bit += array_search($product['material'], $material);
    //Code zusammensetzen
    $code = "1000-{$bit}";
    //Update-SQL erstellen. Wichtig! WHERE auf die ID
    $sql = "UPDATE kombis SET art_no = '{$code}' WHERE id = {$product['id']};";
    //TODO: ausführen des SQLs
    echo "{$sql}<br />\n";
    //Zum Demonstrieren wie der Bit-Code wieder zerlegt wird gebe ich hier die Argmumente 
    //anhand des Bit-Codes zurück
    echo 'Farbe: ' .  getCodeFromBit($bit, $colors) . "<br />\n";
    echo 'Grösse: ' .  getCodeFromBit($bit, $sizes) . "<br />\n";
    echo 'Material: ' .  getCodeFromBit($bit, $material) . "<br />\n";
    echo "<br />\n";
}

/**
 * Gibt den Code aus der Codeliste zurück, der in $bit enthalten ist
 * @param $bit      Bit-Code der alle ausgewählten Codes enthält
 * @param $codes    Code-Liste.
 * @return          Den Code
 */
function getCodeFromBit($bit, $codes){
    foreach($codes as $codeBit => $value){
        if($bit & $codeBit) return $value;;
    }
    return 'na';
}
Ergibt das folgende
Code:
UPDATE kombis SET art_no = '1000-265' WHERE id = 1;
Farbe: red
Grösse: S
Material: 100%-Baumwolle

UPDATE kombis SET art_no = '1000-521' WHERE id = 2;
Farbe: red
Grösse: S
Material: Polyester

UPDATE kombis SET art_no = '1000-273' WHERE id = 3;
Farbe: red
Grösse: M
Material: 100%-Baumwolle

UPDATE kombis SET art_no = '1000-529' WHERE id = 4;
Farbe: red
Grösse: M
Material: Polyester

UPDATE kombis SET art_no = '1000-289' WHERE id = 5;
Farbe: red
Grösse: L
Material: 100%-Baumwolle

UPDATE kombis SET art_no = '1000-545' WHERE id = 6;
Farbe: red
Grösse: L
Material: Polyester

UPDATE kombis SET art_no = '1000-321' WHERE id = 7;
Farbe: red
Grösse: XL
Material: 100%-Baumwolle

UPDATE kombis SET art_no = '1000-577' WHERE id = 8;
Farbe: red
Grösse: XL
Material: Polyester
 
Zurück