Per Schleife durch die DB's

Dragonate

Erfahrenes Mitglied
Moin Leute, da bin ich leider schon wieder ^^ Diesmal aber glaube ich ist die Frage aber nicht ganz so banal.

Also :

Über den nachfolgenden Code erzeuge ich ein Array, welches alle Datenbanknahmen erhält. Das funkt. auch, danke nochmal :

Code:
$sql1 = "SHOW DATABASES";
  $datenbanken = mysql_query($sql1) or die
  ("Anfrage Datenbanken nicht erfolgreich"); 
  
  while ($anz_datenbanken = mysql_fetch_array($datenbanken)){
	$databases_array[]= $anz_datenbanken['Database'];
	$index_databases++;
  }

In ähnlicher weise wollte ich jetzt vorgehen, um die einzelnen Namen der jeweiligen Tabellen der DB's zu bekommen. Daher habe ich zum einen eine Schleife gemacht die nacheinander die einzelnen Datenbanken auswählt, und zum anderen nehme ich ein 2D-Array zum abspeichern, hier der Code :

Code:
for($i=0;$i<$index_databases;++$i){

	mysql_select_db($databases_array[$i]) or die
	("Konnte die Datenbank nicht waehlen");
	
	$sql2 = "SHOW TABLES";
	$tabellen = mysql_query($sql2) or die
	("Anfrage Tabellen aus dieser Datenbank nicht erfolgreich"); 
	
	while ($anz_tabellen = mysql_fetch_array($tabellen)){
		$tabellen_array[][$i]= $anz_tabellen['Tables_in_".$databases_array[$i]."'];
	}
	
  }

Soweit ich weis gibt "SHOW TABLES" alle Tabellen wieder, so dass ich da auch wie im oberen Teil wieder ein mysql_fetch_array draus machen kann !?
Die letzte Zeile könnte problematisch sein. Die Befüllung des Arrays gleicht aber sehr der Methode wie im oberen Teil wo es funktioniert. Für die Bezeichnung des Tabellennames, indem wiederum die Tabellennamen stehen, habe ich einen String mit dem Namen der aktuellen Datenbank verknüpft, und das sollte dann der richtigen Bezeichnung entsprechen, wie ich sie in PhPMYadmin nachgeguckt habe.

Zum Test lasse ich in meiner HTML Seite das erste Element ausgeben :
Code:
<p><?php echo $databases_array[($i)]; ?></p>
Aber leider bleibt es leer. Findet wer das Problem ?
 
Du meinst $i verliert seinen Wert in der untersten while Schleife ?

Ansonsnten ist es doch nicht leer wenn ich es in der Schleife initialisiere odeR ?
 
Gut guck ich mir morgen mal an. Ich weis schon was du meinst, ich glaub nur das meine Vorgehensweise auch nochn Vorteil hat, weil ich wenn das klappt glaube ich alle Datenbanken mit zugehörigen Tabellen in Arrays logisch gut verknüpft habe.

Aber vielleicht geht das ja auch mit der Information_Shema Sache, versuche ich morgen beides mal !
 
Hab da mal was zusammengebastelt.
Bitte alle Befehle die du nicht genau kennst gut in der php-Anleitung nachlesen, damit du auch verstehst was da abgeht. Ansonsten kannst du es nie anpassen.

PHP:
<?php

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


$sql = 'SHOW DATABASES';
$resDb = mysql_query($sql);
while($datenbank = mysql_fetch_array($resDb)){
    //Alle Tabellen der Datenbank auflisten
    $dbName = $datenbank['Database'];
    $sql = "SHOW TABLES FROM {$dbName}";
    $resTab = mysql_query($sql);
    while($tabelle = mysql_fetch_array($resTab)){
        //Dem Array einen neuen Array mit allen Tabellennamen unterstellen
        $datenbank['tabellen'][] = $tabelle["Tables_in_{$dbName}"];    
    } 
    $datenbank['anzahlTabellen'] = count($datenbank['tabellen']);
    $datenbanken[$dbName] = $datenbank;
}
/** ergibt einen Array in der Form:
$datenbanken = 
Array(
    [testDb] => Array(
                    [Database]=>'testDb',
                    [anzahlTabellen]=>3,
                    [tabellen]=>Array([0]=>'tbl_user', [1]=>'tbl_id', [2]=>'tbl_irgendwas')
                ),
    [db2]   =>  Array(
                    [Database]=>'db2',
                    [anzahlTabellen]=>1,
                    [tabellen]=>Array('irgendeinetabelle')
                )
)

mit print_r($datenbanken); kann man das prüfen
 */

