使用php执行*.sql文件

使用php执行*.sql文件,php,mysql,Php,Mysql,我需要执行一个.sql文件,其中有大约48个表要创建。它由以“;”结尾的注释和sql命令组成。有没有一种方法可以运行这些sql命令,将它们一次带到单个字符串。我的意思是我需要使用php一次运行整个文件。我可以使用mysql\u查询函数逐行执行该文件。但我需要做的是一次执行所有这些,就像在phpmyadmin中一样 有办法吗。我需要使用php来实现这一点。有人能帮我吗?你在找什么 另一种方法是使用命令行客户端: mysql -u USERNAME -p DATABASENAME < F

我需要执行一个.sql文件,其中有大约48个表要创建。它由以“;”结尾的注释和sql命令组成。有没有一种方法可以运行这些sql命令,将它们一次带到单个字符串。我的意思是我需要使用php一次运行整个文件。我可以使用mysql\u查询函数逐行执行该文件。但我需要做的是一次执行所有这些,就像在phpmyadmin中一样

有办法吗。我需要使用php来实现这一点。有人能帮我吗?

你在找什么

另一种方法是使用命令行客户端:

mysql -u USERNAME -p DATABASENAME < FILE.SQL 
mysql-u USERNAME-p DATABASENAME

您可能可以将其与
exec
和/或
system
一起使用,但是您必须在
-p
之后提供密码。上面的命令将提示您输入它。

您可以分解查询

function batch($file){
    $queries = explode(";", $file);
    foreach($queries as $query){
        mysql_query($query);
    }
}

我已经编写了一个非常通用的函数,它将
$file
作为输入,并将在mysql数据库上执行它

下面的代码是在codeigniter中编写的;但对于任何框架来说,修改都是非常容易的。这段代码尽量便于移植,因此可以在许多环境中工作。它不做任何花哨的字符串解析或拆分;相反,它依赖于大量使用mysql或php内置方法

<?php
//This function will take a given $file and execute it directly in php.
//This code is for use within a codeigntier framework application
//It tries three methods so it should almost allways work.
//method 1: Directly via cli using mysql CLI interface. (Best choice)
//method 2: use mysqli_multi_query
//method 3: use PDO exec
//It tries them in that order and checks to make sure they WILL work based on various requirements of those options
public function execute_sql($file)
{
    //1st method; directly via mysql
    $mysql_paths = array();
    //use mysql location from `which` command.
    $mysql = trim(`which mysql`);
    if (is_executable($mysql))
    {
        array_unshift($mysql_paths, $mysql);
    }
    //Default paths
    $mysql_paths[] = '/Applications/MAMP/Library/bin/mysql';  //Mac Mamp
    $mysql_paths[] = 'c:\xampp\mysql\bin\mysql.exe';//XAMPP
    $mysql_paths[] = '/usr/bin/mysql';  //Linux
    $mysql_paths[] = '/usr/local/mysql/bin/mysql'; //Mac
    $mysql_paths[] = '/usr/local/bin/mysql'; //Linux
    $mysql_paths[] = '/usr/mysql/bin/mysql'; //Linux
    $database = escapeshellarg($this->db->database);
    $db_hostname = escapeshellarg($this->db->hostname);
    $db_username= escapeshellarg($this->db->username);
    $db_password = escapeshellarg($this->db->password);
    $file_to_execute = escapeshellarg($file);
    foreach($mysql_paths as $mysql)
    {
        if (is_executable($mysql))
        {
                $execute_command = "\"$mysql\" --host=$db_hostname --user=$db_username --password=$db_password $database < $file_to_execute";
                $status = false;
                system($execute_command, $status);
                return $status == 0;
        }
    }

    if ($this->db->dbdriver == 'mysqli')
    {
        //2nd method; using mysqli
        mysqli_multi_query($this->db->conn_id,file_get_contents($file));
        //Make sure this keeps php waiting for queries to be done
        do{} while(mysqli_more_results($this->db->conn_id) && mysqli_next_result($this->db->conn_id));
        return TRUE;
    }

    //3rd Method Use PDO as command. See http://stackoverflow.com/a/6461110/627473
    //Needs php 5.3, mysqlnd driver
    $mysqlnd = function_exists('mysqli_fetch_all');

    if ($mysqlnd && version_compare(PHP_VERSION, '5.3.0') >= 0) 
    {
        $database = $this->db->database;
        $db_hostname = $this->db->hostname;
        $db_username= $this->db->username;
        $db_password = $this->db->password;
        $dsn = "mysql:dbname=$database;host=$db_hostname";
        $db = new PDO($dsn, $db_username, $db_password);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
        $sql = file_get_contents($file);
        $db->exec($sql);

        return TRUE;

    }

    return FALSE;
}