Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Trovare dinamicamente le FK di una tabella con PHP

    Ciao a tutti,
    sto cercando un metodo che mi consenta di rilevare con PHP le Foreign Keys di una tabella (MySQL) e dove queste puntano.
    Praticamente l'ipotesi è quella dilavorare su un database di cui non si conosce la forma, entro nella tabella, trovo l'elenco dei campi, ma non riesco a capire come posso trovare quali campi referenziano tabelle esterne.

  2. #2
    Potresti fare in 2 modi:

    $GLOBALS['sql'] = "SHOW CREATE TABLE TUA_TABELLLA";
    $GLOBALS['esegui'] = mysqli_query($GLOBALS['connessione'], $GLOBALS['sql']) or die(mysqli_error($GLOBALS['connessione']));

    $GLOBALS['riga'] = mysqli_fetch_assoc($GLOBALS['esegui']);
    echo $GLOBALS['riga']['Create Table'];

    In tal modo esce a video il comando CREATE TABLE............

    CREATE TABLE `prova` ( `id_utente` int(10) unsigned NOT NULL, ................ CONSTRAINT `FK_prova_1` FOREIGN KEY (`id_utente`) REFERENCES `codici_utenti` (`id_utente`), ..........) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC


    Quindi dovresti fare una ricerca di stringa per trovare FOREIGN KEY.....

    Il 2° metodo, invece, è sicuramente + efficiente. In MySQL vi è un DB chiamato information_schema dove vi sono tutte le informazioni di tutti i DB presenti.

    Nel tuo caso dovresti fare:


    $GLOBALS['sql'] = "SELECT COLUMN_NAME, REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
    FROM KEY_COLUMN_USAGE
    WHERE (TABLE_SCHEMA=\"TUO_DB\" AND TABLE_NAME=\"TUA_TABELLA\"
    AND REFERENCED_TABLE_NAME<>\"NULL\")";

    COLUMN_NAME è il nome del campo della tua tabella
    REFERENCED_TABLE_NAME è il nome della tabella a cui la chiave esterna fa riferimento
    REFERENCED_COLUMN_NAME è il nome del campo tabella a cui la chiave esterna fa riferimento

    Ovviamente se il nr. di righe restituito dalla query è zero, vuol dire che non vi sono chiavi esterne sulla tua tabella.

  3. #3
    Grazie 1000, funzionano entrambi i metodi... utilizzerò il secondo che è un po' più elegante.

  4. #4
    Oltre ad essere + elegante è sicuramente + semplice e veloce del primo.
    Ciao.

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.