Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Tabellen Informationen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Tabellen Informationen


 
Wotan
10-04-2002, 13:30 
 
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.

 
Wotan
10-04-2002, 13:45 
 
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

 
Wotan
10-04-2002, 14:02 
 
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

 
Wotan
10-04-2002, 14:12 
 
$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`

 
Wotan
10-04-2002, 14:20 
 
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`

 
Wotan
10-04-2002, 14:25 
 
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.

 
Wotan
10-04-2002, 14:58 
 
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.

 
Wotan
10-04-2002, 15:36 
 
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.

 
Wotan
10-04-2002, 15:47 
 
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 ;)

 
Wotan
10-04-2002, 15:59 
 
@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.

 
Wotan
10-04-2002, 16:10 
 
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.

 
Wotan
10-04-2002, 16:15 
 
Hier mal das Script im Zip-Format

*editiert*
Sch.... Proxy-Server Leitung getrennt
*/editiert*

 
hand
10-04-2002, 16:19 
 
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 "&nbsp;&nbsp;&nbsp;&nbsp;$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

 
Wotan
10-04-2002, 16:24 
 
Hier jetzt Komplettes Posting

Hier mal das Script im Zip-Format

Installiert wird aus dem Verzeichnis install mit der Datei index.setup.php

 
Wotan
10-04-2002, 16:35 
 
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
&nbsp;&nbsp;lang
&nbsp;&nbsp;install

 
hand
10-04-2002, 16:52 
 
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)

 
Wotan
10-04-2002, 16:54 
 
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.

 
hand
10-04-2002, 17:22 
 
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.

 
Wotan
10-04-2002, 17:28 
 
Ich probiere es mal aus, melde mich dann.

 
Wotan
10-04-2002, 17:36 
 
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?

 
hand
10-04-2002, 18:03 
 
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.

 
Wotan
10-04-2002, 18:16 
 
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?

 
hand
10-04-2002, 18:52 
 
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.

 
Wotan
10-04-2002, 18:54 
 
Kannst du das mal als Code zusammenfassen?:)

 
hand
10-04-2002, 19:22 
 
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 "&nbsp;&nbsp;&nbsp;&nbsp;$ro[Field]&nbsp;&nbsp;$ro[Type]";
if ($typneu <> "" && $typneu != $ro[Type]) {
print "&nbsp;&nbsp;&nbsp;&lt;- <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>";
?>

 
Titus
11-04-2002, 20:46 
 
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:48 Uhr.