This function is slightly stupid to be honest, why not just make an array of field names... You could consolidate the two of these functions that way and it makes it a lot easier to list them when your script is dynamic.
<?php
function mysql_field_array( $query ) {
$field = mysql_num_fields( $query );
for ( $i = 0; $i < $field; $i++ ) {
$names[] = mysql_field_name( $query, $i );
}
return $names;
}
// Examples of use
$fields = mysql_field_array( $query );
// Show name of column 3
echo $fields[3];
// Show them all
echo implode( ', ', $fields[3] );
// Count them - easy equivelant to 'mysql_num_fields'
echo count( $fields );
?>
mysql_field_name
(PHP 4, PHP 5)
mysql_field_name — Liefert den Namen eines Feldes in einem Ergebnis
Beschreibung
mysql_field_name() liefert den Namen des Feldes, der dem angegeben Feldindex entspricht. Der Paramater Ergebnis-Kennung muss eine gültige Ergebnis-Kennung sein und Feldindex bestimmt den numerischen Offset des Feldes.
Hinweis: Der Feldindex beginnt bei 0.
Zur Verdeutlichung: Der Index des dritten Feldes ist demnach 2, der Index des vierten Feldes 3 und so weiter.
Hinweis: Feldnamen, die von dieser Funktion zurückgegeben werden, unterscheiden sich in der Groß-/Kleinschreibung.
Beispiel #1 mysql_field_name() Beispiel
<?php
/* Die Tabelle users enthält drei Felder:
user_id
username
password
*/
$link = mysql_connect('localhost', "mysql_user", "mysql_password");
$dbname = "mydb";
mysql_select_db($dbname, $link)
or die(": " . mysql_error());
$res = mysql_query("select * from users", $link);
echo mysql_field_name($res, 0) . "\n";
echo mysql_field_name($res, 2);
?>
<?php
/* The users table consists of three fields:
* user_id
* username
* password.
*/
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$db_selected) {
die('Auswahl der Datenabnk $dbname fehlgeschlagen: ' . mysql_error());
}
$dbname = 'mydb';
$db_selected = mysql_select_db($dbname, $link);
if (!$db_selected) {
die('Auswahl der Datenabnk $dbname fehlgeschlagen: ' . mysql_error());
}
$res = mysql_query('select * from users', $link);
echo mysql_field_name($res, 0) . "\n";
echo mysql_field_name($res, 2);
?>
Das oben angeführte Beispiel liefert die folgende Ausgabe:
user_id password
Für Abwärtskompatibilität kann mysql_fieldname() verwendet werden. Diese Funktion ist jedoch veraltet.
mysql_field_name
09-Mar-2008 02:13
14-Nov-2007 12:13
Strangely using an aproach like this:
$res=mysql_query("SELECT * FROM `orders`",$conec) or die (mysql_error());
$fields = mysql_num_fields($res);
$out="";
for ($i = 0; $i < $fields; $i++) {
$fname=mysql_field_name($res, $i);
}
Outputted the E_Warning:
Warning: mysql_field_name() [function.mysql-field-name]: Field N is invalid for MySQL result index
With a lot of different number at N. But expliciting all fields instead of *. Didn't outputted the error.
It maybe a caracteristic of this mysql database(it is from a open source application) because i never saw this in my own databases. Anyway hope this help if someone face the same strange situation
09-Jan-2007 04:54
james, why make so difficult when it's very simple :\
$numberfields = mysql_num_fields($res_gb);
for ($i=0; $i<$numberfields ; $i++ ) {
$var = mysql_field_name($res_gb, $i);
$row_title .= $var;
}
echo $row_title;
19-Oct-2005 02:18
This is another variant of displaying all columns of a query result, but with a simplified while loop.
<?
$query="select * from user";
$result=mysql_query($query);
$numfields = mysql_num_fields($result);
echo "<table>\n<tr>";
for ($i=0; $i < $numfields; $i++) // Header
{ echo '<th>'.mysql_field_name($result, $i).'</th>'; }
echo "</tr>\n";
while ($row = mysql_fetch_row($result)) // Data
{ echo '<tr><td>'.implode($row,'</td><td>')."</td></tr>\n"; }
echo "</table>\n"
?>
05-Aug-2005 03:19
The following will create a PHP array, $array, containing the MySQL query results with array indexes of the same name as field names returned by the MySQL query.
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
$i=0;
foreach ($line as $col_value) {
$field=mysql_field_name($result,$i);
$array[$field] = $col_value;
$i++;
}
}
20-Dec-2004 02:28
The code in the last comment has an obvious mistake in the for loop expression. The correct expression in the for-loop is $x<$y rather than $x<=$y...
$result = mysql_query($sql,$conn) or die(mysql_error());
$rowcount=mysql_num_rows($result);
$y=mysql_num_fields($result);
for ($x=0; $x<$y; $x++) {
echo = mysql_field_name($result, $x).'<br>';
}
17-Dec-2004 12:44
T simply itterate through all the field names on a result set try using this.
$result = mysql_query($sql,$conn) or die(mysql_error());
$rowcount=mysql_num_rows($result);
$y=mysql_num_fields($result);
for ($x=0; $x<=$y; $x++) {
echo = mysql_field_name($result, $x).'<br>';
}
This is useful if you have a result set that joins several tables dynamicaly and you are never sure what all the fields will be when you come to display them.
I suggest you place this within a loop through your result rows and include a field flag check around the echo to only show certain data types like this.
$y=mysql_num_fields($result);
while ($row=mysql_fetch_array($result)) {
for ($x=0; $x<=$y; $x++) {
$fieldname=mysql_field_name($result,$x);
$fieldtype=mysql_field_type($result, $x);
if ($fieldtype=='string' && $row[$fieldname]!='')
echo $row[$fieldname].' , ';
}
echo '<br>';
}
21-Feb-2003 02:27
You could probably elaborate on this by sending a full sql query to this function...but I titled it simple_query() because it doesn't really allow for joins. Never the less, if you want to get a quick array full of a single row result set this is painless:
function simple_query($table_name, $key_col, $key_val) {
// open the db
$db_link = my_sql_link();
// query table using key col/val
$db_rs = mysql_query("SELECT * FROM $table_name WHERE $key_col = $key_val", $db_link);
$num_fields = mysql_num_fields($db_rs);
if ($num_fields) {
// first (and only) row
$row = mysql_fetch_assoc($db_rs);
// load up array
for ($i = 0; $i < $num_fields; $i++) {
$simple_q[mysql_field_name($db_rs, $i)] = $row[mysql_field_name($db_rs, $i)];
}
// and return
return $simple_q;
} else {
// no rows
return false;
}
mysql_free_result($db_rs);
}
**Please note that my_sql_link() is just a function I have to open up a my sql connection.**
21-Feb-2003 02:07
<?
/*
By simply calling the searchtable() function
with these variables it will serach the desired
database and procude a table for each field that
there is a match.
*/
function searchtable($host,$user,$pass,$database,$tablename,$userquery)
{
$link = mysql_connect($host, $user, $pass) or die("Could not connect: " . mysql_error());
$db = mysql_select_db($database, $link) or die(mysql_error());
$fields = mysql_list_fields($database, $tablename, $link);
$cols = mysql_num_fields($fields);
for ($i = 1; $i < $cols; $i++) {
$allfields[] = mysql_field_name($fields, $i);
}
foreach ($allfields as $myfield) {
$result = mysql_query("SELECT * FROM $tablename WHERE $myfield like '%$userquery%' ");
if (mysql_num_rows($result) > 0){
echo "<h3>search <i>$database</i> for <i>$userquery</i>, found match(es) in <i>$myfield</i>: </h3>\n";
echo "<table border=1 align=\"center\">\n\t<tr>\n";
for ($i = 1; $i < $cols; $i++) {
echo "\t\t<th";
if ($myfield == mysql_field_name($fields, $i)){
echo " bgcolor=\"orange\"> ";
} else {
echo ">";
}
echo mysql_field_name($fields, $i) . "</th>\n";
}
echo "\t</tr>\n";
$myrow = mysql_fetch_array($result);
do {
echo "\t<tr>\n";
for ($i = 1; $i < $cols; $i++){
echo "\t\t<td> $myrow[$i] </td>\n";
}
echo "\t</tr>\n";
} while ($myrow = mysql_fetch_array($result));
echo "</table>\n";
}
}
}
searchtable($host,$user,$pass,$database,$tablename,$userquery);
?>
24-Sep-2001 01:09
here's one way to print out a row of <th> tags from a table
NOTE: i didn't test this
$result = mysql_query("select * from table");
for ($i = 0; $i < mysql_num_fields($result); $i++) {
print "<th>".mysql_field_name($result, $i)."</th>\n";
}
post a comment if there's an error
