TS: Mysql SET update

Beitrag lesen

Hello,

Kannst Du mir das bitte mal zeigen .....

Ich poste das mal als Ausschnitt hier:

# Zerlegung der Table-Metadaten aus der MySQL-DB

# returns:
# info[fieldname1]['name'] 			Name der Spalte
#  			  	  ['type']		1)	Datentyp laut Typenliste (1)
#                 ['len']  		*)	Länge des Feldes gesamt
#                 ['dec']  		*)	Dezimalstellen
#                 ['typeext]  	*)	z.Zt. nur 'unsigned' bei N-Typen
#                 ['values']  	*)	Werteliste  für enum und set
#                 ['rel']  		*)	Relation zu welcher Tabelle table.field
#                 ['null']      	Nullwerte erlaunt = 'YES'
#                 ['key']        	Index-Typ: PRI, MUL, UNI
#                 ['default']    	Defaultwert(e) für das Feld
#                 ['extra']      	z.T. nur 'auto_increment' 
#				  ['rem']			Comment der Spalte
#				  ['charset']		Character-Set der Codierungung
#				  ['collation']		Sortierung des Character-Sets	 
#				  ['rights']		Rechte des abfragenden Users auf die Spalte
#									- beachte: Delete-Recht steht erst in table_privileges, oder höher
#
# info[fieldname2][...]
# ...
#

# 1) wird von mir zerlegt und *) werden hinzugefügt 

# Typenliste (1)
# Typen sind zur Zeit:
#   tinyint
#   smallint
#   mediumint
#   int
#   bigint
#   float
#   double
#   decimal
#   date
#   datetime
#   timestamp
#   time
#   year
#   char
#   varchar
#   tinyblob
#   tinytext
#   text
#   blob
#   mediumblob
#   mediumtext
#   longblob
#   longtext
#   enum
#   set
#   point
#   linestring
#   polygon
#   geometry
#   multipoint
#   multilinestring
#   multipolygon
#   geometrycollection

# Formatbeispiele:
#   bigint(20) unsigned
#   timestamp(14) (Ausgabeformat ersetzt durch YYYY-MM-DD H:i:s, 19 Zeichen)
#   varchar(30)
#   set('EINS','ZWEI','DREI','VIER','FÜNF')
#   float(11,10)
#   double(11,5)
#   decimal(10,2)
#   year(2)
#   char(2)
#   enum('eins','zwei','sieben','12')


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

