ebody: load data infile + Tabelle erstellen, wenn sie nicht existiert

Hallo,

hier auf der Seite ist ein PHP Script, womit man eine CSV in eine MySQL Datenbank Tabelle importieren kann: https://www.tutorials.de/threads/load-data-infile-funktioniert-nicht.365930/

Gibt es hier evtl. ein Befehl, der die DB Tabelle automatisch erstellt, wenn sie nicht vorhanden ist?

$sql =  "LOAD DATA LOCAL INFILE '$file'
                  INTO TABLE datenfeed
                  FIELDS TERMINATED BY ';'
                  ENCLOSED BY ''
                  LINES TERMINATED BY ';' ";

Ähnlich wie wenn bei http://php.net/manual/de/function.fopen.php den "mode: w" nutzt?

Gruß ebody

  1. Gibt es hier evtl. ein Befehl, der die DB Tabelle automatisch erstellt, wenn sie nicht vorhanden ist?

    Aber ja. Im Prinzip ist es exakt der gleiche Weg wie bei jeder anderen SQL-Anweisung. Es wird ein String erzeugt, der eine SQL-Anweisung enthält und dieser String wird von PHP an MySQL übergeben, von der Datenbank ausgeführt und PHP wertet dann die Rückgaben aus.

    create teable if not exists ist, was Du brauchst.

    Anfänger können die Tabelle z.B. mit phpMyAdmin erstellen und dann die Tabelle ohne Daten exportieren. Sogar das "if not exists" kann man dabei voreinstellen.

    Alternativ-Text

    Das liefert einen Text welcher eben jener String ist, den PHP an den Datenbankserver schicken soll:

    Alternativ-Text

    Daraus wird dann mit Copy und Paste ganz einfach

    $sql = 'CREATE TABLE IF NOT EXISTS `geodb_coordinates` (
      `loc_id` int(11) NOT NULL,
      `coord_type` int(11) NOT NULL,
      `lat` double DEFAULT NULL,
      `lon` double DEFAULT NULL,
      `coord_subtype` int(11) DEFAULT NULL,
      `valid_since` date DEFAULT NULL,
      `date_type_since` int(11) DEFAULT NULL,
      `valid_until` date NOT NULL,
      `date_type_until` int(11) NOT NULL,
      KEY `coord_loc_id_idx` (`loc_id`),
      KEY `coord_lon_idx` (`lon`),
      KEY `coord_lat_idx` (`lat`),
      KEY `coord_type_idx` (`coord_type`),
      KEY `coord_stype_idx` (`coord_subtype`),
      KEY `coord_since_idx` (`valid_since`),
      KEY `coord_until_idx` (`valid_until`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;';
    

    gemacht - und fertig!

    Natürlich kann man den Befehl auch ändern oder selbst entwerfen. Die weitere Verarbeitung, insbesondere die Fehlerprüfung erfolgt dann im Prinzip so wie bei einem INSERT, UPDATE oder DELETE. Es werden ja keinen Ergebnis-Zeilen, dafür aber Status- bzw. Fehlermeldungen zurückgeliefert.

    Noch etwas: Anfänger verrennen sich sehr oft, weil die im Web natürlich massenhaft veraltete Literatur finden. Wie baust Du die Verbindung zur Datenbank auf? Mit Rücksicht auf PHP7 solltest Du PDO oder mysqli verwenden. Älteres Zeug wird in PHP7 nicht mehr gehen!

  2. Tach!

    Gibt es hier [bei LOAD DATA INFILE] evtl. ein Befehl, der die DB Tabelle automatisch erstellt, wenn sie nicht vorhanden ist?

    Nein, gibt es nicht. Das ist ja eine CSV-Datei und darin sind keine Typinformationen, anhand derer die Tabelle erstellt werden kann.

    Außerdem lässt sich die Frage sehr einfach anhand des Handbuchs klären. Denn da sind alle Möglichkeiten aufgeführt, die die Syntax von LOAD DATA INFILE bietet.

    dedlfix.

    1. Hallo dedlfix,

      Nein, gibt es nicht. Das ist ja eine CSV-Datei und darin sind keine Typinformationen, anhand derer die Tabelle erstellt werden kann.

      Aber bei PHPMyAdmin gibt es die Option SQL zu importieren. Das Erraten der notwendigen Variablentypen hat geklappt. Allerdings war die Verwendung solcher Tools nicht Bestandteil der Frage.

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.