Mehrere MySQL-Tabellen mit PHP anlegen

qsrs

Erfahrenes Mitglied
Hallo,

möchte mittels PHP-Script mehrere Tabellen in einer MySQL-Datenbank anlegen. Bei einer einzelnen Tabelle ist es kein Problem, nur beim Anlegen mehrerer bekomme ich Probleme. Folgendes war mein Versuch, welcher nicht geklappt hat:
PHP:
$sql = 'CREATE TABLE `test1` ('
		. ' `id` INT(10) NOT NULL AUTO_INCREMENT, '
		. ' `site_name` TEXT NOT NULL, '
		. ' PRIMARY KEY (`id`)'
		. ' )
		CREATE TABLE `test2` ('
		. ' `id` INT(10) NOT NULL AUTO_INCREMENT, '
		. ' `site_test` TEXT NOT NULL, '
		. ' PRIMARY KEY (`id`)'
		. ' )';
Ich denke der Fehler liegt nur irgendwo in der Schreibweise. Könnt ihr mir evtl. helfen? Vielen Dank.
 
Theoretisch wäre es auch nur eine Abfrage, jedoch müsste eigentlich jede (ich nenn sie mal) „Teilabfrage“ korrekterweise mit einem Semikolon abgeschlossen werden, doch die MySQL-Funktion mysql_query() hat etwas gegen Semikola.
 
Moinsen,

Stopf die SQL Statements in einem Array und lass den durch ne Schleife laufen :D

Gut is :D :D

@edit

$sql[0] = "Statement1";
$sql[1] = "Statement2";
foreach ($sql as $key => $value) {
mysql_query($value);
}

Mit einwenig Tuning bekommst du auch schnell ne Fehlerüberprüfung und eine evt. von Nöten Fallback-Routine da rein.
 
Zuletzt bearbeitet:
Danke an alle für die Antworten. Habe es jetzt mit einem Array realisiert, anstatt einzelne Queries zu definieren. Es hat alles funktioniert, eine Frage habe ich leider noch.

Ich möchte noch prüfen ob die Tabelle bereits existiert, bevor sie angelegt wird. Falls ja, soll sie gelöscht werden. Habe es wie unten stehend versucht. Allerdings scheitert es, so wie ich es vermute, wieder an der Schreibweise. Könnt ihr mir evtl. nochmal helfen? Des Weiteren habe ich es nicht in Hochkommata geschrieben, da ich Variablen verwenden möchte. Hier die SQL-Aktion:
PHP:
$sql[0] = "DROP TABLE IF EXISTS `$set_dbtable_prefix$set_dbtable_sep$set_dbtable1`;
CREATE TABLE `$set_dbtable_prefix$set_dbtable_sep$set_dbtable1` ("
		. " `id` INT(10) NOT NULL AUTO_INCREMENT, "
		. " `site_name` TEXT NOT NULL, "
		. " PRIMARY KEY (`id`)"
		. " )";
 
Eine elegante Lösung wäre folgende:

PHP:
$sql = array();

$sql[] = 'CREATE TABLE `'.$set_dbtable_prefix.$set_dbtable_sep.$set_dbtable1.'` (
               `id` INT(10) NOT NULL AUTO_INCREMENT,
               `site_name` TEXT NOT NULL,
               PRIMARY KEY (`id`)
           )';
$sql[] = 'CREATE TABLE `'.$set_dbtable_prefix.$set_dbtable_sep.$set_dbtable2.'` (
               `id` INT(10) NOT NULL AUTO_INCREMENT,
               `foo` TEXT NOT NULL,
               PRIMARY KEY (`id`)
           )';

// usw.

foreach ($sql as $query) {
    if (preg_match('/^CREATE TABLE `([^`]+)`/', $query, $match)) {
        // Abfrage versucht eine Tabelle anzulegen
        // -> evtl. schon bestehende Tabelle löschen
        mysql_query('DROP TABLE IF EXISTS `'.$match[1].'`');
    }
    mysql_query($query);
}
 
Vielen Dank für deine Antwort. Hat funktioniert.
Ich versuche gleich noch ein INSERT INTO anzuhängen, was wieder nicht so richtig klappt. Ich habe es auf folgende Weise versucht. Kannst Du mir evtl. sagen, was ich hier falsch mache?
PHP:
$sql[] = 'INSERT INTO `'.$set_dbtable_prefix.$set_dbtable_sep.$set_dbtable1.'` (`site_name`, `site_url`, `admin_email`) VALUES (''$site_name'', ''$site_url'', ''$admin_email'')';
 
Du musst die Hochkommas escapen, wenn du sie innerhalb eines von Hochkommas begrenzten Strings benutzen willst. Außerdem werden Variablen in einem solchen String nicht durch ihre Werte ersetzt.
PHP:
$sql[] = 'INSERT INTO `'.$set_dbtable_prefix.$set_dbtable_sep.$set_dbtable1.'` (`site_name`, `site_url`, `admin_email`) VALUES (\''.$site_name.'\', \''.$site_url.'\', \''.$admin_email.'\')';
 
Zurück