function dbi_split_types($_rec)
{
	if(!is_array($_rec)) 				return false;
	
	## N  	= TypeClass Numeric
	## NC 	= Typeclass Numeric Comma
	## D  	= TypeClass Date
	## S  	= TypeClass String
	## SM 	= TypeClass String Memo/Multistring	
	## SL 	= TypeClass String List
	## SLM 	= TypeClass String List Multiple
	## G	= Typeclass Geometry
  
	## Zerlegen in Typbezeichnung und Spezifizierung
	$pm = preg_match('~([a-z]+)(\([\'a-zßäöüA-ZÄÖÜ,0-9-_]*\))?([ a-z]+)?~', $_rec['COLUMN_TYPE'], $_matches);
	if ($pm != 1) return false;    
/*
	if ($_matches[1] !== $_rec['DATA_TYPE'])
	{
		error_log('dbi_split_types(): Typenangaben stimmen nicht überein' . PHP_EOL);
		return false;
	}
*/	
	$_spec = Array();
	$_spec['name'] = $_rec['COLUMN_NAME'];		## 	
	$_spec['type'] = $_rec['DATA_TYPE'];    	## int, timestamp, varchar, ...
	$_spec['null'] = $_rec['IS_NULLABLE'];		## YES, NO
	$_spec['default'] = $_rec['COLUMN_DEFAULT'];## wird ggf, aufgespalten als Array
	$_spec['extra'] = $_rec['EXTRA'];	
	$_spec['key'] = $_rec['COLUMN_KEY'];		## Index-Typ: PRI, MUL, UNI
	if (false === ($_spec['rem'] = @unserialize($_rec['COLUMN_COMMENT'])))
	{
		$_spec['rem'] = $_rec['COLUMN_COMMENT'];	## nur über Information_Schema abfragbar
	}	
	$_spec['charset'] =	$_rec['CHARACTER_SET_NAME'];	## utf8, iso8859-1	
    $_spec['collation'] = $_rec['COLLATION_NAME'];		## Vergleich/Sortierung: utf8_general_ci
	$_spec['rights'] =	$_rec['PRIVILEGES'];	## Rechte des abfragenden Users auf die Spalte: select,insert,update,references
	
	$specstr = null;
	if (isset($_matches[2]))
	{
		## Spezifizierung auswerten
#		$_spec['spec'] = $_matches[2];
		## Klammern entfernen
		$specstr = trim($_matches[2], '()');
	}

	if (isset($_matches[3]))
	{
		## Zusatzspezifizierung auswerten
		$_spec['typeext'] = trim($_matches[3]);
	}

	switch ($_matches[1]) 
	{
		case 'tinyint':
		case 'smallint':
		case 'mediumint':
		case 'int':		
		case 'bigint':		
			$_spec['typeclass'] = 'N';
			$_spec['len'] = $specstr;
		break;
		
		case 'float':
		case 'double':
        case 'decimal':
			$_spec['typeclass'] = 'NC';
			$_specdata = explode(',',$specstr);
			$_spec['len'] = $_specdata[0];			
			$_spec['dec'] = $_specdata[1];					
		break;
		
        case 'timestamp':
		case 'datetime':
			$_spec['len'] = 19;		## Darstellung als 2015-01-07 17:48:11
		case 'date':
		case 'time':
		case 'year':
			$_spec['typeclass'] = 'D';
		break;
		
		case 'char':
        case 'varchar':
			$_spec['typeclass'] = 'S';
			$_spec['len'] = $specstr;
		break;
		
		case 'binary':
		case 'varbinary':
		case 'tinyblob':
		case 'tinytext':
		case 'text':
		case 'blob':
		case 'mediumblob':
		case 'mediumtext':
		case 'longblob':
		case 'longtext':
			$_spec['typeclass'] = 'SM';
		break;
		
		case 'enum':				## Ein Wert aus einer Liste
			$_spec['typeclass'] = 'SL';		
			## Default-Wert als Array darstellen, damit bei der Verarbeitung dieselbe Funktion 
			## benutzt werden kann, wie bei 'set'
			$_spec['default'] = explode(",", $_spec['default']);
			## Führende und abschließende Apostophe entfernen
			$specstr = trim($specstr,"'");
			## Werte vereinzeln
			$_spec['values'] = explode("','", $specstr);
		break;	
		
		case 'set':					## Mehrere Werte aus einer Liste
			$_spec['typeclass'] = 'SLM';
			## Default-Werte als Array darstellen
			$_spec['default'] = explode(",", $_spec['default']);
			## Führende und abschließende Apostophe entfernen
			$specstr = trim($specstr,"'");
			## Werte vereinzeln
			$_spec['values'] = explode("','", $specstr);
		break;

		case 'point':
		case 'linestring':
		case 'polygon':
		case 'geometry':
		case 'multipoint':
		case 'multilinestring':
		case 'multipolygon':
		case 'geometrycollection':
			$_spec['typeclass'] = 'G';
		break;
			
		default:		
			$_spec['typeclass'] = 'NA';
	}
	
	return $_spec;	
}

#--------------------------------------------------------------------
function dbi_get_info($con, $table)
{
	if (!is_object($con)) 
	{
		error_log('dbi_get_info(): keine gültige Connection' . PHP_EOL);
		return false;
	}		

	if (strlen($table) == 0) return false;

	$sql = "show columns from $table";
	$sql = "
		select `COLUMN_NAME`, `COLUMN_DEFAULT`, `IS_NULLABLE`, 
			`DATA_TYPE`, `CHARACTER_MAXIMUM_LENGTH`, `COLUMN_KEY`, 
			`NUMERIC_PRECISION`, `NUMERIC_SCALE`, `CHARACTER_SET_NAME`, 
			`COLLATION_NAME`, `COLUMN_TYPE`, `COLUMN_COMMENT`,
			`EXTRA`, `PRIVILEGES`
		from `information_schema`.`columns` where `table_name` = '" . 
		mysqli_real_escape_string($con, $table) . "'";

	$res = mysqli_query($con, $sql);
	if (!$res || (mysqli_num_rows($res) === 0)) 
	{
		error_log('dbi_get_info(): Abfrage auf Tabelle `'. $table . '` ohne Ergebnis. ' . mysqli_error($con) . PHP_EOL);
		return false;
	}	

	$_info = array();
	while ($_rec = mysqli_fetch_assoc($res))
	{
		if(!isset($_rec['COLUMN_NAME'], $_rec['COLUMN_TYPE'])) 	
		{
			error_log('dbi_split_types(): Keine Spaltendaten vorhanden' . PHP_EOL);
			return false;
		}	

		$field = $_rec['COLUMN_NAME'];
		$_info[$field] = dbi_split_types($_rec);
	} 

	return $_info;
}   

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

echo "<pre>\r\n";
echo htmlspecialchars(print_r(dbi_get_info($con, $table),1)) . "\r\n";
echo "</pre>\r\n";

Die $con und die $table musst Du angeben. Dann bekommst Du (hoffentlich, da ich es nur ausgeschnitten habe aus meiner Sammlung) ein Array mit der Struktur der Tabelle und weiteren Klassifiziernungen, die ich nützlich fand für die spätere Darstellung oder Abfrage mittels HTML.

Liebe Grüße
Tom S.

--
Es gibt nichts Gutes, außer man tut es
Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.