L'enumerazione delle tabelle in mysql query?
Domanda
C'è un modo per enumerare le tabelle in mysql query?
Diciamo che ho query :
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
E voglio in cambio di matrice:
$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);
Soluzione
La soluzione contrassegnati come buona volontà di restituire solo il risultato tabelle.Ma se si fa la query successiva si avrà esito negativo:
SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id
Sarà restituire solo gli utenti e non cani e gatti tabelle.
La soluzione migliore è trovare un buon parser, un'altra soluzione è usare REGEX e SPIEGARE query (ulteriori informazioni nel link seguente):
Ottenere mysql tabelle in una query
Ma penso che un'altra buona soluzione è elenco di tutte le tabelle e di ricerca all'interno della query, è possibile memorizzare la lista dei tavoli.
MODIFICA:Durante la ricerca per le tabelle, è meglio usare un preg come:
// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
// found
Se non, si può tornare falsi positivi, per esempio, "table_name2", "table_name3"...table_name tornerà TROVATO due volte.
Altri suggerimenti
Sì, è possibile ottenere informazioni sulle tabelle e colonne che fanno parte di un risultato della query. Questo si chiama metadati set di risultati .
L'unica soluzione PHP per MySQL metadati risultato è impostato per utilizzare l'estensione MySQLi e la funzione 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";
Si dovrà costruire la serie di tabelle distinte utilizzate nella query da soli, dai loop sui campi.
A seconda di quello che stai usando per, MySQL di spiegare potrebbe fare il trucco per voi: