Announcement

Collapse
No announcement yet.

Oracle über ADOdb (PHP) abfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle über ADOdb (PHP) abfragen

    Hallo,

    ich möchte eine Oracle 10g ExpressEdition-Datenbank mittels ADOdb abfragen.
    ADOdb (Active Data Objects DataBase) ist eine Sammlung von Datenbank-Abstraktions-Funktionen. (http://phplens.com/phpeverywhere/adodb_german)

    Der Kontakt zur Datenbank funktioniert. Das Problem aber sind die Groß- und Kleinschreibungen in den Tabellen und Abfragen. In der Oracle-Datenbank sind alle Tabellen- und Feldnamen groß geschrieben.

    Der PHP-Code, der die Tabelle abfragt sieht folgendermaßen aus:

    Code:
    $db = db_connect(); 
    
        $sql = "SELECT * FROM intblLaender ORDER BY Land";
        $result = $db->Execute($sql);
    
        while ($row = $result->FetchRow())
        {
          if ($row[Kuerzel] == $_POST['Land'])
          {
            echo "<option selected>$row[Kuerzel]</option>";
          }
          else
          {
            echo "<option>$row[Kuerzel]</option>";      
          }
        }
      
        $db->Close();
    Der Select-Befehl wird ausgeführt, aber die Auswahlliste auf dem Bildschirm enthält keine Daten. Es werden nur leere Einträge in Anzahl der Datensätze angezeigt.

    Ändere ich $row[Kuerzel] in $row[KUERZEL] so funktioniert es. Das würde aber bedeuten, dass ich sämtlichen Code auf diese Großschreibung ändern muss, was ich nicht möchte, da dieser Code bereits mit einer MySQL und MS-SQL Datenbank wunderbar arbeitet.

    Daher habe ich mir gedacht, dass ich die Schreibweise in der Oracle-Tabelle ändere, was diese auch zuläßt.

    Ändere ich nur das Feld KUERZEL in Kuerzel, so funktioniert es ebenfalls wie gewünscht.

    Ändere ich aber auch die zweite Spalte LAND in Land, so bricht die Execute-Anweisung mit 'Fatal error: Call to a member function FetchRow() on a non-object' ab.

    Hintergrund ist wohl, dass der an die Datenbank gesendete Befehl von ADOdb (oder Oracle) in Großbuchstaben umgewandelt wird, und Oracle dadurch die nun kleingeschriebenen Fednamen nicht findet. Die direkte SQL-Eingabe in der Datenbank verhält sich genauso, d.h. auch hier wird ein kleingeschriebener Feldname nicht erkannt.

    Weiß jemand Rat, wie ich der Oracle-DB sagen kann, dass diese auf Groß- und Kleinschreibung achten soll?

    Vielleicht kann man hierzu ja auch was in der ADOdb einstellen?

    Ich hoffe, es hat jemand eine Lösung hierfür oder einen Denkansatz.

    Gruß

    LaMi

  • #2
    Hallo,

    auf das explizite setzen von Groß- oder Kleingeschriebenen Feldnamen würde ich in der DB verzichten! Das bringt mehr Probleme als Nutzen. Selektiere dagegen die Felder explizit und setze ggfs. entsprechende Aliasnamen, um unabhängig von DB-Eigenheiten zu sein.

    PHP Code:
    ...
    $sql 'SELECT kuerzel "Kuerzel", land "Land" FROM intblLaender ORDER BY Land';
    ... 
    Auch solltest du auf ein spezielles Fed eines assoziatives Array mit einem expliziten Wert zugreifen und dies nicht implizit von PHP erledigen lassen.
    Die Verwendung von $row[Kuerzel] statt $row['Kuerzel'] hat sehr unschöne Nebeneffekte, wenn irgendwannmal eine Konstante Kuerzel (z.B. define('Kuerzel', 'FP'); ) angelegt wird.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Originally posted by LaMi View Post
      Das würde aber bedeuten, dass ich sämtlichen Code auf diese Großschreibung ändern muss, was ich nicht möchte, da dieser Code bereits mit einer MySQL und MS-SQL Datenbank wunderbar arbeitet.
      Mann kann MS-SQL (evtl auch MySQL) so einrichten/konfigurieren das auch dort dein bisheriger Code nicht mehr funktioniert.

      Ich denke du wirst bei jeder DB das einstellen können (vermutlich angepaßte CREATE TABLE-Anweisungen) um das zu vermeiden. Details kann ich dir nicht mitteilen da unsere Apps entsprechend die Feldnamen beim zusammenbau der Queries umwandeln.

      Comment


      • #4
        Hallo,

        erstmal vielen Dank für Eure Antworten.

        Ich habe noch was Neues herausgefunden:
        Wenn ich in Oracle die Feldnamen in meine gewünschte Form bringe (Kuerzel, Land) habe ich mit dem folgenden SQL-Statement den Erfolg diese auch abzufragen:

        PHP Code:
        $sql 'SELECT * FROM intblLaender ORDER BY "Land" '
        Auch die direkte Eingabe des SQL-Command's in Oracle führt nun zum Erfolg. Es scheint also direkt an Oracle zu liegen, wie die Feldnamen interpretiert werden. Wäre schön wenn es hierzu einen Schalter gibt, der dieses Verhalten beinflußt. Hat jemenad eine Ahnung ob es einen solchen gibt ???

        Leider versteht nun die MySQL-Datenbank den SQL-Befehl nicht mehr.

        Ich denke es wäre nun notwendig die " z.B. durch ein | zu ersetzen und dann bei der Verarbeitung des SQL-Befehls dieses Zeichen in Abhängigkeit der angesprochenen Datenbank zu löschen oder durch ein " zu ersetzen.

        @Falk:
        Wenn ich deine vorgeschlagene SQL-Zeile so eingebe
        PHP Code:
        $sql 'SELECT KUERZEL "Kuerzel", LAND "Land" FROM intblLaender ORDER BY LAND'
        funktioniert es auch mit den großgeschriebenen Feldnamen.

        Dein zweiter Hinweis auf die Verwendung von $row['Kuerzel'] habe ich ausprobiert, bringt mir aber die folgende Meldung:
        Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
        Das hängt wahrscheinlich mit der umgebenden echo-Anweisung zusammen.

        Gruß

        LaMi

        Comment


        • #5
          Originally posted by LaMi View Post
          ...Es scheint also direkt an Oracle zu liegen, wie die Feldnamen interpretiert werden. Wäre schön wenn es hierzu einen Schalter gibt, der dieses Verhalten beinflußt. Hat jemenad eine Ahnung ob es einen solchen gibt ???...
          Das liegt nur daran, wie du die Tabellen in Oracle anlegst!
          [highlight=sql]
          create table test (
          feld1 varchar2(128));
          [/highlight]
          Der Feldname wird hierbei im Data Dictionary mit FELD1 gespeichert.
          Die Tabelle kannst du problemlos mit:
          [highlight=sql]
          select feld1 from test;
          ...
          select Feld1 from test;
          ...
          select FELD1 from test;
          [/highlight]
          abfragen.
          Erzeugst du die Tabelle dagegen mit einem expliziten Feldnamen
          [highlight=sql]
          create table test (
          "Feld1" varchar2(128));
          [/highlight]
          dann wird der Name auch als Feld1 im DD abgelegt und du kannst diese Tabelle auch nur mit
          [highlight=sql]
          select "Feld1" from test;
          [/highlight]
          abfragen. Das gleiche gilt natürlich auch für Tabellennamen und die Namen anderer Objekte.

          Originally posted by LaMi View Post
          ...
          Leider versteht nun die MySQL-Datenbank den SQL-Befehl nicht mehr.

          Ich denke es wäre nun notwendig die " z.B. durch ein | zu ersetzen und dann bei der Verarbeitung des SQL-Befehls dieses Zeichen in Abhängigkeit der angesprochenen Datenbank zu löschen oder durch ein " zu ersetzen.
          Sorry, aber das ist doch alles Murks. Du versuchst hier mit einer Krücke die andere zu stützen. Vergiß die explizit groß und klein geschriebenen Feldnamen in der DB und schreibe saubere Abfragen wie ich das bereits vorgeschlagen habe.
          Entschuldige wenn ich das so drastisch sage, aber jeder der mir eine Anwendung anbringt die in der DB Feldnamen in expliziter Schreibweise voraussetzt, damit die Anzeige stimmt, den würde ich fragen wofür er sein Geld haben möchte! Jeder DB-Admin wird dich hassen und dir sonstwas an den Hals wünschen!

          Originally posted by LaMi View Post
          ...
          Dein zweiter Hinweis auf die Verwendung von $row['Kuerzel'] habe ich ausprobiert, bringt mir aber die folgende Meldung:
          Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
          Das hängt wahrscheinlich mit der umgebenden echo-Anweisung zusammen.
          Wenn du das Array direkt in einem String verwenden willst, dann mußt du die Variable in {} schreiben:
          PHP Code:
          echo "<option>{$row['Kuerzel]'}</option>"
          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk,

            danke für Deine Antworten.

            Das mit der "Krücke" für die "Krücke" widerstrebt mir natürlich auch, aber die Anwendung läuft nun mal schon auf MySQL und MS-SQL.

            Das es mit den expliziten Feldnamen Probleme geben wird, habe ich bei den Überlegungen zum Entwicklungsstart wohl nicht genau bedacht
            Damals ging es auch nur um MySQL. MS-SQL und Oracle sind erst im Laufe der Zeit noch hinzu gekommen.

            Ich denke, ich werde das bei einem kompletten Update der Anwendung nochmal erneut berücksichtigen müssen und dann auch die MySQL und MS-SQL Feldnamen so ändern, dass diese dann nicht mehr explizit sind.

            Hierzu habe ich schon herausgefunden, dass dies unter Oracle mit
            Code:
            ALTER TABLE tabellenname RENAME COLUMN alterfeldname TO neuerfeldname
            und unter MySQL mit
            Code:
            ALTER TABLE tabellenname CHANGE alterfeldname neuerfeldname feldtyp
            funktionieren wird.

            Nur leider bei MS-SQL finde ich nix. Der Befehl
            Code:
            ALTER TABLE tabellenname ALTER COLUMN alterfeldname TO neuerfeldname
            funktioniert so nicht.

            Kannst Du - oder jemand anders - mir hierzu nochmal einen Input geben, wie der Richtige SQL-Befehl bei MS-SQL aussieht.

            Gruß

            LaMi

            P.S.: Das mit den {}-Klammern war mir wohl kurzzeitig entfallen. Danke auch für diesen Hinweis.

            Comment


            • #7
              Hallo LaMi,
              Originally posted by LaMi View Post
              Nur leider bei MS-SQL finde ich nix. Der Befehl
              Code:
              ALTER TABLE tabellenname ALTER COLUMN alterfeldname TO neuerfeldname
              funktioniert so nicht.

              Kannst Du - oder jemand anders - mir hierzu nochmal einen Input geben, wie der Richtige SQL-Befehl bei MS-SQL aussieht.
              MS-SQL ist nicht meine Stärke aber das "Umbenennen" von Spalten gehört wohl nicht zum SQL-Standard (warum auch?). Du wirst also ggfs. nicht umhin kommen, eine Variante nach althergebrachtem Schema - Temptabelle anlegen - Constraints deaktivieren - Daten kopieren - Tabelle löschen - Tabelle neu anlegen - Daten zurückkopieren - Constraints wieder aktivieren- vorzusehen.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment

              Working...
              X