Okay, nu forstår jeg. Jeg havde vist misforstået projektet lidt fra start =)
Jeg ville gå en anden vej. Jeg ville kun indsætte de rækker, der ikke allerede er i databasen - og derefter sende mails ud om dem, der blev indsat.
Det kræver, der i hver række står noget i et af dine XML-items, som er unikt for lige netop dén række. Så vil man nemlig kunne udnytte, at MySQL kaster en fejl 1062, hvis man har et unikt felt i databasen - og man prøver at indsætte noget, der står i forvejen.
Da jeg ikke kender dine data, får du her en mere generisk løsning: Opret et ekstra felt i databasen. Det skal være af typen VARCHAR - have en max-længde på 32 - og sættes til at være unik.
Så kan du prøve med følgende kode:
$arrInfo4Mails = array();
if ($stmt = $mysqli->prepare('INSERT INTO `ad_hoc` (`id`, `subject`, `requester`, `priority`, `deadline`, `status`, `hash`) VALUES (?, ?, ?, ?, ?, ?, ?)')) {
[LOOP_BEGIN]
$hash = md5($cols->item(0)->nodeValue.$cols->item(1)->nodeValue.$cols->item(2)->nodeValue.$cols->item(3)->nodeValue.$cols->item(4)->nodeValue.$cols->item(5)->nodeValue);
$stmt->bind_param('issssss', $cols->item(0)->nodeValue, $cols->item(1)->nodeValue, $cols->item(2)->nodeValue, $cols->item(3)->nodeValue, $cols->item(4)->nodeValue, $cols->item(5)->nodeValue, $hash);
@$stmt->execute();
if ($stmt->errno!=1062) {
if ($stmt->errno!=0) {
die('Der opstod en fejl, som ikke skyldes "duplicate entry". Tjek og ret.');
}
$arrInfo4Mails[] = array($stmt->insert_id, $cols->item(0)->nodeValue, $cols->item(1)->nodeValue, $cols->item(2)->nodeValue, $cols->item(3)->nodeValue, $cols->item(4)->nodeValue, $cols->item(5)->nodeValue);
}
[LOOP_END]
$stmt->close();
} else {
/* Der er opstået en fejl */
echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}
$mysqli->close();
if (count($arrInfo4Mails)>0) {
// Send mails her
var_dump($arrInfo4Mails);
} else {
echo 'Ingen nye rækker.';
}
Jeg danner en md5-hash af alle felternes samlede indhold og forsøger at sætte den ind sammen med de andre data. Hvis denne hash findes i forvejen, vil
execute smide en fejl. Den undertrykker vi dog med et
@ foran kaldet.
Opstår der en fejl 1062, gør vi intet. Gør der ikke det, tjekker vi for andre fejl. Opstod der ikke andre fejl, hælder vi data ned i array'et
$arrInfo4Mails - som til sidst kan bruges til mail-udsendeing.
Ved koden:
// Send mails her
var_dump($arrInfo4Mails);
- kan du selv afgøre, hvilke data du vil have med - og efterfølgende rette linjen, hvor de fyldes i array'et.
Det burde virke =)