Problem mit TimeStamp-Feldern fbird_fetch_assoc

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo zusammen,

nachdem ich nun gelernt habe, wie man Blob's mit den fbird-Funktionen in eine DB schreibt,
sind in diesem Zusammenhang natürlich weitere Daten zu bearbeiten, insbesondere einige TimeStamp's.

Zu Anfang gab es keine Probleme, aber nach einigen Stunden lieferte auf einmal weder
fbird_fetch_assoc noch fbird_fetch_object dieTimeStamp-Strings aus. Die Felder waren
eingach leer.

Dann habe ich EIN EINZIGES mal einen fbird_fetch_object($result, IBASE_UNIXTIME);
abgesetzt und dann natürlich festgestellt, dass Unix-TimeStamp's angezeigt werden.

Das gefiel mir nicht und deshalb habe ich es halt nochmals ohne IBASE_UNIXTIME
probiert und siehe da, alles schien wieder in Ordnung. Die TimeStamp-Strings hatten wieder Daten.

Die Freunde hielt aber nur etwas mehr als 24 Std.

Seit gestern Mittag werden wieder nur leere TimeStamp's angezeigt, alle anderen Daten
kommen wunderbar.

Die Datenbanken, die ich für diese Aufgabenstellung nutze, wurden jungfräulich mit IbEpert angelegt.

Wenn ich auf dieselben Datensätze per PDO oder Pear-Mdb2 zugreife, dann
kommen die TimeStamp's korrekt.

Das Problem ist nur, dass PDO und Mdb2 Probleme mit Blobs haben.

Was kann der Grund dafür sein, dass mit den fbird-Funktionen die TimeStamp-Strings leer sind ???
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo Hamburgo,

wenn Daten im abgefragten Feld vorhanden sind, dann muss auch was angezeigt werden. Kannst du einen PHP-Code-Ausschnitt anzeigen?

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

wenn ich abfrage mit:

Code: Alles auswählen

$result = fbird_query($dbh_DMS,"SELECT * FROM DMS where dms_nr ='".$DmsNr."'");
 
$Record = fbird_fetch_object($result);
 
echo " \$Record<pre>";  print_r($Record);  echo "</pre>";
dann werden die TimeStamp-Felder leer angezeigt.

Wenn ich abfrage mit:

Code: Alles auswählen

$result = fbird_query($dbh_DMS,"SELECT * FROM DMS where dms_nr ='".$DmsNr."'");

$Record = fbird_fetch_object($result, IBASE_UNIXTIME);

echo " \$Record<pre>";  print_r($Record);  echo "</pre>";

dann werden die TimeStamp-Felder mit dem Unix-TimeStamp angezeigt,
was ja bedeutet, dass ein gültiger TimeStamp-Wert im Record steht.

Wandel ich diesen Unix-TimeStamp dann mit:

Code: Alles auswählen

$Date = date("Y-m-d H:i:s", $Date);
in einen String um, dann entpricht dieser auch dem Wert, den mir IbExpert für das Feld
anzeigt bzw. wenn ich denselben Datensatz mit PDO oder Mdb2 abfrage.

Das ist schon sehr merkwürdig.
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

hier zwei "print_r" vom selben Datensatz:

a. ohne "IBASE_UNIXTIME":

Code: Alles auswählen

$Record = fbird_fetch_assoc($result);

TBM.Wd $Record

Array
(
    [rid_links] => 670
    [link_nr] => 20120216.145501.94
    [kurzname] => 
    [pfad] => Import/Sammler/50890000/5247900
    [name] => Sammelueberweisung_16.02.2012-02.csv
    [subjekt_nr] => 
    [quellen_nr] => K64283001.001
    [quelle] => Volksbank
    [kunden_nr] => 
    [kunde] => 
    [objekt_nr] => 50890000
    [objekt] => 
    [projekt_nr] => 5247900
    [projekt] => 
    [mitarbeiter_nr] => 
    [mitarbeiter] => 
    [am] => 
    [periode] => 201202
    [art] => 9
    [typ] => 4
    [seiten] => 0
    [autor_nr] => 0
    [autor] => Otto
    [editdate] => 
    [indate] => 
    [status] => 1
    [um] => 14:54
    [sammler] => 0
    [termin] => 
    [orientierung] => 0
    [name_klein] => 
    [firma_klein] => 
    [bereich] => 1
    [farbe] => 0
    [email] => 0
    [intervall] => 0
    [beleg_nr] => 
    [beleg] => csv
    [auszug_nr] => 
    [lieferanten_nr] => 
    [betrag] => 
    [fibu_druck] => 
    [buchungs_nr] => 
    [scan01] => 
    [scan02] => 
    [scan_bezug] => 
    [auswahl] => 
    [betreff] => 
    [suchen] => 
    [rundschreiben] => 
    [script] => SetLinksImportAuswahl
    [script_user_nr] => M64297001
    [script_user] => Willi
    [leistung_periode] => 
    [gross] => 
    [batch_script] => 
    [batch_date] => 
    [check_script] => 
    [check_user_nr] => 
    [check_user] => 
    [check_date] => 
    [aus_planung] => 
)

