Hi,
ich habe eine Website auf der Daten verwaltet werden.
Angemeldete Benutzer können Datensätze hinzufügen, ändern und löschen.
Ich habe jetzt für diese 3 Möglichkeiten 1 PHP-Skript welches die Anfragen bearbeitet.
Welche Aktion ausgeführt werden soll, welcher Datensatz betroffen ist (id) und in welcher Tabelle übergebe ich als URL-Parameter.
Die Daten übergebe ich als POST. Also z.B. welche Spalte mit welchem Wert belegt werden soll.
Jetzt habe ich ein paar Probleme:
1. Ich weiß nicht welches Format eine Spalte hat, muss das aber bei einem Prepared-Statement wissen.
Meine Lösung ist im Moment ein Assoziatives Array in dem alle Spalten mit entsprechendem Typ stehen ($fieldTypes).
Es ist sehr unwahrscheinlich dass neue Spalten hinzukommen.
Gibt es hierfür eine schönere Lösung?
2. Es wird eine variable Anzahl an Spalten geupdatet.
Meine Lösung ist hier für jede Spalte ein eigenes Update abzuschicken.
Hier stört mich dass ich den Spaltennamen nicht als Parameter über bind() mit angeben kann, sondern jeweils einen neuen Query-String zusammenbauen muss.
Geht das doch irgendwie?
Oder hat jemand eine schönere Lösung?
Hier mein derzeitiger Code, nicht hier dabei ist die Prüfung ob alle nötigen Variablen übergeben wurden und das $fieldTypes-Array.
Falls euch etwas davon helfen sollte mir zu helfen sagt bitte Bescheid.
In $fieldValues stehen die Daten aus $_POST. Das ist so da ich zum Testen diese Daten über URL-Parameter übergeben habe und durch dieses umkopieren nur an einer Stelle zwischen $_POST und json_decode($_GET['values']) wechseln muss.
switch($_GET['action']){
case 'delete':
$stmt = $mysqli->prepare('DELETE FROM '.mysql_real_escape_string($_GET['table']).' WHERE id = ?');
$stmt->bind_param($fieldTypes['id'], $_GET['id']);
$stmt->execute();
$stmt->close();
break;
case 'insert':
$sql = 'INSERT INTO '.mysql_real_escape_string($_GET['table']).' (id) VALUES(?)';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($fieldTypes['id'], $_GET['id']);
$stmt->execute();
$stmt->close();
// Kein Break! Nachdem Datensatz mit entsprechender ID angelegt wurde, werden die einzelnen Felder entsprechend gesetzt
case 'update':
$sqlPre = 'UPDATE '.mysql_real_escape_string($_GET['table']).' SET ';
$sqlPost= ' WHERE id = ?';
// Jedes zu ändernde Feld bekommt ein eigenes Update-Statement
foreach($fieldValues as $key => $value){
if(isset($fieldTypes[$key])){
$sql = $sqlPre.mysql_real_escape_string($key).' = ?'.$sqlPost;
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($fieldTypes[$key].$fieldTypes['id'], $value, $_GET['id']);
$stmt->execute();
$stmt->close();
}
}
break;
default:
throw new Exception('Unbekannte Aktion');
}
Auch über Hinweise zu anderweitigen Fehler freue ich mich.
~dave