2012-04-14 5 views
0

Ich habe eine Tabelle Benennung related_products,Unset spezifischer Wert in einem Array auf MySQL-Tabelle

Wo products_id das Hauptprodukt ist.

und related_products_ids bestehen aus Produkt-IDs bezogen auf das Hauptprodukt.

-------------------------------------------- 
| products_id | related_products_ids | 
| ----------------------------------------- 
| 1   | 2,3     | 
| ----------------------------------------- 
| 2   | 1,3     | 
| ----------------------------------------- 
| 3   | 1,2     | 
------------------------------------------- 

I Kontrollkästchen haben,

<input value="1" type="checkbox" name="rp_product[]" id="in-category1"> Microsoft IntelliMouse Pro 1 
<input value="2" type="checkbox" name="rp_product[]" id="in-category2"> Microsoft IntelliMouse Pro 2 
<input value="3" type="checkbox" name="rp_product[]" id="in-category3"> Microsoft IntelliMouse Pro 3 

Die Kontrollkästchen von PHP generiert werden,

<?php 
    echo '<div class="categorydiv"><div id="category-all" class="tabs-panel"><ul id="categorychecklist" class="list:category categorychecklist form-no-clear">'; 
     $rp_sql = "select products_id, products_name from ".TABLE_PRODUCTS_DESCRIPTION." order by products_id"; 
     $rp_1 = mysql_query($rp_sql); 
      while($rp_2 = mysql_fetch_array($rp_1)) { 
      echo "<li id=\"category-".$rp_2['products_id']."\" class=\"popular-category\"><label class=\"selectit\"><input value=\"".$rp_2['products_id']."\" type=\"checkbox\" name=\"rp_product[]\" id=\"in-category-1\"> ".$rp_2['products_name']."</label></li>"; 
      } 
    mysql_free_result($rp_1); 
    echo '</ul></div></div>'; 
    ?> 

Und ich diesen Code verwenden die überprüften Kontrollkästchen, um die related_products Tabelle zu speichern,

for ($i=0; $i<count($_POST['rp_product']); $i++) 
{ 
    $check_val1 .= $_POST['rp_product'][$i] .","; //gather data 
} 
$check_val = trim($check_val1, ','); //clean last , 
unset($check_val1); //flush 

$related_products = array('products_id' => (int)$products_id, 
         'related_products_ids' => $check_val); 

$insert_rp_ids1 = explode(',', $check_val); 

    foreach($insert_rp_ids1 as $rp_ids) 
    { 
    $result_rp = mysql_query("SELECT related_products_ids, products_id FROM ".TABLE_RELATED_PRODUCTS." where products_id = '" . $rp_ids ."'"); 

    if(mysql_num_rows($result_rp)) 
    { 
     $related_products_value = mysql_fetch_assoc($result_rp); 
     $check_dup = explode(',', $related_products_value['related_products_ids']); 
     $rp_values = $related_products_value['related_products_ids'] . "," . $products_id; 

     $rps_each1 = array('related_products_ids' => $rp_values); 
     if(!in_array($products_id, $check_dup)) { 
     $wpdb->update(TABLE_RELATED_PRODUCTS, $rps_each1, array('products_id' => $rp_ids)); 
     } 
    } 
     else 
      { 
       $rps_each2 = array('products_id' => $rp_ids, 'related_products_ids' => $products_id); 
       $wpdb->insert(TABLE_RELATED_PRODUCTS, $rps_each2); 
      } 
    } 

Was ich will, ist zu unset eine bestimmte ID unter related_products_ids Spalte, wenn die Checkbox vorher abgewählt ausgewählt ist ..

Nehmen wir im die Post Bearbeitung wo die ID 2 ist und wo die related_products_ids davon 1,3 .. Ich abgewählt das Kontrollkästchen, wo der Wert ist 3 (die auf der related_products_ids ist) und nach dem Drücken der Schaltfläche Speichern wird der Wert 3 auf der related_products_ids wird nicht festgelegt, so dass der aktuelle Wert jetzt 1 ist. Wie geht das? Ich kann nicht denken und eine Lösung dafür finden.

Bitte helfen.

Antwort

1

Sie müssen Normalisieren Ihre Datenbank. Speichern von kommagetrennten Werten in der Datenbank ist nie eine gute Idee.

Dies ist die Hauptschwierigkeit bei einer solchen nicht normalisierten Datenbank, die wir nicht einfach manipulieren können.

Sie sollten übergeordnete untergeordnete Tabellen zum Speichern verwandter Produkte erstellen, anstatt sie auf diese Weise zu speichern.

+0

Dies ist die Lösung, die ich derzeit kenne .. können Sie mir helfen, eine neue Lösung zu entwickeln, wenn möglich? Vielen Dank. – Ken

+0

@Ken Ändern Sie Ihr Schema so, dass die 'related_product_ids'-Spalten nur einen Wert speichern (Sie sollten auch den Spaltennamen ändern), so dass jede Zeile eine Beziehung darstellt (z. B. 1-2, 1-3 usw.). Sie sollten überlegen, ob Sie 1-2 und 2-1 getrennt speichern müssen (dies hängt von Ihrer Domänenlogik ab). – liquorvicar