|
mysql_fetch_field
Get column information from a result and return as an object
(PHP 4, PHP 5, PECL mysql:1.0)
Returns an object containing field information. This function can be used to obtain information about fields in the provided query result. Parameters
Return ValuesReturns an object containing field information. The properties of the object are:
ExamplesExample 1431. mysql_fetch_field() example<?php
See Also
Related Examples ( Source code ) » mysql_fetch_field Examples ( Source code ) » Get column name, type and max length Code Examples / Notes » mysql_fetch_fieldkrang
The field type returns what PHP classifies the data found in the field, not how it is stored in the database; use the following example to retrieve the MySQL information about the field.... $USERNAME = ''; $PASSWORD = ''; $DATABASE = ''; $TABLE_NAME = ''; mysql_connect('localhost', $USERNAME, $PASSWORD) or die ("Could not connect"); $result = mysql_query("SHOW FIELDS FROM $DATABASE.$TABLE_NAME"); $i = 0; while ($row = mysql_fetch_array($result)) { echo $row['Field'] . ' ' . $row['Type']; } creak
Sorry, the last pattern doesn't work with type whithout length, so it would be better if you change it with this one : "^([a-zA-Z]+)\(?([^\)]*)\)?$" It's still $type[1] for the type and $type[2] for the length. Creak chrisshaffer
Slight error in the above comment: $fieldLen = split("','",substr(1,-1,$fieldLen)); should read: $fieldLen = split("','",substr($fieldLen,1,-1)); oops! ;) I did take the above code (which saved me at least two hours worth of work), and massaged it into a function: function mysql_enum_values($tableName,$fieldName) { $result = mysql_query("DESCRIBE $tableName"); //then loop: while($row = mysql_fetch_array($result)) { //# row is mysql type, in format "int(11) unsigned zerofill" //# or "enum('cheese','salmon')" etc. ereg('^([^ (]+)(\((.+)\))?([ ](.+))?$',$row['Type'],$fieldTypeSplit); //# split type up into array $ret_fieldName = $row['Field']; $fieldType = $fieldTypeSplit[1];// eg 'int' for integer. $fieldFlags = $fieldTypeSplit[5]; // eg 'binary' or 'unsigned zerofill'. $fieldLen = $fieldTypeSplit[3]; // eg 11, or 'cheese','salmon' for enum. if (($fieldType=='enum' || $fieldType=='set') && ($ret_fieldName==$fieldName) ) { $fieldOptions = split("','",substr($fieldLen,1,-1)); return $fieldOptions; } } //if the funciton makes it this far, then it either //did not find an enum/set field type, or it //failed to find the the fieldname, so exit FALSE! return FALSE; } The most useful thing that I can think to do with this is to populate a HTML Dropdown box with it: echo "<SELECT NAME=\"Select\" SIZE='1'>"; foreach($fieldOptions as $tmp) { echo "<OPTION>$tmp"; } Hope this helps :D justin
Same problem, slightly different solution. $result = mysql_query("DESCRIBE tablename"); # or SHOW COLUMNS FROM # or SHOW FIELDS FROM then loop: $row = mysql_fetch_array($result); # row is mysql type, in format "int(11) unsigned zerofill" # or "enum('cheese','salmon')" etc. ereg('^([^ (]+)(\((.+)\))?([ ](.+))?$',$row['Type'],$fieldTypeSplit); # split type up into array $fieldType = $fieldTypeSplit[1]; # eg 'int' for integer. $fieldFlags = $fieldTypeSplit[5]; # eg 'binary' or 'unsigned zerofill'. $fieldLen = $fieldTypeSplit[3]; # eg 11, or 'cheese','salmon' for enum. You might then like to: if ($fieldType=='enum' or $fieldType=='set') $fieldLen = split("','",substr(1,-1,$fieldLen)); So for enum or set types, $fieldLen becomes an array of possible values. Hope that helps someone out there... blakjak
mysql_fetch_field will fail if your result set's internal pointer has advanced past the end of the result. So, if you use ... $result = mysql_query("select * from person where id=1"); // returns 1 row $row = mysql_fetch_row($result); while($field = mysql_fetch_field){ echo $field->name; } ... you won't see any fields. If you need to use mysql_fetch_field, you need to do it before you've iterated through all the rows in the result set. inaxio
just another option to get all enum|set values from table definition. values are stored into arrays using the same field name $result = mysql_query("SHOW COLUMNS FROM [table_name]"); while($row = mysql_fetch_object($result)){ if(ereg(('set|enum'), $row->Type)){ eval(ereg_replace('set|enum', '$'.$row->Field.' = array', $row->Type).';'); } } dave
If you want to get the max length of a column not just the data use this: $result = mysql_query ("SELECT * FROM table"); $fields = mysql_num_fields ($result); $i = 0; while ($i < $fields) { $len = mysql_field_len ($result, $i); $i++; } Or refer to http://www.php.net/manual/function.mysql-field-type.php admin
If you need to get separated field size you should use this part of code (I also included a database request function): !!!!! Take care of warped lines ---------------- // Function to call to perform a database request <? function sql_request($sql_query,$db_name) { global $rows_count; $db_link = mysql_connect("localhost","username","password") or die("MySQL connect failed"); @mysql_select_db($db_name) or die("unable to select: $db_name"); $query_answer = mysql_query($sql_query); $rows_count = mysql_num_rows($query_answer); mysql_close($db_link); return $query_answer; } $editing_db = "mydb"; $editing_table = "mytable"; $query_answer = sql_request("SHOW FIELDS FROM $editing_table",$editing_db); $i = 0; while ($row = mysql_fetch_array($query_answer)) { $table_structure[$i][0] = $row['Field']; $first_parenthesis = strpos($row['Type'],"("); $last_parenthesis = strpos($row['Type'],")"); if ($first_parenthesis AND $last_parenthesis) { $table_structure[$i][1] = substr($row['Type'],0,$first_parenthesis); $table_structure[$i][2] = substr($row['Type'],$first_parenthesis+1, $last_parenthesis-$first_parenthesis-1); } if ($row[Key] == "PRI") $table_structure[$i][3] = 1; echo $i." ".$table_structure[$i][0]." "; echo $table_structure[$i][1]." "; echo $table_structure[$i][2]." ".$table_structure[$i][3]." "; $i++; } ?> Hope this will be usefull! Andre Lebeuf STR ATM and Terminals php
I needed to get the field information and the enum/set values. Here is the function I created to expand the object returned by mysql_fetch_field. I also, decided to return all the fields for a table in an array of field objects by "name" and position much like mysql_fetch_array does. You could test it by using: $myfields = GetFieldInfo('test_table'); print "<pre>"; print_r($myfields); print "</pre>"; The field objects now have 'len', 'values' and 'flags' parameters. NOTE: 'values' only has data for set and enum fields. //This assumes an open database connection //I also use a constant DB_DB for current database. function GetFieldInfo($table) { if($table == '') return false; $fields = mysql_list_fields(DB_DB, $table); if($fields){ $columns = mysql_query('show columns from ' . $table); if($columns){ $num = mysql_num_fields($fields); for($i=0; $i < $num; ++$i){ $column = mysql_fetch_array($columns); $field = mysql_fetch_field($fields, $i); $flags = mysql_field_flags($fields, $i); if($flags == '') $flags=array(); else $flags = explode(' ',$flags); if (ereg('enum.(.*).',$column['Type'],$match)) $field->values = explode(',',$match[1]); if (ereg('set.(.*).',$column['Type'],$match)) $field->values = explode(',',$match[1]); if(!$field->values) $field->values = array(); $field->flags = $flags; $field->len = mysql_field_len($fields, $i); $result_fields[$field->name] = $field; $result_fields[$i] = $field; } mysql_free_result($columns); } mysql_free_result($fields); return $result_fields; } return false; } hope someone else finds this useful. nick baicoianu
Be sure to note that $max_length is the length of the longest value for that field in the returned dataset, NOT the maximum length of data that column is designed to hold.
cortalux
A far easier way of getting information upon an enum field, is this. function enumget($field="",$table="") { $result=mysql_query("SHOW COLUMNS FROM `$table` LIKE '$field'"); if(mysql_num_rows($result)>0){ $row=mysql_fetch_row($result); $options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row[1])); } else { $options=array(); } return $options; } kflam
#Input: the table name and the enum field #Output: an array that stores all options of the enum field or #false if the input field is not an enum function getEnumOptions($table, $field) { $finalResult = array(); if (strlen(trim($table)) < 1) return false; $query = "show columns from $table"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)){ if ($field != $row["Field"]) continue; //check if enum type if (ereg('enum.(.*).', $row['Type'], $match)) { $opts = explode(',', $match[1]); foreach ($opts as $item) $finalResult[] = substr($item, 1, strlen($item)-2); } else return false; } return $finalResult; } The function could be handy when making a selection option without typing all the options items respectively. |
Change Languagemysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_set_charset mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query |