Viennamade: MySQL: Primary Key-Spaltennamen holen

Hia Forumsteilnehmer!

Zur Zeit bringe ich den Namen des Primary Key einer MySQL-DB mit einer Funktion in Erfahrung, die beginnt mit "SHOW COLUMNS FROM $table" ...

Geht das einfacher?

Besten Dank & Grüsse
Viennamade

  1. Versuchs doch mal hiermit:

    http://dev.mysql.com/doc/mysql/en/EXPLAIN.html

    Da sollte erklärt sein was du willst, bzw. die funktionen stehn drin, für das problem, das du hast. Jedenfalls denke ich das, sofern ich dein problem verstehe =)

    mfg david

    1. Hallo!

      http://dev.mysql.com/doc/mysql/en/EXPLAIN.html

      Danke (auch wenn ich es noch nicht ganz behirnt habe)! Morgen mit frischem Schwung!

      Beste Grüße
      Viennamade

      1. Hello,

        http://dev.mysql.com/doc/mysql/en/EXPLAIN.html

        liefert exakt die gleiche Ausgabe wie "show columns from <table>"

        Interessant könnte sonst noch "show keys from <table>" sein. Aber man will ja die Queries so knapp wie möglich halten. Daher hatte ich mich für das "get_info()" entschieden, da es mit auch die Informationen über SETs und ENUMs für die automatische Generierung von Select-Tags, Radios oder Checkboxen liefert. Teuer ist ja im wesentlichen nur das Query. Wenn die Infos erst einmal im Speicher stehen, ist das Weiterverarbeiten ein Klacks. Daher der Ansatz, mit so weinig Queries wie möglich so viel Informationen wie möglich zu erhalten.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. Hello,

    Geht das einfacher?

    nein, nur noch komplexer. Ich habe da eine Funktion geschriben, die noch mehr Randbedingungen abprüft. So ganz fertig ist sie noch nicht. Außerdem habe ich mir vorgenommen, diese "vernetzten Klötze" erst unter PHP 5 mit eienr vernünftigen Datenbankklasse fertigzustellen. Sie funktioniert aber schon.

    #---------------------------------------------------------------------

    private Funktion von get_info()

    function split_types($_colinfo)
    {
      if(!is_array($_colinfo)) return false;

    $_types = array("tinyint"=>"N","smallint"=>"N","mediumint"=>"N",
                      "int"=>"N","bigint"=>"N","float"=>"N","double"=>"N",
                      "decimal"=>"N","date"=>"D","datetime"=>"D",
                      "timestamp"=>"D","time"=>"D","year"=>"D","char"=>"S",
                      "varchar"=>"S","tinyblob"=>"M","tinytext"=>"M",
                      "text"=>"M","blob"=>"O","mediumblob"=>"O",
                      "mediumtext"=>"M","longblob"=>"O","longtext"=>"S",
                      "enum"=>"S","set"=>"S");

    # N = TypeClass Numeric
      # D = TypeClass Date
      # S = TypeClass String
      # M = TypeClass Memo
      # O = TypeClass Object
      # L = TypeClass Link
      # E = TypeClass eMail

    $_split1= preg_split('#(#',$_colinfo["Type"]);
      $_split2= preg_split('#)#',$_split1[1]);

    $_split["type"]=trim($_split1[0]);

    if(!isset($_types[$_split["type"]])) return false;

    $_split["set"]=trim($_split2[0]);

    if ($_split["set"]{0} == chr(39))
      {
        $_split["set"] = explode(",",str_replace(chr(39),"",$_split["set"]));
        $_split["default"] = explode(",",$_colinfo["Default"]);
      }
      else
      {
        $_num = explode(",",$_split["set"]);
        $_split["len"] = $_num[0];
        $_split["dec"] = $_num[1];
        $_split["set"] = false;
        $_split["default"] = $_colinfo["Default"];
      }

    if ($_split["type"] == "date")
      {
        $_split["len"] = 10;
      }

    if ($_split["type"] == "datetime")
      {
        $_split["len"] = 19;
      }

    if ($_split["type"] == "time")
      {
        $_split["len"] = 10;
      }

    if (($_split["type"] == "set") or ($_split["type"] == "enum"))
      {
        $_split["len"] = strlen($_colinfo["Default"]);
      }

    $_split["rem"]=trim($_split2[1]);

    $_colinfo["Type"]      = $_split["type"];          # Nominaltyp
      $_colinfo["TypeClass"] = $_types[$_split["type"]]; # Typoberklasse
      $_colinfo["Len"]       = $_split["len"];           # Länge des Feldes gesamt
      $_colinfo["Dec"]       = $_split["dec"];           # Dezimalstellen
      $_colinfo["Rem"]       = $_split["rem"];           # nur unsigned
      $_colinfo["Set"]       = $_split["set"];           # Wertearray  für enum und set
      #$_colinfo["Rel"]                       # Relation zu welcher Tabelle table.field
      #$_colinfo["Null"]                      # Nullwerte erlaunt = 'YES'
      #$_colinfo["Key"]                       # Index-Typ: PRI, MUL, UNI
      $_colinfo["Default"]  = $_split["default"];        # Defaultwert(e) für das Feld
      #$_colinfo["Extra"]                     # z.T. nur 'auto_increment'

    if($_colinfo["TypeClass"] == "N")
      {
        $_colinfo["Style"] = "text-align:right;";  #'style="align:right"' für num-Werte
      }
      elseif($_colinfo["TypeClass"] == "D")
      {
        $_colinfo["Style"] = "text-align:center;";
      }
      else
      {
        $_colinfo["Style"] = "text-align:left;";
      }

    $width = $_colinfo["Len"];
      if($width < (strlen($_colinfo["Field"])+2))
      {
        $width = strlen($_colinfo["Field"])+2;      ## Breite in Zeichen
      }
      $width = intval($width*FONTSIZE*FONTSCALE);  ## auf Pixel umrechnen
      $_colinfo["Style"] .= "width:".$width."px;";

    return $_colinfo;
    }

    #--------------------------------------------------------------------
    function get_info($con,$table)
    {
      if (!$con) return false;
      if (strlen($table) == 0) return false;

    $sql = "show columns from $table";
      $res = mysql_query($sql,$con);

    if (!$res) return false;

    $info = array();
      while ($rec = mysql_fetch_assoc($res))
      {
        $field=$rec["Field"];
        $info[$field]=split_types($rec);
      }
      mysql_free_result($res);

    return $info;
    }
    #-------------------------------------------------------------------------
    function get_primary($info)
    {
      if (!is_array($info)) return false;

    $primary = false;
      foreach($info as $key => $val)
      {
        if($val["Key"] == "PRI")
        {
          $primary = $key;
          break;
        }
      }
      return $primary;
    }

    #--------------------------

    Wenn die Verbindung mit ener Tabelle hergestellt wird, wird als erstes die Funktion get_info() aufgerufen. Das Ergebnis kann man dann an get_primary() übergeben und erhält den Namen des des Primärschlüssels zurück.

    Ist im Prinzip nichts anderes, als Du da machst.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hallo Tom!

      ...
      ...

      Wenn die Verbindung mit ener Tabelle hergestellt wird, wird als erstes die Funktion get_info() aufgerufen. Das Ergebnis kann man dann an get_primary() übergeben und erhält den Namen des des Primärschlüssels zurück.

      Ist im Prinzip nichts anderes, als Du da machst.

      ^ Kann auch nichts anderes sein, denn diese Funktionen habe ich mir erlaubt schon Ende des vorigen Jahres aus einem Deiner Postings rauszuziehen. Muß jetzt mal schauen was dazu gekommen ist:-)

      Beste Grüße
      Viennamade

  3. Hallo,

    wie siehts denn aus mit desc [table] ?

    gruss

    --
    no strict;
    no warnings;
    Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)