Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    282

    come trovare il nome del campo chiave di una tabella

    Ciao a tutti,
    sto scrivendo una funzione che mi consente la decodificare i campi di una tabella.
    A questa funzione voglio passare il nome della tabella, la chiave principale ed il nome del campo che mi deve restituire.
    Il problema che mi pongo è questo:
    nella SELECT scrivo qualcosa del tipo WHERE id = campopassato.
    Questo presuppone che il campo chiave è id, ma se il nome del camo chiave è diverso come posso fare? C'è qualcosa che mi restituisce il nome del campo chiave (per me solitamente il primo).
    Ho cercato un pò ma non sono riuscita a trovare nulla...
    Grazie

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    describe nome_tabella

    in corrispondenza della voce Key trovi PRI.

    edit. Se disponi di mysql 5 puoi ricorrere all'information schema

    codice:
    select c.column_name
    from information_schema.table_constraints t
    join information_schema.key_column_usage c
    using (constraint_name,table_schema,table_name)
    where t.constraint_type='PRIMARY KEY'
    and t.table_schema='nome_database'
    and t.table_name='nome_tabella'

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    282
    Innanzitutto grazie per il tuo intervento, però non ho capito in che modo usare l'istruzione "describe"...

    Io ho fatto così:

    function leggicampo($tabella,$chiave,$campo)
    {
    $result=array();
    require('../Connections/conn.php');
    mysql_select_db($database_conn,$conn);
    $sql = "SELECT * FROM ".$tabella." WHERE classe = '".$chiave."'";
    $res = mysql_query($sql, $conn) or die(mysql_error());
    $result = mysql_fetch_array($res);
    mysql_free_result($res);
    $decodifica = $result[$campo];
    return $decodifica;
    }

    con questa funzione decodifico il campo che mi serve però nella WHERE sono costretta a mettere classe che è il campo chiave e questo mi limita la funzione alla sola tabella.
    Ovviamente potrei passare alla funzione un quarto parametro con il nome del campo chiave (in questo caso appunto classe ).
    Però mi chiedevo se c'è un modo per fare riferimento a questo nome campo senza passarlo.
    Con i linguaggi tradizionali so come fare, però PHP e MYSQL li stò studiando solo ora, ma penso ci sia un modo...

    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    282
    Ho risolto il problema usando la funzione mysql_field_name che con indice 0 mi restituisce il nome del primo campo della tabella.
    Non so se stilisticamente è valido o se lo è dal punto di vista dell'ottimizzazione (in effetti faccio due SELECT e non so cosa succede congrosse tabelle....) però funziona!

    Posto il mio risultato se può essere utile a qualcuno, oppure se qualcuno lo vuole migliorare.

    Ciao


    function leggicampo($tabella,$chiave,$campo)
    {
    // preparo l'array per il risultato della query
    $result=array();
    require('../Connections/conn.php');
    mysql_select_db($database_conn,$conn);

    $sql = "SELECT * FROM ".$tabella." ";
    $res = mysql_query($sql, $conn) or die(mysql_error());
    $nomecampo = mysql_field_name($res, 0);

    $sql = "SELECT * FROM ".$tabella." WHERE ".$nomecampo." = '".$chiave."'";

    $res = mysql_query($sql, $conn) or die(mysql_error());
    $result = mysql_fetch_array($res);
    mysql_free_result($res);
    $decodifica = $result[$campo];
    return $decodifica;
    }

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Solitamente viene definito come chiave primaria il primo campo di una tabella ma nessuno vieta di impostarlo in una qualsiasi altra posizione, quindi puntare alla cieca su di essa non è consigliabile.

    Come già ti accennavo se disponi di mysql 5 puoi ricavare il nome del campo chiave primaria con una semplice query

    Codice PHP:
    function pk($tabella) {
    $query mysql_query("SELECT COLUMN_NAME
                          FROM INFORMATION_SCHEMA.COLUMNS
                          WHERE TABLE_SCHEMA = 'nome_database'
                          AND TABLE_NAME = \"
    $tabella\"
                          AND COLUMN_KEY = 'PRI'"
    );
    $row mysql_fetch_row($query);
    return 
    $row[0] !='' $row[0] : 'nessuna chiave';
    }
    // esempio query
    $query 'select * from nome_tabella where '.pk('nome_tabella').'=.......'
    Se invece non hai mysql 5 prova a eseguire questa query

    show index from nome_tabella

    Nella colonna Key_name troverai PRIMARY per la chiave primaria oltre ad eventuali altri indici che potresti aver definito. Anche in questo caso ti crei una funzioncina ad hoc con la quale estrapoli la "Column_name" relativa alla voce PRIMARY.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    282
    Ho verificato e funziona perfettamente.

    Ho fatto solo una piccola modifica per usare il nome del database usato e quindi riutilizzarlo in altri casi.


    function pk($tabella) {
    require('../Connections/conn.php');
    $query = mysql_query("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = '".$database_conn."' AND TABLE_NAME = \"$tabella\" AND COLUMN_KEY = 'PRI'");
    $row = mysql_fetch_row($query);
    return $row[0] !='' ? $row[0] : 'nessuna chiave';
    }



    Grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.