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']);
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:
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'];
}