PHP:读取文本文件并对MySQL执行SQL语句

PHP:读取文本文件并对MySQL执行SQL语句,php,file-io,Php,File Io,我想用PHP创建一个表单,它将加载一个.sql文件,读取其内容,并对MySQL数据库执行这些语句 当前正在使用函数“获取文件内容”,但该函数不起作用。我能做什么?如果您的文件中有多个查询,您必须: 将文件拆分为多个不同的查询,并对每个查询使用或。 这两个函数每次调用不能执行多个查询:引用“不支持多个查询” 用于一次发送多个查询 没有使用函数族的等效项 使用mysql命令行客户端导入文件,如下所示(当然,您必须传递正确的值): mysql--user=USERNAME--passwor

我想用PHP创建一个表单,它将加载一个.sql文件,读取其内容,并对MySQL数据库执行这些语句


当前正在使用函数“获取文件内容”,但该函数不起作用。我能做什么?

如果您的文件中有多个查询,您必须:

  • 将文件拆分为多个不同的查询,并对每个查询使用或。
    • 这两个函数每次调用不能执行多个查询:引用“不支持多个查询”
  • 用于一次发送多个查询
    • 没有使用函数族的等效项
  • 使用
    mysql
    命令行客户端导入文件,如下所示(当然,您必须传递正确的值):
    • mysql--user=USERNAME--password=password--host=localhost DATABASENAME

如果您的文件中有多个查询,您必须:

  • 将文件拆分为多个不同的查询,并对每个查询使用或。
    • 这两个函数每次调用不能执行多个查询:引用“不支持多个查询”
  • 用于一次发送多个查询
    • 没有使用函数族的等效项
  • 使用
    mysql
    命令行客户端导入文件,如下所示(当然,您必须传递正确的值):
    • mysql--user=USERNAME--password=password--host=localhost DATABASENAME

我使用这段Java代码来导入sql查询,它基本上使用特定的regexp将文件拆分为行,并去掉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");
?>


但是,由于各种原因(性能、您应该注意的安全问题等),对于生产代码来说,这不是一个很好的主意。

我使用这段Java代码来导入sql查询,它基本上使用特定的regexp将文件拆分成行,并去掉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");
?>


但由于各种原因(性能、您应该注意的安全问题等),这不是生产代码的好主意。

请发布一些代码。没有更多的信息是不可能给出答案的。请发一些代码。没有更多的信息是不可能给出答案的。