MySQL-Feldtyp auslesen

daHooligan
Hy,

ich würde gerne für ein Benutzer-Profil-Dingens bei allen Sachen, die in der MySQL-DB als Spaltentyp "ENUM" mit zwei auswahlmöglichkeiten (z.B.: als "enum('0', '1')") eingetragen sind.
Ich sollte also all die Felder auslesen, die als Variablen-Typ "enum" haben udn dann diese untersuchen ob der Zahl ihrer Auswahlmöglichkeiten.
Also hier
code:
1:
2:
3:
4:
5:
6:
7:
8:
Feld          Typ                       
usrnr-------bigint 
usrname-----bigint      
usrnl-------enum('0','1')       
ursgrp------enum('0','1','2')  
usradv------enum('0','1')

will ich als Rückgabewert die Spalten usrnl und useradv egal ob als array, telefonanruf oder nachricht in meinem Frühstücksmüsli. Im Idealfall natürlich Computerabel

MfG

daHool
p-Logic
php:
1:
<?php SELECT usrnl FROM tbl_name?>

Sollte doch einfach den Wert, der drin steht auslesen, oder?
Müsste doch eigentlich einfach gehen?
PHP wandelt die Typen sowieso dynamisch um.

Noch was (hab ich noch nie getestet):
php:
1:
<?php SELECT usrnl+0 FROM tbl_name?>

Gibt den Index zurück. Also wenn bei enum('a','b','c') der Wert b ist, dann ist der Index 2 (wird NICHT von Null gezählt).
php:
1:
2:
3:
4:
<?php $mysql_pointer mysql_db_query($dbName"SELECT usrnl+0 FROM tbl_name;"$Connection);
for ($i 1$i <= mysql_num_rows($mysql_pointer); $i++) {
   $Mueslipackung[$i] = mysql_result($mysql_pointer$i0)-1;
} ?>


Wieso eigentlich enum, da kann man doch auch bool nehmen, oder?
daHooligan
nein, ich will nicht den inhalt des feldes sondern ich will wissen obs jetzt enum/bool/varchar etc. ist
cyph3x
hmm, normalerweise ist der Aufbau der Tabelle doch bekannt oder ??
In deinem Fall würde mir auf die schnelle nur sp_help ( stored procedure in Transact-SQL ) einfallen, k.A. obs das auch in MySQL gibt.

falls doch, dann gibts hier ne man page dazu : http://doc.ddart.net/mssql/sql70/sp_help.htm
p-Logic
Sorry, hab ich irgendwie nicht gesehen, ich hab mich aber ernsthaft gefragt, was für Fragen du stellst:
Zitat:
Original von daHooligan
will ich als Rückgabewert die Spalten usrnl und useradv

Aber wenn das so ist...

Hab leider keine Ahnung, was auch mit enum gehen könnte unglücklich
Für normale Vars mysql_field_type, aber für enum?? ka.

Vllt mysql_field_flags??
daHooligan
jo, werds mal probieren
El_Dani
Hm, grad mal hier vorbeigesurft und das Problem gesehn Augenzwinkern Das ist eigentlich ganz einfach, ohne so eine Funktion wäre das Auslesen der Eigenschaften ja auch unmöglich.

php:
1:
<?php SHOW FIELDS FROM tbl_name?>


Das gibt dann sowas aus:

php:
1:
2:
3:
4:
5:
6:
7:
<?php Field        Type              Null  Key    Default    Extra

id           int(4)                  PRI    NULL       auto_increment
description  varchar(78)
subtext      text              YES          NULL
filename     varchar(50)
is_thumb     enum('yes','no')               yes ?>


Die Ergebnisse lassen sich dann mit PHP ja recht einfach weiterverarbeiten.
daHooligan
danke, genau das hatte ich gesucht.


Hier nochmal im Klartext wofür ich das brauche: Ich möchte ein Benutzer-Registrier bzw. -Administrations-Formular machen das automatisch alle Spalten aus der DB ausliest und dementsprechend bei Feldern mit zwei Auswahlmöglichkeiten [enum('1','2') o.ä.] einen Radio-Button erstellt und bei Feldern mit mehr als zwei Auswahlmöglilchkeiten [enum('0','1','2') o.ä.] eine Auswahlliste anzeigt.
daHooligan
moinsen, hab noch eine Frage zum zurückgegebenen array.
ich bekomme was auch immer ich tue nur die Informationen über die erste Zeile, an die Informationen über die folgenden Zeile komme ich nicht ran, whatever I do. affected_rows gibt aber die Zahl aller vorhandenen Spalten in der Tabelle zurück. Weiß noch jemand eine Möglichkeit mehr Informationen über ein ARray zu bekommen als implode(); count(); etc... Ich bin auf jeden Fall mit meinem Wissen am Ende.

MfG

