Oracle: missing SELECT keyword bei einem Insert Versuch

Gray

Erfahrenes Mitglied
Code:
PHP:
$query = "INSERT INTO GN_SES (UID, SES, TIMESTAMP) VALUES ('$admin[admin_id]', '$session', '$timestamp')";
$result = ociparse($db, $query);
ociexecute($result);

Ich bekomme beim ausführen immer die Fehlermeldung:

Code:
Warning: ociexecute() [function.ociexecute]: ORA-00928: missing SELECT keyword in /home/www/web1/html/index.php on line 37

kann mir diese aber nicht erklären.
 
Du solltest das lieber so verwenden:
PHP:
$query = "INSERT INTO GN_SES (UID, SES, TIMESTAMP) VALUES ('".$admin["admin_id"]."', '".$session."', '".$timestamp."')";

Grade bei admin_id hast du auf eine Konstante zugegriffen!
 
Ich konnts wie folgt lösen:
PHP:
$query = "insert into GN_SES values (GN_SES_S1.nextval,'$admin[ADMIN_ID]','$session','$timestamp')";

aber ich habe ein neues Problem, und zwar mit einem delete,
Code:
PHP:
$query = "DELETE FROM GN_SES WHERE UID = '$admin[ADMIN_ID]'";
$result = ociparse($db, $query);
ociexecute($result);

allerdings wird nichts gelöscht aber es kommt auch keine Fehlermeldung oder ähnliches.
 
Zunächst solltest du dir mal den Artikel zum Thema "Bind Variablen" zu Gemüte führen.
http://www.oracle.com/technology/pub/articles/oracle_php_cookbook/ullman_bindings.html

Bind Variablen sind zwar ein wenig mehr Schreibarbeit für den Entwickler, für die Datenbank aber ein Absolutes Muss für performante und skalierbare Anwendungen. Ausserdem vermeidest du so ganz leicht SQL Injection.

Als zweites wäre ich mit Spaltenbezeichnungen wir "TIMESTAMP" vorsichtig. Solche Wörter sind immer Kandidaten für reservierte Schlüsselwörter. Schau mal in die View V$RESERVED_WORDS. Da stehen eine ganze Menge Schlüsselwörter die man nicht als Spalten- oder Tabellenbezeichner bzw. als Variablen in PL/SQL nutzen sollte.
 
Timestamp ist frei da hab ich schon nachgeschaut.

Ich habs auch so versucht:
PHP:
$result = oci_parse ($db, "DELETE FROM GN_SES WHERE UID = :O_ID");
oci_bind_by_name($result, O_ID, $admin[ADMIN_ID]);
ociexecute($result);

Das Ergebnis ist allerdings das gleiche.
Wenn ich aber einen Delete ohne Where mache, dan löscht er brav alle Datensätze.
 
Ich hab es rausgefunden, das Problem war das UID ein Number Feld ist und somit bei der Abfrage in doppelten Anführunszeichen stehen muss.

also so:
PHP:
$result = oci_parse ($db, 'DELETE FROM GN_SES WHERE "UID" = :O_ID');
oci_bind_by_name($result, O_ID, $admin[ADMIN_ID]);
ociexecute($result);
 
Zurück