//Anwendungsbeispiel des mehrfacharrays:

//Spezifischer aufruf auf die DB namens beer
echo "beer hat {$datenbanken['beer']['anzahlTabellen']} Tabellen<br />\n<hr>";
// Durchgehen aller Datenbanken
echo "Anzahl Datenbanken: ".count($datenbanken)."<br />\n";
foreach($datenbanken as $datenbank){
    echo "<h1>{$datenbank['Database']}</h1>";
    echo "Anzahl Tabellen der Datenbank: {$datenbank['anzahlTabellen']}<br />\n";
    foreach($datenbank['tabellen'] as $index => $tabelle){
        echo "{$tabelle} hat den Index {$index}<br />\n";
    }
}
?>
 
So da bin ich wieder.

Das sieht ja super aus, du hast das gemacht was ich machen wollte, hast es nur viel cooler in einen Prozess gepackt. Das meiste verstehe ich, komme nur noch ein bisschen durcheinander, mit der Erstellung der Arrays, ob das jetzt wieder ein neues Array ist oder das vorherige erweitert wird. Das ist in PHP finde ich nicht so übersichtlich und strukturiert wie in "C" wo ich mehr Erfarhungen habe.

Was ich da konkret merkwürdig finde, sofern ich das richtig verstehe :

Hier wird doch ein Array names $datenbank erstellt, welches alle Datenbanknamen enthält right?
Code:
while($datenbank = mysql_fetch_array($resDb)){

Und hier werden aus diesem Array die gleichen Werte nochmal an ein weiteres Array übergeben
Code:
$dbName = $datenbank['Database'];

Zu dem Part würde mir eine kurze Erklärung glaube ich sehr helfen.

Ich werde dein Beispiel verwenden und versuchen es an meine Umgebung anzupassen. Coole Sache !
 
Zuletzt bearbeitet:
Wennd du unsicher bist mit der Schreibweise des "zu Array hinzufügen", kannst du auch den Befehl aray_push() nehmen. Es ist aber langsammer als die einfache Schreibweise. Auch kannst du keinen key mitgeben.

PHP:
$datenbank['tabellen'][] = $tabelle["Tables_in_{$dbName}"]; 
// Mit array_push()
array_push($datenbank['tabellen'], $tabelle["Tables_in_{$dbName}"]);

//Beim Hinzufügen mit einem key geht es nicht mit array_pus()
$datenbank['anzahlTabellen'] = count($datenbank['tabellen']);
//Das müsste man mit einem + verwirklichen. Ist aber auch nicht besonders schön
$datenbank = $datenbank + array('anzahlTabellen'=> count($datenbank['tabellen']));
//oder mit array_merge()
$datenbank = array_merge($datenbank, array('anzahlTabellen'=> count($datenbank['tabellen'])));
 
Jo da hast du recht, deine erste Variante gefällt mir da auch wesentlich besser. Ich versuche nur noch ein bisschen die Entstehung des Array-Konstrukts nachzuvollziehen, bin da aber schon auf gutem Wege!

Mir fällt da gerade aber noch eine Sache auf :

Code:
$sql = 'SHOW DATABASES';
$resDb = mysql_query($sql);
while($datenbank = mysql_fetch_array($resDb)){
    //Alle Tabellen der Datenbank auflisten
    $dbName = $datenbank['Database'];
    $sql = "SHOW TABLES FROM {$dbName}";

Du verwendest beide male die Variable SQL, wenn dann die 2te while Schleife durchgelaufen ist, und die erste wieder beginnt, steckt dann nicht der falsche Befehl in SQL ? nämlich noch "SHOW TABLES ...." ?
 
nope. Ich greiffe ja auf $resDb zu um die Schleife zu erstellen. Da ist das $sql schon längst abgeabreitet. Die Ressource (also $resDb) wird nicht jedesmal neu gebildet.
 
Zurück