Garry Weber: Prüfung ob eine Spalte in MySQL Tabelle vorhanden ist

Hallo,

hab ein Problem. Ich will, dass PHP auswertet, ob eine Spalte mit dem Namen name_spalt vorhanden ist. Ich habe überhaupt keinen Ansatz, welche Rückmeldung ich ausnutzen muss. Kann mir jemand helfen?

Daniel

  1. Hey,

    versuchs mal so:

      
    $sql = "SELECT * FROM datenbankname WHERE name='name_spalt'";  
    $result = mysql_query($sql);  
    $zahl = mysql_num_rows($result); // zählt die zeilen  
      
    if ($zahl < 1) {  
       echo "nicht vorhanden";  
    }  
    
    

    Du rufst praktisch die Zeilen mit dem namen name_spalt auf und zählst sie mit mysql_num_rows(). Wenn die Zahl dann 0 ist sind keine vorhanden.

    1. Nabend,

      ich denke, es geht eher in Richtung
      SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      ?

      Gruß,
      Manu

      1. Sorry, hab schrott erzählt, so müßte es gehen:

        SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE\_SCHEMA = 'deine_db' and TABLE\_NAME = 'deine_table'

        Gruß,
        Manu

        1. hi Manu,

          Sorry, hab schrott erzählt, so müßte es gehen:

          SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE\_SCHEMA = 'deine_db' and TABLE\_NAME = 'deine_table'

          Da hat sich jetzt aber nicht wesentliches geändert. Op sucht einen Errorhandler.

          Grüße aus H im R an Manu,
          Primus Enginus

  2. Hi,

    wenn Du ein nicht vorhandenes Feld abfragst bekommst Du normalerweise die Meldung:
    Unknown column 'data_field' in 'field list'

    mit php kannst Du eine eventuelle Fehlermeldung so bekommen: mysql_error();
    so dann die Fehler nummer: mysql_errno();

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
  3. Hello,

    hab ein Problem. Ich will, dass PHP auswertet, ob eine Spalte mit dem Namen name_spalt vorhanden ist. Ich habe überhaupt keinen Ansatz, welche Rückmeldung ich ausnutzen muss. Kann mir jemand helfen?

    Erstmal kannst Du das vorher abfragen:

    SHOW COLUMNS from $tablename

    liefert Dir ein Resultset mit den Spalten

    - Field
      - Type
      - Null
      - Key
      - Default
      - Extra

    Du willst nun wissen, ob in der Spalte "Field" dein gesuchter Feldname steht.

    Dazu musst Du dann nur in üblicher Weise das Resultset auslesen

    $_tablespecs = array();   ## alle Properties aller Felder der Tabelle
      $_record = array();       ## Zwischenpuffer für die Abfrage

    while($_record = mysql_fetch_assoc($res))
      {
          $_tablespecs[$_record['Field']] = $_record;
      }

    Nun brauchst Du nur noch nachzufragen, ob der Schlüsselwert vorhanden ist

    if (isset($_tablespecs[$feldname]))
      {
          ## Feld ist vorhanden
      }

    Liebe Grüße

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    1. Hallo Tom,

      hab ein Problem. Ich will, dass PHP auswertet, ob eine Spalte mit dem Namen name_spalt vorhanden ist. Ich habe überhaupt keinen Ansatz, welche Rückmeldung ich ausnutzen muss. Kann mir jemand helfen?

      Erstmal kannst Du das vorher abfragen:

      SHOW COLUMNS from $tablename

      und warum nicht

        
          SHOW COLUMNS  
          FROM  
              tabellenname  
          LIKE  
              'spaltenname'  
      
      

      oder dem Äquivalent in INFORMATION_SCHEMA, Tabelle COLUMNS, auf die schon Manu hinwies.

      Das ist doch viel einfacher.
      Es reicht die Anzahl der zurückgegebenen Datensätze zu überprüfen, vorausgesetzt die Tabelle existiert. Deswegen wäre

        
          SELECT  
              COLUMN_NAME  
          FROM  
              INFORMATION_SCHEMA.COLUMNS  
          WHERE  
              table_name = 'tabellenname'  
          AND  
              table_schema = 'db_name'  
          AND  
              column_name LIKE 'spaltenname'
      

      zu bevorzugen.

      Freundliche Grüße

      Vinzenz

      1. Hello Vinzenz,

        und warum nicht

        [...]

        Jetzt, wo Du es schreibst...
        Kein Einwand, wenn INFORMATION_SCHEMA vorhanden ist.
        Das ist aber erst bei MySQL ab ? der Fall und in der XAMPP-Version ist es auch nicht zu finden. Oder bin ich schon wieder blind?

        SHOW COLUMNS
            FROM
                tabellenname
            LIKE
                'spaltenname'

        gefällt mir dagegen sehr gut, weil es in allen mir bekannten MySQL-Versionen funktioniert und außerdem auch keine Probleme mit Case-Sensitivity hat. Es wird also die Spalte gefunden, egal ob man sie klein oder gross oder sonstwie schreibt. Das wäre mit der PHP-Abfrage über den Array-Key schon wieder lästige Denkarbeit.

        Liebe Grüße

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        1. Hallo

          Jetzt, wo Du es schreibst...
          Kein Einwand, wenn INFORMATION_SCHEMA vorhanden ist.
          Das ist aber erst bei MySQL ab ? der Fall und in der XAMPP-Version ist es auch nicht zu finden. Oder bin ich schon wieder blind?

          INFORMATION_SCHEMA gibt es in MySQL ab Version 5.0. Da MySQL 4.x nicht mehr unterstützt wird, gehe ich bei Nichtangabe einer Versionsnummer von der derzeit aktuellen Produktivversion von MySQL aus, das ist zur Zeit 5.0.x.
          Von 5.1 existiert erst ein Release Candidate, vom Produktiveinsatz der 5.1 rät MySQL derzeit noch ab.

          Vom Einsatz einer MySQL-Version älter als 5.0.12 rate ich insbesondere wegen der katastrophal fehlerhaften JOIN-Implementierung ab. Ältere MySQL-Versionen sind ein Grund für einen Providerwechsel, wobei das Upgrade der eigenen Anwendungen genau geplant sein will. Anwendungsneuentwicklung unter Berücksichtigung älterer Versionen als MySQL 5.0.12 halte ich für unsinnig (es sei denn, es wäre entsprechend lukrativ).

          Selbstverständlich sollte INFORMATION_SCHEMA in XAMPP enthalten sein. Ich kann's nicht überprüfen, weil ich XAMPP nicht nutze.

          SHOW COLUMNS
              FROM
                  tabellenname
              LIKE
                  'spaltenname'

          gefällt mir dagegen sehr gut, weil es in allen mir bekannten MySQL-Versionen funktioniert und außerdem auch keine Probleme mit Case-Sensitivity hat.

          Zu den Vorzügen von INFORMATION_SCHEMA und warum MySQL SHOW nicht eliminiert hat, kannst Du Dich im Handbuch informieren.

          Warum ich INFORMATION_SCHEMA favorisiere, ich zitiere aus dem Handbuch:

          <zitat>
               Using SELECT has these advantages, compared to SHOW:

          * It conforms to Codd's rules. That is, all access is done on tables.
           [x] * Nobody needs to learn a new statement syntax. Because they already
                 know how SELECT works, they only need to learn the object names.
               * The implementor need not worry about adding keywords.
               * There are millions of possible output variations, instead of just one.
                 This provides more flexibility for applications that have varying
                 requirements about what metadata they need.
           [x] * Migration is easier because every other DBMS does it this way.
          </zitat>

          Freundliche Grüße

          Vinzenz

          1. Hello,

            Selbstverständlich sollte INFORMATION_SCHEMA in XAMPP enthalten sein. Ich kann's nicht überprüfen, weil ich XAMPP nicht nutze.

            Ich habe hier XAMPP-Version 5.0.51a auf Windows XP
            Ich kann INFORMATION_SCHEMA nicht finden.

            Dass Du die Variante mit SELECT (also auf das INFORMATION_SCHEMA) bevorzugst, kann ich nachvollziehen.

            Liebe Grüße

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            1. Hallo Tom,

              Selbstverständlich sollte INFORMATION_SCHEMA in XAMPP enthalten sein. Ich kann's nicht überprüfen, weil ich XAMPP nicht nutze.

              Ich habe hier XAMPP-Version 5.0.51a auf Windows XP
              Ich kann INFORMATION_SCHEMA nicht finden.

              und was heißt das? Suchst Du etwa entsprechende Verzeichnisse und Dateien?
              Wenn ja, vergiß es! Lies das Handbuch, ich zitiere schon wieder:

              <zitat>
                  INFORMATION_SCHEMA is the information database, the place that stores
                  information about all the other databases that the MySQL server maintains.
                  Inside INFORMATION_SCHEMA there are several read-only tables. They are
                  actually views, not base tables, so there are no files associated with them.

              In effect, we have a database named INFORMATION_SCHEMA, although the server
                  does not create a database directory with that name. It is possible to
                  select INFORMATION_SCHEMA as the default database with a USE statement, but
                  it is possible only to read the contents of tables. You cannot insert into
                  them, update them, or delete from them.
              </zitat>

              Frag' sie einfach ab. Bei meiner lokalen 5.0.45-Installation ist diese Datenbank vorhanden, im MySQL-Query-Browser wird sie auch wunderbar angezeigt.

              Freundliche Grüße

              Vinzenz

              1. Hello,

                Hallo Tom,

                Selbstverständlich sollte INFORMATION_SCHEMA in XAMPP enthalten sein. Ich kann's nicht überprüfen, weil ich XAMPP nicht nutze.

                Ich habe hier XAMPP-Version 5.0.51a auf Windows XP
                Ich kann INFORMATION_SCHEMA nicht finden.

                und was heißt das? Suchst Du etwa entsprechende Verzeichnisse und Dateien?
                Wenn ja, vergiß es! Lies das Handbuch, ich zitiere schon wieder:

                84-16-224-202:~# mysql -p
                Enter password:
                Welcome to the MySQL monitor.  Commands end with ; or \g.
                Your MySQL connection id is 23
                Server version: 5.0.32-Debian_7etch5-log Debian etch distribution

                Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

                mysql> show databases;
                +--------------------+
                | Database           |
                +--------------------+
                | information_schema |
                | mysql              |
                | postfixpolicyd     |
                | test               |
                +--------------------+
                4 rows in set (0.00 sec)

                So würde ich es über die Konsole suchen.
                XAMPP hat aber keine, oder?
                Man könnte ja sowas wie phpMyQdmin nutzen, aber das mag ich nicht...
                Außerdem habe ich noch nicht einmal nachgesehen, ob es mit installiert ist. *faul*

                So benutze ich für XAMPP SQL-Front von Nils Hoyer, dass ich inzwischen übrigens für extrem professionell halte und jedem empfehlen mag, der mit MySQL arbeitet. http://www.sql-front.com/

                Das könnte ich freilich für den Webserver auch verwenden, aber ich habe noch keinen "LittleRoot-Zugriff" (You can view but not alter everything) über 3306 eingerichtet. Und Original-Root direkt über 3306 freizugeben, ist mir  noch zu heikel. Dazu fehlt noch ein Watch-Dog auf dem Host. :-)

                Liebe Grüße

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                1. Hallo Tom,

                  So würde ich es über die Konsole suchen.
                  XAMPP hat aber keine, oder?

                  selbstverständlich gibt es auch einen Kommandozeilenclient.
                  Den findest Du im bin-Verzeichnis von MySQL. Ganz bestimmt auch bei XAMPP.

                  So benutze ich für XAMPP SQL-Front von Nils Hoyer, dass ich inzwischen übrigens für extrem professionell halte

                  wenn dieses Werkzeug Dir die Datenbank INFORMATION_SCHEMA nicht anzeigte, dann wäre es nicht professionell. Ich kann's nicht beurteilen, ich nutze es nicht.

                  Freundliche Grüße

                  Vinzenz

                  1. Hello,

                    selbstverständlich gibt es auch einen Kommandozeilenclient.
                    Den findest Du im bin-Verzeichnis von MySQL. Ganz bestimmt auch bei XAMPP.

                    Na, dann schau ich doch gleich mal.

                    Ok. Keine halben Sachen :-)

                    C:\Dokumente und Einstellungen\Administrator>C:\Programme\xampp\mysql\bin\mysql.exe -u root -p
                    Enter password:
                    Welcome to the MySQL monitor.  Commands end with ; or \g.
                    Your MySQL connection id is 20
                    Server version: 5.0.51a Source distribution

                    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

                    mysql> show databases;
                    +--------------------+
                    | Database           |
                    +--------------------+
                    | information_schema |
                    | cdcol              |
                    | mysql              |
                    | phpmyadmin         |
                    | test               |
                    | webauth            |
                    +--------------------+
                    6 rows in set (0.00 sec)

                    mysql>

                    Es gibt also eine Konsole für XAMPP. Und die heißt -oh Wunder- mysql.exe

                    Nicht vergessen, vorher die Command-Box zu öffnen...

                    wenn dieses Werkzeug Dir die Datenbank INFORMATION_SCHEMA nicht anzeigte, dann wäre es nicht professionell. Ich kann's nicht beurteilen, ich nutze es nicht.

                    Na denn.
                    Ich habe den Schalter ja auch inzwischen gefunden.
                    Hatte auch noch nicht danach gesucht bisher, da ich es tatsächlich XAMPP zugeschrieben hatte, dass die  DB INFORMATION_SCHEMA "nicht da war".

                    Und da ich mit XAMPP auch nicht ernsthaft arbeiten wollte...

                    Und "arbeiten" darf ich sowieso noch nicht. Nur ein bisschen spielen.

                    Liebe Grüße

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
              2. Hello,

                Ich habe hier XAMPP-Version 5.0.51a auf Windows XP
                Ich kann INFORMATION_SCHEMA nicht finden.

                Ok ok... alles im Lot.

                mit der gleichen Abfrage über die SQL-Konsole von SQL-Front war sie auch da.

                Habe die neue Version von SQL-Front erst zwei Tage im Einsatz. Da hat sich in den drei Monaten der Untätigkeit soo viel getan! Es gibt neue Einstellungen:

                Allgemeine Einstellugnen/Navigator/System-Tools [x]

                und schon ist die DB Information Scheme sichtbar.

                Dann hat die Morgengymnastik vor dem PC ja doch noch was positives für die Birne gebracht.

                Liebe Grüße

                Tom vom Berg

                --
                Nur selber lernen macht schlau