2009-04-11 11 views
2

Existe-t-il un moyen d'énumérer les tables utilisées dans la requête mysql?Énumérer les tables utilisées dans la requête mysql?

Disons que je recherche:

SELECT * FROM db_people.people_facts pf 
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id 
INNER JOIN db_people.people p ON sm.target_id = p.object_id 
ORDER BY pf.object_id DESC 

Et je veux dans le tableau de retour:

$tables = array(
[0] => 'db_people.people_facts', 
[1] => 'db_system.connections', 
[2] => 'db_people.people', 
); 

Répondre

0

La solution marquée comme bonne retournera uniquement les tables de résultats. Mais si vous faites la prochaine requête, il échouera:

SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id 

Will retour seuls les utilisateurs et non les chats et les chiens tables.

La meilleure solution est de trouver un bon analyseur, une autre solution utilise REGEX et EXPLIQUEZ requête (plus d'informations dans le lien suivant):

Get mysql tables in a query

Mais je pense qu'une autre bonne solution est liste toutes les tables et les rechercher dans la requête, vous pouvez mettre en cache la liste des tables.

EDIT: Lorsque vous recherchez des tables, mieux utiliser un preg comme:

// (`|'|"|)table_name(\1|$) 
if(preg_match('/(`|\'|"|)table_name(\1|$)/i', $query)) 
    // found 

Sinon, il peut renvoyer des faux positifs avec par exemple "table_name2", "table_name3" ... nom_table retournera TROUVE deux fois.

4

Oui, vous pouvez obtenir des informations sur les tables et les colonnes qui font partie d'un résultat de requête. C'est ce qu'on appelle les méta-données de l'ensemble de résultats.

La seule solution PHP pour les métadonnées des ensembles de résultats MySQL est d'utiliser l'extension MySQLi et la fonction mysqli_stmt::result_metadata().

$stmt = $mysqli->prepare("SELECT * FROM db_people.people_facts pf 
    INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id 
    INNER JOIN db_people.people p ON sm.target_id = p.object_id 
    ORDER BY pf.object_id DESC"); 

$meta = $stmt->result_metadata(); 

$field1 = $meta->fetch_field(); 

echo "Table for field " . $field1->name . " is " . $field1->table . "\n"; 

Vous devrez créer vous-même la série de tables distinctes utilisées dans la requête, en bouclant les champs.

+0

Nice. Apprendre quelque chose de nouveau chaque jour. –

Questions connexes