daHool
El_Dani
Hilft dir das weiter? Eigentlich musst du das nur kopieren und den Teil des Datenbankzugriffs sowie den Tabellennamen anpassen und voilà schon wird das Formular automatisch erstellt cool .

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>mySQL-sample 'SHOW FIELDS'</title>
</head>
<body>
<form name="showfields" method="POST" action="irgendwo.php">
<input type="hidden" name="submitme" value="true" />
<table border="0" width="500">
<?php
/**
*
* @author Daniel <daniel.hauser@oleco.net>
* @version -
* @module -
*/

// Das ist nur eine externe Datei mit den mySQL-Daten
include('mysql-config.inc.php');

function FTFE($eName$eType$eStd='') {
  // Eine kleine Funktion, die abhängig vom Feldtyp ein anderes
  // Formelement zurückgibt. Vollständig ist das allerdings nicht,
  // da fehlen noch Typen wie FLOAT, DOUBLE, TIME, DATETIME etc.
  if(preg_match('/int\((.*)\)$/m'$eType$eMaxLen)) { // *int(x)
    $returnMe '<input type="text" name="' $eName;
    $returnMe.= '" size="30" maxlength="' $eMaxLen[1];
    $returnMe.= '" value="' $eStd '" />';
  } elseif(preg_match('/^varchar\((.*)\)$/m'$eType)) { // varchar(x)
    $returnMe '<input type="text" name="' $eName;
    $returnMe.= '" size="30" maxlength="' $eMaxLen[1];
    $returnMe.= '" value="' $eStd '" />';
  } elseif($eType=='text' or $eType=='mediumtext' or $eType=='longtext') { // *text
    $returnMe '<textarea name="' $eName ' cols="35" rows="4">' $eStd '</textarea>';
  } elseif(preg_match('/enum\((.*)\)$/m'$eType$eItems)) { // enum(x)
    $eItems split(','$eItems[1]);
    $returnMe '<select name="' $eName '">';
    for($i=0;$i<count($eItems);$i++) {
      $eItems[$i] = substr($eItems[$i], 1strlen($eItems[$i])-2);
      if($eItems[$i]==$eStd) {
        $returnMe.= '<option value="' $eItems[$i]. '" selected="selected">' $eItems[$i] . '</option>';
      } else {
        $returnMe.= '<option value="' $eItems[$i]. '">' $eItems[$i] . '</option>';
      }
    }
    $returnMe.= '</select>';
  } elseif(preg_match('/blob$/m'$eType)) { // *blob-Felder
    $returnMe '<input type="file" name="' $eName '" />';
  }

  return $returnMe;
}

// Überspringt bestimmte Feldnamen, zB interne ID's, automatische Zeitangaben etc.
$exclude = array('filename''filetype''time''image_thumb');

// mySQL-Verbindung herstellen.
$dH mysql_connect($configval['mysql_server'],$configval['mysql_user'],$configval['mysql_pass']);
mysql_select_db($configval['mysql_database'],$dH);

// Query an den Server senden und Ergebnisse durch eine Schleife laufen lassen
$sqry mysql_query("SHOW FIELDS FROM gallery",$dH);
while($sdata mysql_fetch_array($sqry)) {
  if(in_array($sdata['Field'],$exclude)) {
    // Falls ein Name in $exlude vorkommt, überspringen
    continue;
  }
  echo '<tr><td>' $sdata['Field'] . '</td>';
  echo '<td>' FTFE($sdata['Field'],$sdata['Type'],$sdata['Default']) . '</td></tr>';
  // function FTFE() == Field Type Form Element aufrufen
}

// mySQL-Verbindung beenden
mysql_close($dH);
?>
</table>
<br />
<input type="submit" name="submit" value="absenden" />
</form>
</body>
</html>
daHooligan
thx, genau so etwas wollte ich komplett neu coden. Ich werds noch ein bißchen anpassen aber alles in allem ist das genau das was ich wollte

//EDIT: bin fast fertig mit meine Veränderungen. Wenn ichs ganz fertig hab stell ich mein Resultat ml online. Inzwischen muss man die Felder nmicht mehr in der Reihenfolge anzeigen lassen in der sie in der DB stehen sondern können über ein Array in ihrer Reihenoflge verändert werden. Es werden nicht mehr die Spaltennamen angezeigt sondern können auch über ein array verändert ausgegeben werden (statt 'usrname' erscheint jetzt 'Benutzername'). Somit kann das Formular universeller eingesetzt werden. z.B. auch als Moderations- oder Benutzerregistrierungsformular etc. . Wie gesagt wenn ganz fertig ist poste ich mein Ergebnis nochmal, kann aber noch ein bis zwei wochen dauern das script ist inzwischen gewachsen. von knapp 3kB auf > 5kB Augenzwinkern
deltarabbit
Ist auch ungemein praktisch. Verwende ich auch schon seit langem, so kann man fix ein paar Datenbankfelder hinzufügen ohne großartige Scriptänderungen zu treffen.

Ist echt klug der EInsatz kann ich nur weiterempfehlen ;-)
daHooligan
kannst ud mal die alten und beendeten threads in ruhe lassen??