Uzyskaj nazwy kolumn tabeli w MySQL?

300

Czy istnieje sposób na przechwycenie nazwy kolumny tabeli w mysql? za pomocą php

Pracownik
źródło

Odpowiedzi:

536

Możesz użyć DESCRIBE :

DESCRIBE my_table;

Lub w nowszych wersjach możesz użyć INFORMACJE_SCHEMA :

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

Lub możesz użyć POKAŻ KOLUMNY :

SHOW COLUMNS FROM my_table;
Greg
źródło
14
DESCRIBE to właściwie skrót do SHOW COLUMNS ( dev.mysql.com/doc/refman/5.0/en/describe.html )
svens,
11
Głosowałbym za wersją Information_Schema, ponieważ ta składnia jest obsługiwana przez większość głównych baz danych. Najlepiej nauczyć się tylko 1 sposób, jeśli musisz.
Kibbee
3
+1 Chciałem wybrać nazwy tabel, w których istnieje kolumna, zrobiłemSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND COLUMN_NAME = 'col_name';
AL̲̳I
2
oszczędzaj bajty, używając desc my_table;:-)
Alfonso Pérez
3
DESCdo opisu można łatwo pomylić z DESCzejściem. Nominalna ilość bajtów, którą oszczędzasz z powodu braku czytelności, nie jest tego warta.
Jacques Mathieu
34

Następujące instrukcje SQL są prawie równoważne:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_name = 'tbl_name'
  [AND table_schema = 'db_name']
  [AND column_name LIKE 'wild']

SHOW COLUMNS
FROM tbl_name
[FROM db_name]
[LIKE 'wild']

Odniesienie: INFORMACJE_SCHEMA KOLUMNY

Kucyki OMG
źródło
1
Dlaczego mówisz „prawie”?
Pacerier
2
@Pacerier Po pierwsze, druga nie będzie działać jako podzapytanie.
WAF,
@ WAF, myślę, że miał na myśli coś zupełnie innego, nie to.
Pacerier
2
W moim szybkim teście SHOW COLUMNSzwraca tabelę zawierającą nazwy kolumn, typy itp., A SELECT COLUMN NAMEzwraca tylko nazwy kolumn.
mwfearnley,
20

Zrobiłem funkcję PDO, która zwraca wszystkie nazwy kolumn w prostej tablicy.

public function getColumnNames($table){
    $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = :table";
    try {
        $core = Core::getInstance();
        $stmt = $core->dbh->prepare($sql);
        $stmt->bindValue(':table', $table, PDO::PARAM_STR);
        $stmt->execute();
        $output = array();
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
            $output[] = $row['COLUMN_NAME'];                
        }
        return $output; 
    }

    catch(PDOException $pe) {
        trigger_error('Could not connect to MySQL database. ' . $pe->getMessage() , E_USER_ERROR);
    }
}

Wynikiem będzie tablica:

Array (
[0] => id
[1] => name
[2] => email
[3] => shoe_size
[4] => likes
... )

Przepraszam za necro, ale podoba mi się moja funkcja;)

PS Nie dodałem klasy Core, ale możesz użyć własnej klasy .. DS

Philip
źródło
O co chodzi z fetyszem wielkich liter?
Pacerier
Nie ma nic złego w udzieleniu odpowiedzi na stare pytanie dotyczące przepełnienia stosu.
bdsl
1
Dzięki. Do danych wyjściowych użyłem tego sposobu: $ columns = $ stmt-> fetchAll (\ PDO :: FETCH_ASSOC); zwraca tablicę_kolumny ($ kolumny, „COLUMN_NAME”);
Ehsan
6

To rozwiązanie pochodzi z wiersza polecenia mysql

mysql>USE information_schema;

W poniższym zapytaniu wystarczy zmienić <--DATABASE_NAME--> na bazę danych i <--TABLENAME--> na nazwę tabeli, w której chcesz tylko Wartości pola instrukcji DESCRIBE

mysql> SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = '<--DATABASE_NAME-->' AND   TABLE_NAME='<--TABLENAME-->';
leela
źródło
4

Jest to również, jeśli wolisz:

mysql_query('SHOW COLUMNS FROM tableName'); 
James Goodwin
źródło
4

Co powiesz na to:

SELECT @cCommand := GROUP_CONCAT( COLUMN_NAME ORDER BY column_name SEPARATOR ',\n')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

SET @cCommand = CONCAT( 'SELECT ', @cCommand, ' from my_database.my_table;');
PREPARE xCommand from @cCommand;
EXECUTE xCommand;
Wolf Metzner
źródło
4

Warto również zauważyć, że możesz używać tego,
EXPLAIN table_nameco jest synonimem DESCRIBE table_namei SHOW COLUMNS FROM table_name chociaż EXPLAIN jest częściej używany do uzyskiwania informacji o planie wykonania zapytania.

AnthonyS
źródło
3

Zbadać:

mysql_query('DESCRIBE '.$table);
Andy Hume
źródło
3

