Probleme mit Query

Hallo alle zusammen!
Ich habe ein Problem mit einem Query.

$query = 'INSERT INTO "German"."Logger" ("UserID","Aktion","Zeit") VALUES (\'' . $_SESSION['user'] . '\',\'' . $action_log . '\',\'' . $time . '\');'; 

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

Laut Tante Google ist da ein ä.

Andreas

sh**
Eins habe ich übersehen! Danke dir!!!

Auch wenn es dumm klingt… aber weis mal wieder nicht weiter. jetzt habe ich zum obrigen code die Fehlermeldung:

ERROR: array value must start with “{” or dimension information

Bitte:

  • etwas liefern, was nachvollziehbar ist. Es ist mühsam, erst einmal zu erraten, welche Sprache Dein Insert ist. SQL ist es nicht. Vielleicht PHP.
  • es ist auch mühsam zu erraten, wie Deine Tabelle aufgebaut ist. Dies ist mir bisher auch noch nicht gelungen.


    Andreas

Ok, hast recht.

Also ich möchte gerne eine ganz einfach Funktion in Php bauen, mit der ich bestimmte Aktionen mitloggen kann.
Das script dazu ist das Folgende:

function timestamp ($action_log)
{
$time= time();
$query ='INSERT INTO "German"."Logger" ("UserID","Aktion","Zeit") VALUES (\'' . $_SESSION['user'] . '\',\'' . $action_log . '\',\'' . $time . '\');';
pg_query($query) or die('Abfrage fehlgeschlagen: ' . pg_last_error()); 
} 

Die Vairable $action_log Setzte ich vorher Statisch im Script wo ich die Funktion ausführe (z.B.: $action_log = “LogIn” :wink: .

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.


Andreas

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.


Andreas

Nur zwei kleine Nachträge:

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 …

Siehe auch
PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: Data Types
PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: Arrays

Abgesehen davon, das ein Unix Timestamp nur bis 2036 funktioniert … und wie lange Provisorien halten, wissen wir alle.

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 …

Ähhm, noch ein Nachtrag

$query > = > ‘INSERT INTO “German”.“Logger” (“UserID”,“Aktion”,“Zeit”) VALUES ('’ > . > $_SESSION> [> ‘user’> ] . > ‘','’ > . > $action_log > . > ‘','’ > . > $time > . > ‘');’> ;



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?

Grüße

jochen

Jo, berechtigte Frage…

Andreas