Tom: MySQL: Primary Key-Spaltennamen holen

Beitrag lesen

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