Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/07/2003, 16:06
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

No estoy seguro de haber entendido perfectamente el problema, aunque me parece bastante interesante, de modo que he intentado implementar una solución. Me parece que algo como esto podría serte útil (habiendo modificado un poco el código original que has escrito):

Código:
<?php

mysql_connect ('localhost', 'root', ''); 

$db = "BasedeDatos";

$result = mysql_list_tables ($db);

$i = 0;
while ($i < mysql_num_rows ($result)) {
    $tabla_nombres[$i] = mysql_tablename ($result, $i);
    $i++;

} 

$cant_tablas = $i;

print "<h3>Tablas</h3>\n<ul>\n";


// Para llevar un registro de los campos que el programa recupera,
// usaremos un arreglo asociativo.
$campos_recibidos = array ();


$i = 0;
while ($i < $cant_tablas) {
    // Imprime el nombre de la tabla
    echo '<li>' . $tabla_nombres[$i] . "\n<ul>\n";

    $campos = mysql_list_fields ($db, $tabla_nombres[$i]);

    $c = 0;
    while ($c < mysql_num_fields($campos)) {
        $nombres_campos[$c] = mysql_field_name ($campos, $c) ; 

        if (isset ($campos_recibidos[$nombres_campos[$c]]))
            array_push ($campos_recibidos[$nombres_campos[$c]],
                        $tabla_nombres[$i]);
        else
            $campos_recibidos = array_merge ($campos_recibidos,
                                             array (
                                                 $nombres_campos[$c] =>
                                                 array ($tabla_nombres[$i])
                                                 ));

        // Imprime el nombre de los campos
        echo '<li>' . $nombres_campos[$c] . "</li>\n";

        $c++; 
    }

    print "</ul></li>\n";

    $i++;   
}
print "</ul>\n";

reset ($campos_recibidos);
while (list ($nombre, $tablas) = each ($campos_recibidos)){
    $cantidad = count ($tablas);

    if ($cantidad > 1) {
        print "Existe un campo llamado $nombre en las siguientes tablas:\n";
        print "<ul>\n";
        for ($i = 0; $i < $cantidad; $i++)
            print '<li>' . $tablas[$i] . "</li>\n";
        print "</ul><br />\n";
    }
}

?>
Esta solución básicamente utiliza un arreglo asociativo, en el que las llaves corresponden a los nombres de los campos que tienen tus tablas. Y para cada una de estas llaves se define un arreglo con los nombres de las tablas que contienen un campo con ese nombre.

De este modo, al final lo que se hace es observar cuáles de esos arreglos tienen más de un elemento (es decir, cuáles campos están en más de una tabla) y se imprime el resultado. Espero que sea algo similar a lo que estás necesitando.

La solución que se te ha ocurrido y has escrito tiene elementos interesantes, pero eventualmente falla porque parte del contenido del arreglo $nombres_campos, y si te das cuenta, éste arreglo cambia cada vez que procesas una tabla. Creo que con lo que debes resultar es una lista de los campos que tiene la última tabla que el programa procesó (o incluso puede listar campos de otras tablas, si hay tablas con una mayor cantidad de campos que esa última tabla).

Por último, quería tan solo decirte que la frase que usas como firma es muy bonita... es de las pocas firmas que me han parecido interesantes en alguna forma. :) Saludos.