index.php:
<h1>Camino entre tablas</h1> Escoja tabla: <form> <select name="bd"> <?php $user = 'root'; $pass = ''; $server = 'localhost'; $dbh = new PDO("mysql:host=$server", $user, $pass); $dbs = $dbh->query('SHOW DATABASES'); while (( $db = $dbs->fetchColumn(0) ) !== false) { echo "<option>".$db . '</option>'; } ?> </select> <input type="submit" value="Enviar"></form> <?php if (!empty($_GET['bd'])){ ?> <p>Seleccione las tablas origen y fin</p> <form action="camino.php"> <input type="hidden" name="bd" value="<?=$_GET['bd']?>"> <label>Origen:</label> <select name="origen"> <?php $dbs = $dbh->query('USE '.$_GET['bd']); $dbs = $dbh->query('SHOW TABLES'); while (( $db = $dbs->fetchColumn(0) ) !== false) { echo "<option>".$db . '</option>'; } ?> </select> <label>Fin:</label> <select name="fin"><?php $dbs = $dbh->query('USE '.$_GET['bd']); $dbs = $dbh->query('SHOW TABLES'); while (( $db = $dbs->fetchColumn(0) ) !== false) { echo "<option>".$db . '</option>'; } ?></select> <input type="submit" value="Enviar"> </form> <?php }
camino.php
<?php $bd = $_GET['bd']; $origen = $_GET['origen']; $fin = $_GET['fin']; $user = 'root'; $pass = ''; $server = 'localhost'; $dbh = new PDO("mysql:host=$server", $user, $pass); $dbs = $dbh->query('use ' . $bd); $tablas = getTables($dbh); $tablas = setFKPaths($tablas, $dbh, $bd); $caminos = []; buscarCamino($origen, $fin, $origen, 0); usort($caminos, function($a, $b) { return strlen($a) - strlen($b); }); foreach ($caminos as $camino) { $camino = explode(",", $camino); echo "<h4>select * from " . $camino[0]; for ($i = 1; $i < count($camino); $i++) { $c = explode("/", $camino[$i]); echo " join " . $c[0] . " using (" . $c[1] . ")<br/>"; } echo "</h4>"; } function getTables($dbh) { $tablas = []; $dbs = $dbh->query('SHOW TABLES'); while (( $db = $dbs->fetchColumn(0) ) !== false) { $tablas[$db] = []; } return $tablas; } function setFKPaths($tablas, $dbh, $bd) { $dbs = $dbh->query("select * from information_schema.INNODB_SYS_FOREIGN where id like '$bd%'"); $fks = $dbs->fetchAll(); foreach ($fks as $fk) { $dbs = $dbh->query("select * from information_schema.INNODB_SYS_FOREIGN_COLS where id = '$fk[0]'"); $fc = $dbs->fetchAll(); $t1 = explode("/", $fk[1])[1]; $t2 = explode("/", $fk[2])[1]; $k = $fc[0][1]; if (!in_array($t1 . "/" . $k, $tablas[$t2])) { $tablas[$t2][] = $t1 . "/" . $k; } if (!in_array($t2 . "/" . $k, $tablas[$t1])) { $tablas[$t1][] = $t2 . "/" . $k; } } return $tablas; } function buscarCamino($inicio, $fin, $camino, $prof) { global $caminos; global $tablas; if ($inicio == $fin) { $caminos[] = $camino; return; } foreach ($tablas[$inicio] as $destino) { $d = explode("/", $destino)[0]; if (strpos($camino, "," . $d . "/") === false && strpos($camino, $d . ",") === false) { buscarCamino($d, $fin, $camino . "," . $destino, $prof + 1); } } }