PHP: чтение текстового файла и выполнение операторов SQL для MySQL - PullRequest
1 голос
/ 03 марта 2010

Я хочу создать в PHP форму, которая будет загружать файл .sql, читать его содержимое и выполнять эти инструкции для базы данных MySQL.

В настоящее время используется функция get_file_contents, но она не работает. Что я могу сделать?

Ответы [ 2 ]

1 голос
/ 03 марта 2010

Если у вас есть несколько запросов в вашем файле, вам придется либо:

  • разбить файл на несколько разных запросов и использовать mysql_query или mysqli_query для каждого из этих запросов.
    • эти две функции не могут выполнять более одного запроса за вызов: цитирование справочной страницы mysql_query: " несколько запросов не поддерживаются "
  • используйте mysqli_multi_query для отправки нескольких запросов одновременно
    • Нет аналога, использующего семейство функций mysql_*
  • используйте клиент командной строки mysql, чтобы импортировать файл, с чем-то вроде этого (вам, конечно, придется передать правильные значения) :
    • mysql --user=USERNAME --password=PASSWORD --host=localhost DATABASENAME < your-file.sql
0 голосов
/ 03 марта 2010

Я использую этот бит Java-кода для импорта sql-запросов, он в основном разбивает файл на строки с использованием определенного регулярного выражения и удаляет префиксы комментариев, созданные mysqldump. портирование этого на PHP должно быть довольно простым.

public static void importSQL(Connection conn, InputStream in) throws SQLException
{
    Scanner s = new Scanner(in);
    s.useDelimiter("(;\\s*(\r)?\n)|(--\n)");
    Statement st = null;
    int lineNum = 0;
    try
    {
        st = conn.createStatement();
        while (s.hasNext())
        {
            String line = s.next();
            if (line.startsWith("/*!") && line.endsWith("*/"))
            {
                int i = line.indexOf(' ');
                line = line.substring(i + 1, line.length() - " */".length());
            }

            if (line.trim().length() > 0)
            {
                try
                {
                    st.execute(line);
                }
                catch (SQLException e)
                {
                    logger.error("Error executing line #" + lineNum +  " : " + line , e);
                    throw e;
                }
            }

            lineNum++;
        }
    }
    finally
    {
        if (st != null) st.close();
    }
}

альтернативой является вызов командной строки mysql через систему. что-то вроде:

<?php
system("mysql -u $user -p$password $dbname < $filename");
?>

но это не очень хорошая идея для производственного кода по разным причинам (производительность, последствия для безопасности, о которых вы должны знать, и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...