$databases = array();
$path = '/Path/To/Directory';
$main_link = mysqli_connect('localhost', 'USERNAME', 'PASSWORD');
$files = scandir($path);
$ignore_files = array();
foreach($files as $file)
{
if (!in_array($file, $ignore_files))
{
$database = substr($file, 0, strpos($file,'.'));
$databases[] = $database;
mysqli_query($main_link, "DROP DATABASE IF EXISTS $database") or die ("$database 1" . mysqli_error($main_link));
mysqli_query($main_link, "CREATE DATABASE $database") or die ("$database 2" .mysqli_error($main_link));
$db_link = mysqli_connect('localhost', 'USERNAME', 'PASSWORD', $database);
//In here a whole database dump with scheam + data is executed.
mysqli_multi_query($db_link, file_get_contents($path.'/'.$file)) or die ("$database 4" .mysqli_error($db_link));
}
}
When running this script it was done very quickly (returned to browser), but it was still running queries after the browser said it was done. Why is this?
Multiple statements or multi queries must be executed with mysqli::multi_query(). The individual statements of the statement string are separated by semicolon. Then, all result sets returned by the executed statements must be fetched.
Executes one or multiple queries which are concatenated by a semicolon. Queries are sent asynchronously in a single call to the database, but the database processes them sequentially.
The mysqli_more_results() function / mysqli::more_results checks if there are any more results from a multi query. Return value: Returns TRUE if one or more result sets are available from a previous call to mysqli_multi_query(), otherwise FALSE.
mysqli_query supports async queries. See changelog on mysqli_query
. mysqli_multi_query does not mention async on the manual page specifically. Only thing mysqli_multi_query
does is tell MySQL to execute a bulk set of queries. It's up to PHP to wait for the results.
As your code stands, your sending a bulk set of SQL statements to MySQL and not waiting for any results. Only time your mysqli_multi_query
will ever die
is when the first statement fails. So, that function returns true immediately after the first statement and moves on to the next line. That's why the queries are executing after the PHP is finished. MySQL is still working. PHP has moved on.
It's best that you loop through the results of each statement before moving on with your code. The following will die
if a query fails anywhere in your batch.
mysqli_multi_query($db_link, file_get_contents($path.'/'.$file)) or die ("$database 4" .mysqli_error($db_link));
do {
if($result = mysqli_store_result($db_link)){
mysqli_free_result($result);
}
} while(mysqli_next_result($db_link));
if(mysqli_error($db_link)) {
die(mysqli_error($db_link));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With