Dotaz SHOW TABLES nad databází

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
James
Člen | 54
+
0
-

Zdravím,

potřebuji provést dotaz SHOW TABLES nad databází, ale z databáze se mi vypíše vždy pouze první tabulka, potřeboval bych nějak získat, nejlépe do pole obsah všech tabulek v databázi. Nevěděl by někdo jak tento můj kód modifikovat, nebo případně zvolit jiný postup?

Díky za radu

<?php
public function showTables()
{
    return $this->connection->query('SHOW TABLES')->fetch();
}
?>
jiri.pudil
Nette Blogger | 1032
+
0
-

fetch() ti vrací jen první výsledek, zkus fetchAll()

James
Člen | 54
+
0
-

fetchAll() nad dotazem mi po vypsaní pomocí var_dump vrací objekt, potřeboval bych názvy tabulek dostat do pole, se kterým by se nechalo dál pracovat

array(3) {
[0]⇒ object(Nette\Database\Row)#122 (1) { [„Tables_in_quickstart“]⇒ string(4) „list“ }
[1]⇒ object(Nette\Database\Row)#119 (1) { [„Tables_in_quickstart“]⇒ string(4) „task“ }
[2]⇒ object(Nette\Database\Row)#121 (1) { [„Tables_in_quickstart“]⇒ string(4) „user“ }
}

Editoval James (13. 3. 2013 9:58)

Jan Mikeš
Člen | 771
+
0
-

Bud projdi vysledek z fetchAll() pomoci foreache, nebo misto fetchAll() pouzij fetchPairs()

James
Člen | 54
+
0
-

Když projdu výsledek z fetchAll() pomocí foreach tak mi to hlásí chybu

htmlspecialchars() expects parameter 1 to be string, object given

Jaký je rozdíl mezi fetchAll() a fetchPairs()?

castamir
Člen | 629
+
0
-

$this->connection->query("show full tables")->fetchPairs()

Názvy tabulek máš jako klíče, jako hodnoty je získáš pomocí array_keys()

Jan Mikeš
Člen | 771
+
0
-

fetchAll() ti vraci pole objektu, kdezto fetchPairs() ti vraci v zavislosti na parametrech bud primo pole s hodnotami, nebo bez uvedeni druheho parametru pole radku stejne jako v pripade fetchAll()

EDIT do tretice:
fetchPairs()
fetchAll()

Editoval Lexi (13. 3. 2013 11:36)

castamir
Člen | 629
+
0
-

@James fetchAll() ti převede všechny nalezené řádky do pole, kde každý prvek reprezentuje jeden řádek. Každý řádek je v tomto případě instance třídy Nette\Database\Row a obsahuje hodnoty daného řádku.

fetchPairs ti vytvoří jednoduché asociativní pole dle výsledků. Nad Nette\Database\Statement můžeš použít fetchPairs pouze nad výsledkem, jež sám o sobě obsahuje 2 sloupce. Výsledné asociativní pole pak bude mít strukturu 1. sloupec => 2. sloupec

Editoval castamir (13. 3. 2013 10:39)

James
Člen | 54
+
0
-

Moc děkuji, tohle bylo přesně to co jsem potřeboval vyřešit

castamir
Člen | 629
+
0
-

@Lexi Hledáš na špatném místě. query vrací instanci Nette\Database\Statement. A API Statementu už hledané metody má.

Jan Mikeš
Člen | 771
+
0
-

Diky, upravil jsem si to ve svem prispevku ;)

castamir
Člen | 629
+
0
-

@Lexi všechno špatně. Odkazuješ na Connection ne na Statement. Ty metody jsou v obou třídách různé, mají různé parametry i chování!


Pro jistotu ještě jednou zopakuju řešení:

$originalData = $this->connection->query("show full tables")->fetchPairs();
array_keys($originalData); // vraci pole nazvu tabulek

Solved, close?

Editoval castamir (13. 3. 2013 11:34)