Funkcja MySQL opisująca tabelę powinna zabrać cię tam, gdzie chcesz się udać (wpisz nazwę tabeli w polu „table”). Będziesz musiał przeanalizować niektóre dane wyjściowe, ale jest to dość łatwe. O ile pamiętam, jeśli wykonasz to zapytanie, wynik zapytania PHP uzyskujący dostęp do funkcji, które normalnie dawałyby ci parę klucz-wartość, będzie miał nazwy kolumn jako klucze. Ale minęło trochę czasu odkąd użyłem PHP, więc nie trzymaj mnie tego. :)

dannysauer
źródło
Istnieje kilka całkiem dobrych dokumentów na php.net
dannysauer
3

Możesz także sprawdzić mysql_fetch_array(), jak w:

$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs)) {
//$row[0] = 'First Field';
//$row['first_field'] = 'First Field';
}
thewebguy
źródło
3

Potrzebowałem nazw kolumn jako płaskiej tablicy, podczas gdy inne odpowiedzi zwróciły tablice asocjacyjne, więc użyłem:

$con = mysqli_connect('localhost',$db_user,$db_pw,$db_name);
$table = 'people';

/**
* Get the column names for a mysql table
**/

function get_column_names($con, $table) {
  $sql = 'DESCRIBE '.$table;
  $result = mysqli_query($con, $sql);

  $rows = array();
  while($row = mysqli_fetch_assoc($result)) {
    $rows[] = $row['Field'];
  }

  return $rows;
}

$col_names = function get_column_names($con, $table);

$ col_names jest teraz równe:

(
    [0] => name
    [1] => parent
    [2] => number
    [3] => chart_id
    [4] => type
    [5] => id
)
duhaime
źródło
2

Ta mysql_list_fieldsfunkcja może Cię zainteresować; ale, jak stanowi instrukcja:

Ta funkcja jest przestarzała. Zamiast tego lepiej jest użyć instrukcji mysql_query()SQL SHOW COLUMNS FROM table [LIKE 'name'].

Pascal MARTIN
źródło
Jak działa funkcja, jeśli nie wydaje zapytania SQL na serwer? Dlaczego jest przestarzałe?
Pacerier
2

możesz uzyskać całą strukturę tabeli, wykonując proste polecenie.

DESC TableName

lub możesz użyć następującego zapytania.

SHOW COLUMNS FROM TableName
Harish Kumar
źródło
2

w mysql, aby uzyskać szczegółowe informacje na temat kolumn i struktury tabeli, postępując zgodnie ze słowami kluczowymi lub zapytaniami

1.DESC table_name

2)DESCRIBE table_name

3)SHOW COLUMNS FROM table_name

4SHOW create table table_name;

5EXPLAIN table_name

denny
źródło
2
$col = $db->query("SHOW COLUMNS FROM category");

while ($fildss = $col->fetch_array())
{             
    $filds[] = '"{'.$fildss['Field'].'}"';
    $values[] = '$rows->'.$fildss['Field'].'';
}

if($type == 'value')
{
    return $values = implode(',', $values);
}
else {
     return $filds = implode(',', $filds);
}
ibRQD
źródło
1
Aby być bardziej pomocnym dla przyszłych użytkowników, proszę podać kontekst odpowiedzi, a nie tylko zrzut kodu.
Paul Zahra
1

to zadziałało dla mnie ..

$sql = "desc MyTableName";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>";
}
Ad Kahn
źródło
1

Napisałem prosty skrypt php, aby pobrać kolumny tabeli przez PHP: Show_table_columns.php

<?php
$db = 'Database'; //Database name
$host = 'Database_host'; //Hostname or Server ip
$user = 'USER'; //Database user
$pass = 'Password'; //Database user password
$con = mysql_connect($host, $user, $pass);
if ($con) {
    $link = mysql_select_db($db) or die("no database") . mysql_error();
    $count = 0;
    if ($link) {
        $sql = "
            SELECT column_name
            FROM   information_schema.columns
            WHERE  table_schema = '$db'
                   AND table_name = 'table_name'"; // Change the table_name your own table name
        $result = mysql_query($sql, $con);
        if (mysql_query($sql, $con)) {
            echo $sql . "<br> <br>";
            while ($row = mysql_fetch_row($result)) {
                echo "COLUMN " . ++$count . ": {$row[0]}<br>";
                $table_name = $row[0];
            }
            echo "<br>Total No. of COLUMNS: " . $count;
        } else {
            echo "Error in query.";
        }
    } else {
        echo "Database not found.";
    }
} else {
    echo "Connection Failed.";
}
?>

Cieszyć się!

Hussnain Sheikh
źródło
1
Proszę zamieścić rzeczywistą odpowiedź tutaj i użyć swojej treści jako kopii zapasowej / referencji
ChrisF
0

mysqli fetch_field () pracował dla mnie:

if ($result = $mysqli -> query($sql)) {
  // Get field information for all fields
  while ($fieldinfo = $result -> fetch_field()) {
    printf("Name: %s\n", $fieldinfo -> name);
    printf("Table: %s\n", $fieldinfo -> table);
    printf("Max. Len: %d\n", $fieldinfo -> max_length);
  }
  $result -> free_result();
}

Źródło: https://www.w3schools.com/pHP/func_mysqli_fetch_field.asp

David M.
źródło