b. mit "IBASE_UNIXTIME":

Code: Alles auswählen

$Record = fbird_fetch_assoc($result, IBASE_UNIXTIME);
TBM.Wd $Record

Array
(
    [rid_links] => 670
    [link_nr] => 20120216.145501.94
    [kurzname] => 
    [pfad] => Import/Sammler/50890000/5247900
    [name] => Sammelueberweisung_16.02.2012-02.csv
    [subjekt_nr] => 
    [quellen_nr] => K64283001.001
    [quelle] => Volksbank
    [kunden_nr] => 
    [kunde] => 
    [objekt_nr] => 50890000
    [objekt] => 
    [projekt_nr] => 5247900
    [projekt] => 
    [mitarbeiter_nr] => 
    [mitarbeiter] => 
    [am] => 1329346800
    [periode] => 201202
    [art] => 9
    [typ] => 4
    [seiten] => 0
    [autor_nr] => 0
    [autor] => Otto
    [editdate] => 1615024364
    [indate] => 1329400502
    [status] => 1
    [um] => 14:54
    [sammler] => 0
    [termin] => -1
    [orientierung] => 0
    [name_klein] => 
    [firma_klein] => 
    [bereich] => 1
    [farbe] => 0
    [email] => 0
    [intervall] => 0
    [beleg_nr] => 
    [beleg] => csv
    [auszug_nr] => 
    [lieferanten_nr] => 
    [betrag] => 
    [fibu_druck] => 
    [buchungs_nr] => 
    [scan01] => 
    [scan02] => 
    [scan_bezug] => 
    [auswahl] => 1329400653
    [betreff] => 
    [suchen] => 
    [rundschreiben] => 
    [script] => SetLinksImportAuswahl
    [script_user_nr] => M64297001
    [script_user] => Willi
    [leistung_periode] => 
    [gross] => 
    [batch_script] => 
    [batch_date] => -1
    [check_script] => 
    [check_user_nr] => 
    [check_user] => 
    [check_date] => 
    [aus_planung] => 
)
z.B. die Felder INDATE und EDITDATE sind TimeStamp-Felder, also Feld 24. und 25. von oben.
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Kann ggf. eine fehlende Treiberimplementation sein. In .Net/ODBC funktioniert dies.
Alternativ kannst du den Timestamp bereits per SQL als String formatieren:

https://ib-aid.com/download/docs/firebi ... rsion.html
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo Hamburgo,

welchen Datentyp haben die beiden Felder in deiner Datenbank? Welchen Firebird-Dialekt verwendest du? Vermutlich Dialekt 3.

Vielleicht haben wir einen Fehler im Firebird-Treiber. Aber das bekommen wir schon raus.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

ja, ich verwende Dialekt 3 und CharSet UTF8.

Ich habe allerding keine Ahnung, was das bedeutet. Da habe ich mich noch nie drum gekümmert.

Das Verhalten ist schon komisch.

Die Datenbanken habe ich mit IbExpert erstellt.

Inzwischen habe ich ein Workaround herausgefunden.

Wenn ich mit meinem alten DB-Treiber "Pear / MDB2"" einmal am Script-Anfang einen Select auf eine beliebige Tabelle absetze, völlig egal, ob der Datensatz real existiert oder nicht, dann funktioniert danach alles bestens.

Danach liefern die fbird-Funktionen die TimeStamps wieder korrekt als Strings konvertiert aus.

Was Pear-MDB2 da im Hintergrund macht, weiß ich nicht.

Viele Grüße
Hamburgo
Antworten