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);
}
}
}