HTML and CSS Reference
In-Depth Information
Leider gibt es aber immer noch ein gravierendes Problem. Was, wenn der Benutzer bei-
spielsweise dies als
newNoteText
in eine Textbox eintippt:
'); DROP TABLE notes;
Sie haben es erahnt: Durch diese Eingabe würde neben dem ersten
INSERT
-Statement,
das hier irrelevant ist, ein zweites Stück SQL ausgeführt - in diesem Fall
DROP TABLE
notes;
, das die gesamte
notes
-Tabelle löscht. Die beiden Bindestriche am Ende der
Eingabe sorgen dafür, dass der restliche Text des Statements als Kommentar von SQLite
ignoriert wird.
Wenn die Daten, die Sie in der Datenbank speichern, nicht mit einem Server synchroni-
siert werden, schadet sich der Nutzer damit selbst. Das mag eventuell noch kein Problem
darstellen, was aber, wenn die clientseitigen Daten synchronisiert und serverseitig
weitere Operationen ausgeführt werden?
Prinzipiell sollten Sie daher vom Benutzer erlangte Informationen wie Texte aus Einga-
befeldern nur mithilfe von Platzhaltern in SQL-Statements einfügen. SQLite kann so die
Textdaten automatisch escapen, falls notwendig.
2.7.8 Daten aktualisieren
Um bestehende Daten zu aktualisieren, müssen Sie das
SQL UPDATE
-Statement verwen-
den. Der Gebrauch unterscheidet sich im Wesentlichen nur durch das auszuführende
SQL. Allerdings können wir zum ersten Mal von dem an das
statementSuccessCallback
übergebenen
SQLResult
-Objekt Gebrauch machen, wie
der Kommentar andeuten soll:
var statementSuccessCallback function(t, resultSet){
//resultSet.rowsAffected 1
}
var statementErrorCallback ...
db.transaction(function(t){
t.executeSql('UPDATE notes set note ?, date CURRENT TIMESTAMP WHERE
id ?;', [newNoteText, selected], statementSuccessCallback,
statementErrorCallback);
});
Innerhalb das
UPDATE SQL
-Statements benutzen Sie nun zwei Platzhalter. Der erste
wird den aktualisierten Text der Notiz enthalten, während der zweite Platzhalter in der
WHERE
-Klausel des SQL-Statements benutzt wird, um eindeutig die zu aktualisierende
Notiz per
id
zu bestimmen. Das Array, der zweite Parameter an die
executeSQL()
-
Methode, enthält nun folglich auch zwei Elemente: den neuen Text sowie die
id
der zu
aktualisierenden Zeile in der Tabelle.
Einen ersten Gebrauch können wir nun auch von dem
resultSet
-Objekt machen.
Eines der Attribute ist
rowsAffected
, das die Anzahl der Tabellenzeilen zurückliefert,
die verändert worden sind (das trifft also nur auf
INSERT
-,
UPDATE
- und
DELETE
-State-
ments zu).