Das erzeugt die Fehlermeldung:
ERROR: invalid byte sequence for encoding “UTF8”: 0xe46e64 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by “client_encoding”.
Ich würde es ja verstehen wenn in den Variablen noch Sonderzeichen
vorkommen würden… aber das sind nur Zahlen und Standartbuchstaben ohne Sonderzeichen und Umlaute
Die Vairable $action_log Setzte ich vorher Statisch im Script wo ich die Funktion ausführe (z.B.: $action_log = “LogIn” .
Die Tabelle “Logger” erstelle ich mit folgendem Befehl:
CREATE TABLE "German"."Logger"
(
"UserID" bigint NOT NULL DEFAULT nextval('"German"."Logger_UserID_seq"'::regclass),
"Aktion" character varying(30) NOT NULL,
"Zeit" bigint[] NOT NULL,
CONSTRAINT "Logger_pkey" PRIMARY KEY ("Zeit", "UserID", "Aktion"),
CONSTRAINT "Logger_UserID_fkey" FOREIGN KEY ("UserID")
REFERENCES "German"."User" ("UserID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE "German"."Logger" OWNER TO postgres;
COMMENT ON TABLE "German"."Logger" IS 'Logdatei';
So. Wenn ich die Funktion jetzt in einem anderen Php-Script ausführe;
dann bekomme ich die Fehlermeldung:
Abfrage fehlgeschlagen: ERROR: array value must start with “{” or dimension information
Jetzt wäre dann die Frage woran das liegt und wie man das behebt.
Was hast Du geraucht, um einen Zeitstempel (timestamp) als bigint zu sehen? Mach daraus einen timestamptz default now(), denn Du willst doch den Zeitpunkt des Eintrages speichern, oder? Im Insert kannst Du dann auch diese Spalte weglassen. Die Fehlermeldung mit dem Array-Dingens da kommt übrigens aus diesem bigint-Murks. Vermutlich zumindest.
Also das Format von “UserID” habe ich jetzt geändert auf character varying. bigint habe ich da genommen weil ich ja nur ne Zahl da rein haben will. das geht so max bis 200.
Habe danach getestet, bekamm die selbe Fehlermeldung.
Allerdings habe ich dasmit dem timestamptz default now() noch nicht so wirklich verstanden.
Also wofür ich das setzen soll. Ist das ein Datentyp für eine Spalte?
da ich das alles mit pgAdmin mache habe ich da mal geschaut.
den Typ gibt es da so ja nicht, richtig?
Vom Prinzip her ist es doch so, das ich eine Zahl (Unix-Timestamp) in der Datenbank hinterlegen möchte.
Formatierung und alles andere wollte ich via Php machen. Oder geht das so nicht!?
Das hatte ich auch nicht kritisiert. Ein int wäre gut geeignet.
Allerdings habe ich dasmit dem timestamptz default now() noch nicht so wirklich verstanden.
Also wofür ich das setzen soll. Ist das ein Datentyp für eine Spalte?
e-xakt.
da ich das alles mit pgAdmin mache habe ich da mal geschaut.
den Typ gibt es da so ja nicht, richtig?
ich nix GUI.
Vom Prinzip her ist es doch so, das ich eine Zahl (Unix-Timestamp) in der Datenbank hinterlegen möchte.
Formatierung und alles andere wollte ich via Php machen. Oder geht das so nicht!?
Du kannst gern so nützliche Dinge wie geschnittenes Brot oder anderes erneut erfinden, aber warum?
Ein timestamptz als Datentyp hat den Charme, daß die DB auch weiß, um was es sich da handelt. Da gibt es dann als Dankeschön auch Funktionen der DB, um das dann als z.B. hybsch aussehende Zeit auszugeben, oder mit den Zeiten zu rechnen, oder auch daß man sich auf korrektes Handling von Zeitzone, Sommer/Winterzeit etc. verlassen kann.
Merke: verwende passende Datentypen. Das Kapitel in der Doku, welches die verfügbaren Datentypen erklärt, sollte mit als erstes gelesen werden.
da ich das alles mit pgAdmin mache habe ich da mal geschaut.
den Typ gibt es da so ja nicht, richtig?
Im pgAdmin gibts alle postgreSQL-Datentypen, also auch den datentyp timestamp und timestamptz (und timestamp und timestamptz)
Nachtrag 2:
ERROR: array value must start with “{” or dimension information
‘bigint’ bezeichnet im Gegensatz zu ‘bigint’ einen ARRAY OF BIGINTS.
Wenn Du also tatsächlich einen Unix-Timestap speichern möchtest (wofür es keinen vernünftigen Grund gibt (siehe Andreas), besser ist timestamptz), dann würde der Datentyp bigint (int8) (OHNE ) vollkommen ausreichen.
gleiches gilt überigens für alle datentypen:
datentyp = ARRAY OF DATENTYP
Das ist der ursächliche Grund für deine Fehlermeldung …
Yo, ebenfalls nicht zu vergessen, dass Unix-Timestamps so toll zur Lesbarkeit der Sache beitragen und die Selektion von n paar auf die schnelle Daten so massiv vereinfachen …
CREATE TABLE “German”.“Logger”
(
“UserID” bigint NOT NULL DEFAULT nextval(‘“German”.“Logger_UserID_seq”’::regclass),
…
CONSTRAINT “Logger_pkey” PRIMARY KEY (“Zeit”, “UserID”, “Aktion”),
CONSTRAINT “Logger_UserID_fkey” FOREIGN KEY (“UserID”)
REFERENCES “German”.“User” (“UserID”) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE “German”.“Logger” OWNER TO postgres;
COMMENT ON TABLE “German”.“Logger” IS ‘Logdatei’;
hmm, bis grade dachte ich ja, deine Absichten zu durchschauen, aber jetzt stolpere ich ein wenig über die sequence Logger_UserID_seq:
ich dachte, du wolltest wissen, welcher User sich anmeldet, resp events im System im allgemeinen loggen …
Aber wozu soll die sequence bei UserID denn dann konkret dienen?