Alexander (HH): Problem mit Prepared Statement bei Postgres

Beitrag lesen

Moin Moin!

Hallo Alexander,

Die andere Hälfte des Problems ist, dass Du PDO::CASE_XXX offenbar nicht kennst. (Am Rande: Perls DBI nennt das FetchHashKeyName.) Damit bekommst Du DB-unabhängig immer Bit für Bit die selben Spaltennamen.

Ich habe das nun mal versucht mit

// Set the case in which to return column_names.
$DBO->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);

Das ist doch dann aber nichts anderes, als wenn ich gleich alle Spaltennamen in Kleinbuchstaben schreibe.

Doch, das ist etwas anderes. Siehe https://forum.selfhtml.org/?t=203232&m=1374020.

So wie ich die paar Doku-Fetzen verstehe, sorgt PDO::CASE_LOWER dafür, dass die bei Fetch zurückgegebenen Spaltennamen in Kleinbuchstaben umgesetzt werden. Daraus folgt, dass $foundroot['mydirectorypath'] existieren sollte, $foundroot['MyDirectoryPath'] aber nicht. Exakt das passiert jedenfalls, wenn ich FetchHashKeyName beim DBI auf 'NAME_lc' einstelle.

Und an der Problematik das meine ganzen Indentifier die ich in Groß-Kleinschreibweise habe und diese so nicht verwendet werden könne, ändert dies nichts.

Warum nicht? Du mußt einmal die Namen anpassen, dass läßt sich mit einem brauchbaren Editor in ein paar Minuten erschlagen. Danach kannst Du die Namensprobleme komplett vergessen, auch wenn Du auf die nächsten drei RDBMS umstellst.

Alternativ dazu nutzt Du die PDO-Funktionalität, Objekte einer bestimmte Klasse zu erzeugen. Damit könntest Du entweder eine sehr einfache Klasse bauen, die alle Property-Namen case-insensitiv behandelt (siehe __get/__set/__isset/__unset), oder aber Du baust Dir für Deine Daten mehrere Klassen, die die Daten kapseln und über Methodenaufrufe zur Verfügung stellen. Ersteres erspart Dir Suchen-und-Ersetzen zu dem Preis, dass PHP zur Laufzeit mehr Arbeit hat und Dein System langsamer wird. Bei kleinen Datenmengen wird das nicht weiter stören, bei größeren Datenmengen wirst Du fluchen.

function ...{
...
return $foundroot['MyDirectoryPath'];

geht nicht.

"Geht nicht" kann eine treffende Fehlerbeschreibung für einen Laufroboter sein. Hier, wie auch generell, ist es keine sinnvolle Fehlerbeschreibung.

ich brauche entweder
return $foundroot['mydirectorypath'];

oder aber ich muss überall ein "strtolower()" davor setzen

Warum willst Du die WERTE in lower case umsetzen?

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".