За последние 24 часа нас посетили 17132 программиста и 1835 роботов. Сейчас ищут 1640 программистов ...

Как средствами PHP - создать таблицы в БД из tables.sql ???

Тема в разделе "PHP и базы данных", создана пользователем антигерой, 19 фев 2017.

  1. антигерой

    антигерой Активный пользователь

    С нами с:
    22 фев 2009
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    RU, Севастополь
    Есть обычный файл sql с описанием таблиц - которые надо создать в базе MySQL, я могу конечно парсер простенький написать. Но вопервых лень, вовторых думаю есть встроенная функция для этого. Иль как передать в SQL запросе - ссылку на файл самому MySQL-ю ???

    Она есть(функция) ? Иль может парсер у кого готовый ? Иль самому написать парсер ?
     
  2. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Самый удобный способ все же
    Код (Text):
    1. mysql -u username -p database_name < file.sql
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Или просто выполнить весь текст через mysqli_query...
     
  4. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Нашел на github скрипт импорта,он там на mysql,переписал его под mysqli.Попробовал на файле table.sql со следующим содержанием:

    Код (Text):
    1. CREATE TABLE Books
    2. (
    3.    BookID SMALLINT NOT NULL PRIMARY KEY,
    4.    BookTitle VARCHAR(60) NOT NULL,
    5.    Copyright YEAR NOT NULL
    6. )
    7. ENGINE=INNODB;
    Все отработало как надо.Вот собственно слегка отредактированный мной скрипт:

    PHP:
    1. <?php
    2. // Name of the file
    3. $filename = 'file.sql';
    4. // MySQL host
    5. $mysql_host = 'localhost';
    6. // MySQL username
    7. $mysql_username = 'root';
    8. // MySQL password
    9. $mysql_password = '';
    10. // Database name
    11. $mysql_database = 'test';
    12.  
    13. // Connect to MySQL server
    14. $link = mysqli_connect($mysql_host, $mysql_username, $mysql_password,$mysql_database);
    15.     printf("Connect failed: %s\n", mysqli_connect_error());
    16.     exit();
    17. }
    18. // Temporary variable, used to store current query
    19. $templine = '';
    20. // Read in entire file
    21. $lines = file($filename);
    22. // Loop through each line
    23. foreach ($lines as $line)
    24. {
    25. // Skip it if it's a comment
    26. if (substr($line, 0, 2) == '--' || $line == '')
    27.     continue;
    28.  
    29. // Add this line to the current segment
    30. $templine .= $line;
    31. // If it has a semicolon at the end, it's the end of the query
    32. if (substr(trim($line), -1, 1) == ';')
    33. {
    34.     // Perform the query
    35.     mysqli_query($link,$templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysqli_error() . '<br /><br />');
    36.     // Reset temp variable to empty
    37.     $templine = '';
    38. }
    39. }
    40. echo "Tables imported successfully";
    41. ?>
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ну как бы да, но как бы можно часть этого кода на свалку выкинуть и просто делать одним запросом как я и сказал. А выкинуть, потому что в коде допущена глупейшая ошибка в работе с синтаксисом языка структурированных запросов, благодаря которой этот "парсер" с удовольствием убьет текст запроса, а штатный анализатор рсубд - нет.
     
  6. антигерой

    антигерой Активный пользователь

    С нами с:
    22 фев 2009
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    RU, Севастополь
    Код (Text):
    1. mysql -u USER -p PASSWORD DATABASE < /file.sql
    А вот если пароль - ПУСТОЙ ? Парсер добирается до имени базы данных и воспринимает его как пароль... Вот тут затык уменя.
    Иль путь для SQL по другому виду указать, чем для PHP ???

    Чисто взять файл в переменную через: file_get_content и отправить в базу запросом - через mysqli_query($db, $query) ? А ничего, что там сразу несколько таблиц прописано ?
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    И чего с того? "Парсер", предложенный сверху - тоже со всеми таблицами работает. Выполнение через консольный клиент - тоже со всеми таблицами работает.
    То просто не указываешь флаг пи. Это же очевидно.
     
  8. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Код (Text):
    1. mysql -uroot test <table.sql
     
  9. антигерой

    антигерой Активный пользователь

    С нами с:
    22 фев 2009
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    RU, Севастополь
    Да - через file_get_content сработало нормально, благодарю за наколку.

    Необязательность очевидна для тех, кто уже знает - что данный параметр именно необязателен : - )))
     
  10. антигерой

    антигерой Активный пользователь

    С нами с:
    22 фев 2009
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    RU, Севастополь
    Через file_get_content - как-то совершенно непонятно и нестабильно работает. То создаёт, то не создаёт. Ваще какой-то плавающий глюк. Сутки с ним бился - так и недогнал в чём причина.

    Через передачу в MySQL ссылки на файл - вообще не работает, наверное проблема в непонимании пути SQL-ем, который не совсем чётко совпадает с адресацией в PHP.

    А вот через парсер - работает стабильно и всегда.