Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabellen Informationen
Hey Ihr,
Ich möchte per PHP-Script folgende Informationen auslesen.
1) Ist die Tabelle mit dem Namen 'test' vorhanden?
2) Ist die Spalte mit dem Name 'feld1' vorhanden?
3) Ist die Spalte 'feld1' von folgenden Typ 'varchar(30)'?
Ich bräuchte das als Code-Schnippsel, in Form von:
$res = mysql_query("???");
Wie kann ich in einen Install-Script eine Fehlerabfrage einbauen um nach jeden erstellen einer Tabelle, zu prüfen, ob ein Fehler vorliegt oder nicht. Wenn ein Fehler vorliegt, soll das Script abbrechen. Das gleich gilt für das Eintragen von Daten mit dem Install-Script.
Ich weiß, das sind mal wieder viele Fragen, aber ich komme mal wieder nicht weiter oder aber ich hab mal wieder *einbrettvormkopf* :D
Troublegum 10-04-2002, 13:42 $result=mysql_query("SHOW fields FROM tabelle");
Wenn es einen Fehler gibt, gibt es die Tabelle nicht.
Das Ergebnis gibt für jedes Feld Name, Typ, Null, Key und Extras an.
Dann gibts noch SHOW TABLES FROM DATABASE, das listet dir alle Tabellen auf, damit kannst du auch überprüfen, ob es eine Tabelle gibt.
Also folgendes geht nicht:
$res = mysql_query("SHOW TABLES IN shop_artikel");
echo "$res";
Gibt nur eine leere Seite aus.
Troublegum 10-04-2002, 13:58 Sorry, SHOW TABLES FROM DATABASE
das gibt folgende Ausgabe:
$res = mysql_query("SHOW TABLES FROM 'php-shop'")
or die(mysql_error());
echo $res;
Fehler in der Syntax bei ''php-shop'' in Zeile 1.
Also die Datenbank heißt:
php-shop
und in dieser Datenbank sind folgende Tabellen:
shop_artikel
shop_korb
shop_rubrik
Aber er zeigt mir nichts an. Wieso?
Troublegum 10-04-2002, 14:10 Hab ich gesagt: SHOW TABLES FROM 'DATABASE' ?
Nein.
SHOW TABLES FROM DATABASE
$res = mysql_query("SHOW TABLES FROM php-shop")
or die(mysql_error());
dann kommt folgende Fehlermeldung
Fehler in der Syntax bei '-shop' in Zeile 1.
Troublegum 10-04-2002, 14:16 Das geht mit meiner SQL Frontend auch net.
Probiers mal mit Accent grave ( ` )
SHOW TABLES FROM `php-shop`
Original geschrieben von Wotan
das gibt folgende Ausgabe:
$res = mysql_query("SHOW TABLES FROM 'php-shop'")
or die(mysql_error());
echo $res;
Fehler in der Syntax bei ''php-shop'' in Zeile 1.
Dann sind wir wieder hier angekommen.:confused:
Troublegum 10-04-2002, 14:23 Nein, sind wir nicht!
Les doch mal gescheit !!
Ich sagte, probier es mal mit Accent grave. So gehts bei meiner Frontend. PHPmyadmin machts auch so...
SHOW TABLES FROM `php-shop`
Original geschrieben von Troublegum
Accent grave
Was ist das?
BrainBug 10-04-2002, 14:53 na die Zeichen, die Troublegum in seinem letzten Posting benutzt. Du kannst auf deiner Tastatur mit SHIFT+`(Taste neben ? und ß) die erzeugen. Im Zusammenspiel mit einem a, e oder o wird daraus halt ein Accent grave -> kommt aus dem französischen -> deshalb mußt du nach der Tastenkombination SHIFT+`auch noch eine weiter Taste benutzen, damit der Accent ausgegeben wird.
Gut das hat geklappt.
Aber jetzt bekomme ich folgende Ausgabe:
Resource id #2
Was bedeutet die Ausgabe?
Habe jetzt mein Script so geändert:
$res = mysql_query("SHOW TABLES FROM `php-shop`")
or die(mysql_error());
while ($row = mysql_fetch_array($res))
{
echo "$row[0]<br>";
}
Jetzt bekomme ich auch die Spaltenname ausgegeben.
Aber wie kann ich besser daraufzugreifen, statt mit $row[0]?
BrainBug 10-04-2002, 15:28 du bekommst ja ein Resultset zurück, welches wie oben von Troublegum beschrieben einige Felder beinhaltet -> und die heissen ganz zufällig:
Field Type Null Key Default Extra
d.h. du kannst mittels $row['Field'] und $row['Type'] den Feldnamen und Feldtyp in deiner while-Schleife ausgeben lassen.
Gut, wenn ich mir jetzt die Spalten ausgeben lasse, klappt das auch.
Aber ich bekomme damit nicht die Spalten.
hier mal mein Script:
echo "Abfrage der Tabbellen in der Datenbank<br>";
$res = mysql_query("SHOW TABLES FROM `php-shop`")
or die(mysql_error());
while ($row = mysql_fetch_array($res))
{
// Um diese Stelle dreht sich meine Frage.
//Hier brauch ich was anderes als der 0
echo "$row[0]<br>";
}
echo "<hr>";
echo "Abfrage der Spalten in der Tabelle der Datenbanken<br>";
$res = mysql_query("SHOW COLUMNS FROM `shop_artikel`")
or die(mysql_error());
while ($row = mysql_fetch_array($res))
{
// Hier klappt es ja mit Field und Type
echo "$row[Field] $row[Type]<br>";
}
echo "<hr>";
Troublegum 10-04-2002, 15:42 Mit folgendem Code kannst du dir selbst helfen:
reset($row);
while(list($key,$value)=each($row))
{
echo "$key > $value<br>";
}
fertig sieht es so aus:
$res = mysql_query("SHOW TABLES FROM `php-shop`")
or die(mysql_error());
while ($row = mysql_fetch_array($res))
{
reset($row);
while(list($key,$value)=each($row))
{
echo "$key > $value<br>";
}
}
PS: Wie meinst du das ? Du brauchst da was anderes als die 0 ? Sorry, versteh ich nicht. 0 ist einfacher als ein dynamischer Key à la: Tables_in_php-shop
BrainBug 10-04-2002, 15:46 :confused:
hä? Wieso stellst du eigentlich Fragen zu Dinge, die du noch gar nicht gepostet hast??
Meine Antwort geradeben bezieht sich auf die erste While-Schleife, wo du das Ergebnis von SHOW fields FROM xxx ausgibst. Außerdem, wenn du dann von der Tabelle shop_artikel die spalten anzeigen willst, warum benutzt du da plötzlich SHOW COLUMNS FROM ???? Mußt doch auch SHOW fields FROM sein.
Ach, und außerdem sehe ich gerade, daß mittlerweile Troublegum geantwortet hat. Vielleicht klärt sich ja dein Problem...
P.S.: Sorry, das mit SHOW tables FROM tabelle hatte ich irgendwie übersehen und mit SHOW fields FROM verwechselt. Also, wie Troublegum schreibt: bei SHOW tables FROM benutzt du die $row[0] Variante und bei SHOW fields FROM die von meiner letzten Antwort.
Field Type Null Key Default Extra
Das gilt für den Inhalt von Spalten.
Was gilt für den Inhalt von Tabellen?
Es gibt doch die Spalten, Tabellenkommentar,Tabellentyp.
Troublegum 10-04-2002, 15:50 @Wotan: /me meint: aufmerksamer lesen ;)
@Troublegum
ich habe das Posting aufmerksam gelesen.
@Brainbug
Es geht um folgenden Hintergrung:
Ich will ein Installscript schreiben, bei dem ich erst prüfen müß ob die Tabellen/Spalten schon da sind oder nicht.
Wenn Sie da sind muß noch der Typ überprüft werden. Da sich die Änderungen auch mal nur auf die Typen der Spalten beziehend ändern.
Weiter im Text.
Habe jetzt das Script so geändert:
$data="php-shop";
echo "Abfrage der Tabellen in der Datenbank<br>";
$res = mysql_query("SHOW TABLES FROM `$data`")
or die(mysql_error());
while ($row = mysql_fetch_array($res))
{
echo "$row[0]<br>";
echo "<hr>";
echo "Abfrage der Spalten in der Tabelle von $row[0]<br>";
$r = mysql_query("SHOW COLUMNS FROM `$row[0]`")
or die(mysql_error());
while ($ro = mysql_fetch_array($r))
{
echo "$ro[Field] $ro[Type]<br>";
}
echo "<hr>";
}
echo "<hr>";
Jetzt bekomme ich zwar die Ausgabe die ich haben will, aber noch nicht so ganz das Richtige. In der ersten while-Schleife habe ich immer noch die 0 in der $row-Abfrage. Wie kann ich die 0 ersetzen gegen Beispielsweise Field oder Columns (Columns geht aber nicht, schon probiert.).
Troublegum 10-04-2002, 16:05 @Wotan: Dann machst du dir das Leben künstlich schwer ;)
Ich würde es so machen:
Für alle Tabellen die Felder definieren, Name und Type...
Dann alle Tabellen mit SHOW FIELDS FROM tabelle abfragen.
Sollte die Abfrage schiefgehen, wird die Tabelle erstellt.
Sollte die Abfrage erfolgreich sein, alle Felder überprüfen...
Wenn eines abweicht, Tabelle löschen und erstellen.
Original geschrieben von Troublegum
...
Wenn eines abweicht, Tabelle löschen und erstellen.
Wenn ich das mache, gehen mir alle Daten verloren und das ist nicht Sinn der Aufgabe. Ich habe momentan im Netz drei meiner ersten Script an laufen. Hier muss ich nur die Typen dreier Spalten ändern und weiter Spalten hinzufügen. Aber das ist was noch nicht klappt.
Hier mal das Script im Zip-Format
*editiert*
Sch.... Proxy-Server Leitung getrennt
*/editiert*
Zumindest einmal Dein Skript.
<?
$data = "php-shop";
echo "Abfrage der Tabellen in der Datenbank<br>";
$res = mysql_query("SHOW TABLES FROM $data") or die(mysql_error());
while ($row = mysql_fetch_array($res)) {
echo "<hr>";
echo "Abfrage der Spalten in der Tabelle von $row[0]<br>";
$r = mysql_query("SHOW COLUMNS FROM $data.$row[0]") or die(mysql_error());
while ($ro = mysql_fetch_array($r)) {
echo " $ro[Field] $ro[Type]<br>";
}
}
echo "<hr>";
?>
BrainBug 10-04-2002, 16:21 ja, eigentlich habe ich schon kapiert, was du machen willst. Aber eigentlich hat auch Troublegum schon alles erschlagend beantwortet ->
bei SHOW tables FROM `$data` erhälst du ein Resultset mit eben nur einem einzigen Feld, welches natürlich den Tabellennamen der Datenbank beinhaltet. Das Feld selbst trägt sinnigerweise den Namen "Tables_in_$data". Ob du nun $row[0] oder $row[Tables_in_$data] ausgibst ist doch Jacke wie Hose, oder etwa nicht? Aber wenn du es uuuunbedingt willst, dann mach's halt mittels Variable:
$tablename="Tables_in_".$data;
echo $row[$tablename];
Oder willst du was ganz anderes?
P.S.: Ups, da haben ja schon dutzend andere vor mir geantwortet. Hier geht's ja schlag auf schlag... :D
Hier jetzt Komplettes Posting
Hier mal das Script im Zip-Format
Installiert wird aus dem Verzeichnis install mit der Datei index.setup.php
Mein Problem im der Installationsdatei ist in der Datei setup.2.php.
Wenn die Tabellen schon dasind, wir trotzdem das INSERT ausgeführt und nicht wie gewollt, eine Fehlermeldung ausgegeben.
Auch so es fehlt noch folgende Datei zur Install:
Die Ordnerstruktur sollte so aus sehen
shopordner
lang
install
Nur noch ein kleiner Hinweis am Rande: Du gibts als Datenbanknamen "php-shop" an.
Meines Wissens ist ein "-" im Namen nicht erlaubt.
Aus dem mySQL Manual:
o Ein Name (Datenbankname, Tabellenname, Spaltenname) kann aus Alphanumerischen Zeichen bestehen und den Sonderzeichen "_" und "$".
o Ein Name darf nicht aus ausschließlich Zahlen bestehen.
(Mein geänderter Code, der ja jetzt nicht mehr benötigt wird funzt, soferne Du einen synatx korrekten DB-Namen eintragst)
Schein aber nicht an dem. Sowohl auf LAMP als auch auf WAMP läuft es mit dem - in der mitte. PS dein Script läuft.
Ich würde Dir empfehlen je eine Unique id in alle Tabellen, speziell aber bei der Tabelle
shop_zahlung einzubauen, soferne das noch möglich ist. Du hast dadurch in der Folge viele Vorteile.
Einer davon könnte schon Dein Problem lösen:
$res = "CREATE TABLE shop_zahlung(
id int(10) unsigned NOT NULL auto_increment,
zahlung varchar(30) NOT NULL,
aktiv tinyint(4) NOT NULL,
PRIMARY KEY (id))";
$result = mysql_query($res, $conn);
$res = "INSERT INTO shop_zahlung VALUES (0, 'Rechnung', 1)";
$result = mysql_query($res, $conn);
$res = "INSERT INTO shop_zahlung VALUES (1, 'Nachnahme', 1)";
$result = mysql_query($res, $conn);
$res = "INSERT INTO shop_zahlung VALUES (2, 'Kreditkarte', 1)";
$result = mysql_query($res, $conn);
$res = "INSERT INTO shop_zahlung VALUES (3, 'Lastschrift', 1)";
$result = mysql_query($res, $conn);
Der Insert würde bei Wiederholung auf einen Fehler auflaufen, da der unique Key id bereits vorhanden ist.
Bei Skripten die diese Tabelle befüllen schreibst Du dann:
$res = "INSERT INTO shop_zahlung VALUES (NULL, 'Lastschrift', 1)";
damit die id über autoincrement automatisch erhöht wird, oder:
$res = "INSERT INTO shop_zahlung (zahlung, aktiv) VALUES ('Lastschrift', 1)";
Alternativ dazu könntest Du aber auch das Feld zahlung als PRIMARY KEY definieren und alles ansonsten so belassen, dann wäre es auch nicht möglich einen Record doppelt zu inserten, soferne das ohnehin nicht möglich sein soll.
Ich probiere es mal aus, melde mich dann.
gut klappt.
Aber wie mache ich es jetzt möglich ein Update zufahren.
Irgendwie steh ich heute neben mir oder auch
*brettvorkopf*:)
Ich bekomme es einfach nicht hin.
Beim Update soll geprüft werden welche Tabellen schon da sind und welche noch nicht. Die noch nicht da sind sollen erstellt werden und die Spalten die sich geändert haben von Typ sollen geändert werden.
Kannst du mir dabei helfen, aufbauend auf die Install-Scripte?
Der erste Wunsch von Dir ist denke ich ansich erledigt, da in einer Datenbank nicht zwei Tabellen mit dem gleichen Namen vorkommen dürfen und du beim Create table einen Fehler bekommst, wenn eine Tabelle mit demselben Namen bereits vorhanden ist.
Punkt zwei, sofern keine Spalte hinzukommt könnte es auf die Einfache wie folgt funktionieren, ohne viel Abfragen zu müssen.
Select * from tabelle;
drop tabelle;
create tabelle; // mit den neuen Definitionen
und dann alle Records, die Du ganz zu Beginn ausgelesen hast wieder einzeln inserten.
insert into tabelle values (....
Das sollte ja eigentlich nicht so oft vorkommen oder? Es kommt aber sicher darauf an, wieviele Records sich in den Tabellen befinden der Performance wegen.
Wie oft erfolgen tatsächlich Typkonvertierungen?
Zweite Methode:
Ich könnte mir vorstellen, daß Du für die Typkonvertierung eine Konvertierungstabelle zu Beginn erstellst, die alle Informationen beinhaltet, wie Tabellenname, Feldname, Feldtyp.
Dann das Skript, das Du ja schon im Ansatz hast, durchlaufen läßt und jedesmal wenn Du bei einem Feld mit seinem Typ vorbeischleifst direkt auf die Typkonvertierungstabelle zugreifst. Ist der Typ gleich, gehts weiter, ansonsten muß der Typ geändert werden.
Nach dem Durchlauf kann die Typkonvertierungstabelle wieder gedropped werden.
Ohne Typkonvertierungstabelle ginge es natürlich auch, über einen mehrdimensionalen Array, den Du ebenfalls zuvor aufbauen mußt, und auf seine Inhalte über convertarray[$table] [$name] zugreifst, abgehandelt werden.
Original geschrieben von hand
Punkt zwei, sofern keine Spalte hinzukommt könnte es auf die Einfache wie folgt funktionieren, ohne viel Abfragen zu müssen.
Select * from tabelle;
drop tabelle;
Geht nicht. wenn Daten in der Tabelle enthalten sind.
create tabelle; // mit den neuen Definitionen
und dann alle Records, die Du ganz zu Beginn ausgelesen hast wieder einzeln inserten.
insert into tabelle values (....
Das sollte ja eigentlich nicht so oft vorkommen oder? Es kommt aber sicher darauf an, wieviele Records sich in den Tabellen befinden der Performance wegen.
Wie oft erfolgen tatsächlich Typkonvertierungen?
Selten
Zweite Methode:
Ich könnte mir vorstellen, daß Du für die Typkonvertierung eine Konvertierungstabelle zu Beginn erstellst, die alle Informationen beinhaltet, wie Tabellenname, Feldname, Feldtyp.
Dann das Skript, das Du ja schon im Ansatz hast, durchlaufen läßt und jedesmal wenn Du bei einem Feld mit seinem Typ vorbeischleifst direkt auf die Typkonvertierungstabelle zugreifst. Ist der Typ gleich, gehts weiter, ansonsten muß der Typ geändert werden.
Nach dem Durchlauf kann die Typkonvertierungstabelle wieder gedropped werden.
Ohne Typkonvertierungstabelle ginge es natürlich auch, über einen mehrdimensionalen Array, den Du ebenfalls zuvor aufbauen mußt, und auf seine Inhalte über convertarray[$table] [$name] zugreifst, abgehandelt werden.
Wie geht das genau?
Mit drop table vernichtest Du eine Tabelle die Daten beinhaltet in wenigen Millisekunden, dafür ist drop table ja da.
Probiers mal.
Gesetzten Falles drop table würde das nicht können, was es aber tut, könnte man das noch immer über
delete from tabelle;
drop tabelle;
create tabelle;
berwekstelligen, was aber nicht notwendig ist.
Ebenso kann über drop database eine Datenbank in wenigen Milliskeunden vernichtet werden, auch wenn Tabellen darin enthalten sind und in den jeweiligen Tabellen Daten.
Kannst du das mal als Code zusammenfassen?:)
Eine Lösung der Variante zwei:
<?
// Alle oder nur jene Felder müssen definiert werden, deren
// Typ geändert werden soll.
// $array[tabellenname][Feldname] = "typ-format";
$konvert[table1][name] = "char(50)";
$konvert[table1][sex] = "char(5)";
$datenbank = "test";
$res = mysql_query("SHOW TABLES FROM $datenbank") or die(mysql_error());
while ($row = mysql_fetch_array($res)) {
echo "<hr>";
echo "Tabelle: $row[0]<br>";
$r = mysql_query("SHOW COLUMNS FROM $datenbank.$row[0]") or die(mysql_error());
while ($ro = mysql_fetch_array($r)) {
$typneu = $konvert[$row[0]][$ro[Field]];
echo " $ro[Field] $ro[Type]";
if ($typneu <> "" && $typneu != $ro[Type]) {
print " <- <b>
Achtung !! Typkonvertierung des Feldes
$row[0].$ro[Field] von $ro[Type] auf $typneu</b>";
// Hier den ALTER einbauen zur Typkonvertierung
// den neuen Typ beinhalten die Variable $typneu
// mysql_query("ALTER TABLE $datenbank.$row[0] MODIFY $ro[Field] $typneu") or die(mysql_error());
}
echo "<br>";
}
}
echo "<hr>";
?>
Original geschrieben von Wotan
Ich will ein Installscript schreiben, bei dem ich erst prüfen müß ob die Tabellen/Spalten schon da sind oder nicht.
Die Überprüfung der Tabelle geht ganz einfach:
create table if not exists TABELLENNAME ( ... )
mit den Feldern geht´s ähnlich:
alter TABELLENNAME ....
wenn´s einen Fehler gibt, war das Feld schon da
|
|