3

Is there a smart way to run multiple MySQL queries separated by a semicolon (;) in a string via PHP, perhaps with a PHP-function - and how can such a PHP function be coded? The queries MUST be separated with a colon in a string, and there should be no manual edit of that as accepted in other questions since the solution is supposed to handle this format (that's the point).

$multi_query = "INSERT INTO `stuff_5_firm` (firm_id, firmname) VALUES (0, 'Hey LTD');
INSERT INTO `stuff_6_invoice` (invoice_id, firm_id, amount) VALUES (0, 0, 500);
INSERT INTO `stuff_7_order` (order_id, firm_id, when) VALUES (0, 0, '2018-05-05'); ";
K. Kilian Lindberg
  • 2,918
  • 23
  • 30

1 Answers1

0

Here's a working solution

<?php
function function_that_does_multiple_queries($mq, $dblink) {
    // if a new line follows the ; then $q_array = explode(';\n',$mq); is suggested since queries can contain ; below
    $q_array = explode(";",$mq);
    /* 
    //To check structure of array
    echo "<pre>";
    print_r($q_array);
    echo "</pre>";
    exit();
    */
    foreach($q_array as $q){
        $q = trim($q);
        $r[] = mysqli_query($dblink,$q);
    }
    return $r;
}
$multi_query = "CREATE TABLE IF NOT EXISTS `stuff_5_firm` (
  `firmid` int(11) NOT NULL,
  `firm_name` varchar(256) NOT NULL,
  `firm_invoice_adr` text NOT NULL,
  `firm_invoice_email` varchar(256) NOT NULL,
  `firm_admin_con_to_userid` int(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `stuff_6_invoice` (
  `invoiceid` int(11) NOT NULL,
  `inv_date` datetime NOT NULL,
  `inv_due` datetime NOT NULL,
  `inv_paid` datetime NOT NULL,
  `inv_amount` int(11) NOT NULL,
  `inv_text` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;";

function_that_does_multiple_queries($multi_query, $dblink);

?>

Probably it's wiser to use mysqli_multi_query which is explained here http://php.net/manual/en/mysqli.multi-query.php (thanks to @andrewsi).

K. Kilian Lindberg
  • 2,918
  • 23
  • 30