<?php
//Testdaten
$filename2 = 'test.txt';
$_SESSION['id'] = 1;
// *** Hier startet der eigentliche Code ***
//Definitionen
$keysFields = array('pic_id', 'id');
$args = array('pic_id' => $pic_id, 'id' => $_SESSION['id'], 'thumbnail' => "'{$filename2}'");
//Erstellen des SQLs
$sql = createInsertOrUpdate('picture', $keysFields, $args);
//Ausgabe für den Test
echo $sql;
// *** Hier endet der eigentliche Code ***
/**
* @name createInsertOrUpdate
* Erstellt ein SQL-Statement für das Muster 'INSERT INTO .. ON DUPLICATE KEY UPDATE'
* @param $tableName String Name der Tabelle
* @param $keysFields Array<String> Array mt allen Feldnamen des PrimaryKey
* @param $args Array<String=>String> Array mit allen Feldern und Werten: Feldname als Key, Value in SQL-Format
* @param $suppressEmptyFields Boolean Flag ob False-Values unterdrückt werden sollten
* @return String SQL-Statement
*/
function createInsertOrUpdate($tableName, $keysFields, $args, $suppressEmptyFields = true){
//ggf False-Values unterdrücken und nicht ins SQL-Statement aufnehmen
if($suppressEmptyFields) $args = array_filter($args);
// Alle Felder die nicht zum Key gehören auslesen
$updateFields = array_diff_key($args, array_flip($keysFields));
// Für all diese Felder ein SQL-Update-String zusammenstellen: Feldname3 = Value3
foreach($updateFields as $fieldName => $fieldValue){
$sqlUpdateStrings[] = "{$fieldName} = {$fieldValue}";
}
// SQL-String für die Feldliste des Insert-Teils erstellen: Feldname1, Feldname2, Feldname3
$sqlInsertFieldsList = implode(', ', array_keys($args));
// SQL-String für die Feldliste des Value-Teils erstellen: Value1, Value2, Value3
$sqlInsertValuesList = implode(', ', $args);
// SQL-String für die Feldliste des UPDATE-Teils erstellen: Feldname3 = Value3, Feldname4 = Value4
$sqlUpdateList = implode(', ', $sqlUpdateStrings);
//SQL-String zusammensetzen und zurückgeben
return "INSERT INTO {$tableName} ({$sqlInsertFieldsList}) VALUES ({$sqlInsertValuesList}) ON DUPLICATE KEY UPDATE {$sqlUpdateList}";
}
?>