Oracle: ORA-00936: missing expression bei einem Update

Gray

Erfahrenes Mitglied
Code:
PHP:
if($_POST[speichern]){
	$result = oci_parse ($db, "UPDATE GN_EINSTELLUNGEN SET WERT='$_POST[status]' WHERE OPTION = status");
	ociexecute($result);
	$msg = "Daten wurden erfolgreich gespeichert.";
}

ebenfalls versucht habe ich das hier:
PHP:
	$op = "status";
	$result = oci_parse ($db, "UPDATE GN_EINSTELLUNGEN SET WERT='$_POST[status]' WHERE OPTION = :opt");
	ocibindbyname($result, "opt", $op);
	ociexecute($result);
	$msg = "Daten wurden erfolgreich gespeichert.";

allerdings erhalte ich bei beiden Versionen den Fehler: ORA-00936: missing expression

Wenn ich jedoch den in der Tabelle vorhandenen Primary Key verwende, klappt das Update wunderbar, allerdings ist der beim Update nicht bekannt, weshalb ich den nicht als Wert nehmen kann.
 
SQL:
WHERE OPTION = status
OPTION ist doch keine Spalte, daher der Fehler. Also musst du den Primärschlüssel kennen (dafür ist er da, Identifizierung eines bestimmten Tupels). Wie willst du sonst einen Datensatz identifizieren? Wie kommt es, dass du den PK nicht kennst beim Update? Kannst du den nicht mit übergeben?
 
OPTION ist durchaus eine Spalte, nein OPTION ist nicht reserviert.
Ich könnte zwar den Primary Key am Anfang rausfinden aber das ist meiner Meinung nach sinnlos wenn man auch so ein Update fahren kann, auserdem kann es durchaus sein das mehr als eine Zeile vom Update betroffen ist und da hilft mir der Primary Key nicht mehr wirklich weiter.

status ist ein in der Table bereits eingetragene Wert.
Die Tabelle sieht so aus:
+---+-------------+-----------+
I ID | |OPTION | WERT |
+---+-------------+-----------+
| 3 | status | $vari$ |
+---+-------------+-----------+

und so geht das ebend weiter, und ich muss in dem Fall jetzt auf alle Felder mit der OPTION status das Update machen.
 
Ein Umbennenen der Spalte hat abhilfe geschaft.
Im SQL Developer konnt ich sehen das der Spaltenname immer in Anführungszeichen gesetzt wurde, eventuel kamm daher das Problem.
 
Dein 2. Ansatz ist in jedem Fall besser! Aber auch für den Wert "$_POST[status]" solltest du eine Bindevariable benutzen (IMMER) Also:
SQL:
UPDATE GN_EINSTELLUNGEN SET WERT= :wert WHERE OPTION = :opt;
Das reduziert die Gefahr von SQL Injection beträchtlich. Prinzipiell solltest du keiner Variable trauen, die per $_POST oder $_GET übergeben wird und sie niemals ohne Prüfung in ein SQL Statement einbauen.

Wenn ein User was böses wollte könnte er die $_POST Variable "status" einfach abändern und dann hättest du folgendes SQL Statement
SQL:
UPDATE GN_EINSTELLUNGEN SET WERT='asdkj' -- ' WHERE OPTION = status"
Die Where Klausel wird ignoriert, da für die $_POST Variable der Wert "asdkj' --" übergeben wurde.
 

Neue Beiträge

Zurück