SQL-Ergebnisstring ist unvollständig

Jedimaster

Mitglied
Hallo Forum!

Bei Arbeiten an einer PHP-Applikation bin ich auf ein unerwartetes Problem gestoßen.
Mittels PHP generiere ich über ODBC SQL-Abfragen auf einem Datenbestand:

PHP:
$conn = odbc_connect("DBName",NULL,NULL);
$sql = "SELECT spalte FROM tabelle WHERE id = 'id001'";

$res = odbc_exec($conn, $sql);
$erg = odbc_result($res,1);

echo "<b>Ergebnis = </b>".$erg;
odbc_close_all();

In der Datenbank sind Richt-Text-Felder (mit teilweise über 15000-20000 Zeichen) enthalten. Frage ich ein solches ab, dann erscheint leider nicht der volle Inhalt im Ausgabe-String: Es wird bei 4095 Zeichen (inklusive Blanks) abgeschnitten.

Dieser Umstand scheint imho nicht an der Datenbank zu liegen, denn für meine Tests verwendete ich zwei Anbindungen:

1: MS Excel-ODBC Treiber auf einem Excel-File als Datenbank
2: NotesSQL-Treiber auf einer Lotus Notes Datenbank


Hat jemand einen Rat für mich? Wie kann ich den Fehler beseitigen oder umgehen?

Gruß,
JediMaster
 
Zuletzt bearbeitet:
Hierbei wird es sich sicherlich um ein Datenbanl-spezifisches Problem handeln. Frag doch mal in dem Datenbank-Forum nach, dort wird man dir bestimmt besser helfen können.
 
Die Sache ist, dass wenn ich mit MS-Query die Daten von der NotesDB in ein Excel-Sheet übertrage die Datenfelder vollständig erfasst werden. Aus diesem Grund vermute ich, dass das Problem woanders liegen könnte, denn das zeigt ja, dass zumindest die Source funktioniert. Eventuell könnte der ODBC-Treiber das Problem darstellen, aber ich weiß nicht ob MS-Query damit arbeitet oder ob es etwas spezifischeres benutzt.
 
Das Problem liegt daran, dass odbc_result nur 4095 Byte von einer Zelle zurück gibt.
Soweit ich das noch im Gedächtnis habe, kannst du dies Umgehen indem du
$erg = odbc_result($res,1); in einer Schleife aufrufst und zwar solange bis die Rückgabe " " ist. Er müsste dann immer den nächsten Abschnitt ausgeben.
So habe ich das noch im Gedächtnis. Bevor ich mit MySQL gearbeitet hab, hatte ich auch mal dieses Problem.
Entschuldige wenn es verkehrt ist.
 
Hallo Leutz!

Ich hab das Problem gelöst.

Eine ordnungsgemäße Ausgabe des gesamtes Feldes wird durch Einfügen folgender Codezeile vor odbc_result() erreicht:

PHP:
odbc_longreadlen($res, $length);

Diese Funktion steuert das Auslesen von Spalten mit LONG-Inhalten. Der Integer-Parameter $length gibt die Anzahl Bytes an, welche gelesen werden.


Alternativ gibt es auch die Möglichkeit den Parameter odbc.defaultlrl in der php.ini anzupassen. Er bestimmt die Anzahl Bytes, die aus einem LONG-Feld übergeben werden.
Standardmäßig ist die "long read length" auf 4096 Bytes beschränkt. (Daher die abgeschnittene Ausgabe ab dem 4095. Zeichen)


Gruß,
Jedimaster
 
Ok das kannte ich nicht. Ich habe es mit der Schleife gelöst gehabt; glaube ich zumindest. Naja mit den 4095 Bytes hatte ich es doch noch richtig in Erinnerung.
Aber schön das es nun klappt.
 
Zurück