Stel ik heb een array oudlocaties en een array nieuwlocaties

oudlocaties haal ik op uit een database en is als volgt:
1, 3, 4, 6, 7, 10, 11
nieuwlocaties zijn de aangevinkte checkboxjes met locatie[] en is als volgt:
1, 3, 6, 7, 8, 10, 11

Maar nu de vraag, hoe vergelijk ik oudlocaties met nieuwlocaties? Het moet uiteindelijk een locatie 4 bij oudlocaties verwijderen (DELETE), omdat deze niet bij nieuwlocaties staat en het moet uiteindelijk locatie 8 toevoegen (INSERT INTO) omdat deze bij nieuwlocaties staat en niet bij oud.
Als oudlocaties en nieuwlocaties bestaan, hoeft er niets te gebeuren.

1. Hoe krijg ik een array (genaamd oudlocaties) vanuit een database?
2. Hoe vergelijk ik oudloacties met nieuwlocaties?

Ik heb het volgende gedaan als test, maar krijg niets te zien.
// haal nieuwlocaties op
for ($i = 0; $i < count($_POST['locatie']); $i++) {
$nieuwlocaties = array($_POST['locatie'][$i]);
}

// haal oudlocaties op
$sQueryC = mysql_query("SELECT id, locaties FROM ".TBL_KOPBANNER." WHERE banner = ".$_GET['id']);

while ($objC = mysql_fetch_object($sQueryC)) {
$oudlocaties = array($locaties[$objC->locaties]);
$difflocaties = array_diff($nieuwlocaties, $oudlocaties);
}
print_r($difflocaties);
Hier precies wat jij wil hebben:

<?php

$sql = "SELECT GROUP_CONCAT(locatie SEPARATOR ',' ) AS bijnaarray FROM tabel";
$query = mysql_query($sql);
$fetch = mysql_fetch_assoc($query);

$oudlocaties = explode(',', $fetch['bijnaarray']);
$nieuwlocaties = array(1, 3, 6, 7, 8, 10, 11);

$diff1 = array_diff($oudlocaties, $nieuwlocaties);
$diff2 = array_diff($nieuwlocaties, $oudlocaties);

if (!empty($diff1)) {
mysql_query("DELETE FROM tabel WHERE locatie IN (" .implode(',', $diff1). ")");
}

if (!empty($diff2)) {
foreach ($diff2 as $value) {
mysql_query("INSERT INTO tabel SET locatie = " .$value);
}
}

?>

De query is getest. De vergelijkingen met array_diff() ook. Als je een error krijgt dan zal dat door een domme fout van me komen. Probeer dit maar om te snappen hoe het werkt:

<?php

$oudlocaties = array(1, 3, 4, 6, 7, 10, 11);
$nieuwlocaties = array(1, 3, 6, 7, 8, 10, 11);

$diff1 = array_diff($oudlocaties, $nieuwlocaties);
$diff2 = array_diff($nieuwlocaties, $oudlocaties);

echo '<pre>' . print_r($diff1, true) . '</pre>';
echo '<pre>' . print_r($diff2, true) . '</pre>';

?>

Dit script resulteert namelijk in:

Array
(
    [2] => 4
)

Array
(
    [4] => 8
)



Voor GROUP_CONCAT, zie: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Edit: wat je trouwens ook kunt doen is gewoon alles verwijderen en alles opnieuw INSERT-en. Maar bovenstaande manier is leuker en logischer.
Jah.. je 2e idee over alles verwijderen en opnieuw inserten gebruikte ik.. maar omdat de positie van de locaties ook erbij moeten en behouden moeten is het niet handig om telkens van laagste positie van een locatie ook bij te werken.

Maar helaas werkt het niet.
Ik krijg een error:
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
1140

Mijn code:

$objC = mysql_fetch_object(mysql_query("SELECT id, GROUP_CONCAT(locatie ORDER BY locatie ASC SEPARATOR ',' ) AS loc FROM ".TBL_KOPBANNER." WHERE banner = ".$_GET['id']));
$oudlocaties = explode(',', $objC->loc);
$nieuwlocaties = array($_POST['locatie'][$i]);

$diff1 = array_diff($oudlocaties, $nieuwlocaties);
$diff2 = array_diff($nieuwlocaties, $oudlocaties);

if (!empty($diff1)) {
	echo 'verwijder locaties: '.$diff1.'<br />';
	//mysql_query("DELETE FROM tabel WHERE locatie IN (" .implode(',', $diff1). ")");
}

if (!empty($diff2)) {
	foreach ($diff2 as $value) {
		echo 'update locaties: '.$diff1.'<br />';
		//mysql_query("INSERT INTO tabel SET locatie = " .$value);
	}
}


Ik heb zelf checkboxjes voor nieuwlocaties... ik weet niet of daar de fout ligt, maar het werkt niet..
Zeker een oude versie van MySQL (GROUP_CONCAT is denk ik vanaf MySQL 5)? Tsja, je kunt ook gewoon SELECT * FROM doen, in plaats van GROUP_CONCAT, en dan met een while je array samenstellen.

$query = "SELECT locatie FROM tabel";
$oudlocaties = array();

while (fetchgedoe) {
$oudlocaties[] = $fetch['locatie'];
}

Reageren