PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : An die MySQL Experten


Gast
2008-08-04, 20:07:45
Hallo ihr!

Habe 2 Fragen zu MySQL (in PHP)


1.) Kann ich aus einem mysqli-Objekt den Namen der Datenbank, mit welcher es gerade verbunden ist, herausbekommen?

so a la

$db = new mysqli('localhost','user','pass','database123')
echo $db->getdatabasename //sollte dann "database123" rauskommen


2.) Ich versuche herauszufinden, ob ein Table existiert. Ab PHP5 kann man ja mit information_schema arbeiten.
Was ist hierbei falsch?:
<?php
mysql = new mysqli(....);
$sql = sprintf("SELECT %s FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME = %s", "count(*)", $name);
if(mysql->query($sql)) echo "existiert!";

?>

Danke!

Gast
2008-08-04, 20:10:03
(im 2. Beispiel ist $name übrigens initialisiert, auch wenns nirgends steht)

Sephiroth
2008-08-05, 00:42:52
Hallo ihr!

Habe 2 Fragen zu MySQL (in PHP)


1.) Kann ich aus einem mysqli-Objekt den Namen der Datenbank, mit welcher es gerade verbunden ist, herausbekommen?

so a la

$db = new mysqli('localhost','user','pass','database123')
echo $db->getdatabasename //sollte dann "database123" rauskommen

wo ist denn da der sinn? du musst doch beim verbinden ohnehin die db angeben
wie dem auch sei ...
/* return name of current default database */
if ($result = $mysqli->query("SELECT DATABASE()")) {
$row = $result->fetch_row();
printf("Default database is %s.\n", $row[0]);
$result->close();
}


2.) Ich versuche herauszufinden, ob ein Table existiert. Ab PHP5 kann man ja mit information_schema arbeiten.
Was ist hierbei falsch?:
<?php
mysql = new mysqli(....);
$sql = sprintf("SELECT %s FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME = %s", "count(*)", $name);
if(mysql->query($sql)) echo "existiert!";

?>

Danke!
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'gesuchte DB' AND table_name = 'gesuchte Tabelle'
wenn da bei etwas raus kommt, existiert sie

außerdem sollte der tabellenname in hochkommata stehen. sprintf macht das nicht automatisch

Gast
2008-08-05, 01:40:18
Hallo Sephiroth, Danke schonmal.

Also "echo mysql_query($sql)" liefert bei deinem Query IMMER 1 zurück, egal nach welchem Table ich suche - es gibt aber nur eine Tabelle in der ganzen Datenbank... :(
Oder muss ich nicht auf 1/0, sondern auf ein zurückgegebenes Object o.ä. prüfen?


Wo bei der ersten Frage der Sinn ist? Die beiden Fragen hängen zusammen. Auch in deinem Query muss ich den Datenbank-Namen angeben.
Um Variabeln und somit Speicher zu sparen (und außerdem die Übersicht zu wahren) habe ich das mysqli-Objekt $db direkt im Konstruktor mit den Logindaten befüllt, ohne sie zwischenzuspeichern. Es hat auch gar keinen Sinn, die zwischenzuspeichern, denn das mysqli-Objekt $db ist die einzige Schnittstelle zwischen MySQL und der Klasse, und soll auch nur die einzige Schnittstelle sein, es wird auch erst im Desktruktor beendet. Es ist als Eigenschaft in allen Methoden sichtbar und benutzbar solange das Objekt am Laufen ist, und bringt alles mit was es braucht (scheinbar!).
In einer einzigen Methode muss ich jetzt jedoch den Query aus der anderen Frage absetzen, welcher den Datenbanknamen haben will. Der Query wird ja sowieso über $db ausgeführt, weil $db dafür zuständig ist. Und $db kennt die Datenbank, will sie aber nicht sagen.
Bin dir für deine Lösung dankbar, aber so etwas Elementares wie den Datenbanknamen im letzten Winkel zu verstecken und erst mit 4 Zeilen Code wieder zum Vorschein bringen zu müssen, ist aus OO-sicht imho ziemlich hässlich, da hat die mysqli-Klasse versagt, solange man sql-Queries noch direkt als String absetzen muss. Könnte man die evt. Überschreiben um den Namen direkt rauszubekommen?

Vielleicht habe ich aber auch nur keine Ahnung vom objekt-orientierten Gedanken und das hier soll auch nicht von der Frage mit dem Query ablenken, die eh wichtiger ist.

Gast
2008-08-05, 01:51:40
Achso, vielleicht bin ich einfach nur zu müde, aber das mit dem Datenbanknamen muss mich ja eigentlich garnicht jucken. Denn wenn ich das mit den Namen einfach aus dem query draußenlasse, wird doch vermutlich sowieso die DB aus dem mysqli-Objekt als default verwendet. Glück im Unglück, falls dem so wäre.

Kinman
2008-08-05, 09:00:49
http://at2.php.net/manual/de/mysqli.select-db.php
und

SHOW tables FROM dbname;


mfg Kinman

Gast
2008-08-05, 13:49:34
http://at2.php.net/manual/de/mysqli.select-db.php
und

SHOW tables FROM dbname;


mfg Kinman

SHOW tables FROM dbname;


da ein where dran und es ist ist äquivalent zu dem query von mir oben

http://dev.mysql.com/doc/refman/5.1/de/tables-table.html

Gast, du kannst dir ja eine eigene Mysqli Klasse schreiben, die von der originalen abgeleitet ist und dort implementierst du dir die Funktion zur Rückgabe des DB-Namens. Du kannst den Konstruktor überladen und so den Namen der DB in einer property speichern, anschließend rufst du den Konstruktor der Elternklasse auf. Analog bei select_db.

Oder muss ich nicht auf 1/0, sondern auf ein zurückgegebenes Object o.ä. prüfen?
select-queries geben stets ein result-objekt zurück (daher auch immer wahr). prüf also, ob $result->num_rows > 0 ist.


$result = $mysqli->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'gesuchte DB' AND table_name = 'gesuchte Tabelle'")
if ($result->num_rows) { // oder nutze $mysqli->affected_rows, was bei selects äquivalent ist
echo "existiert";
} else {
echo "existiert nicht";
}