2

I'm wondering if prepared statements work the same as a normal mysql_query with multiple VALUES.

INSERT INTO table (a,b) VALUES ('a','b'), ('c','d');

VS

$sql = $db->prepare('INSERT INTO table (a,b) VALUES (?, ?);

If I use the prepared statement in a loop, is MySQL optimizing the insert in the background to work like it would in the first piece of code there, or is it just like running the first piece of code inside a loop with one value each time ?

3 Answers 3

11

I went ahead and ran a test where one query uses a prepared statement, and the other builds the entire query then executes that. I'm probably not making what I'm wanting to know easy to understand.

Here's my test code. I was thinking prepared statements sort of held back execution until a $stmt->close() was called to optimize it or something. That doesn't appear to be the case though as the test that builds the query using real_escape_string is at least 10 times faster.

<?php

$db = new mysqli('localhost', 'user', 'pass', 'test');

$start = microtime(true);
$a = 'a';
$b = 'b';

$sql = $db->prepare('INSERT INTO multi (a,b) VALUES(?, ?)');
$sql->bind_param('ss', $a, $b);
for($i = 0; $i < 10000; $i++)
{
    $a = chr($i % 1);
    $b = chr($i % 2);
    $sql->execute();
}
$sql->close();

echo microtime(true) - $start;

$db->close();

?>
Sign up to request clarification or add additional context in comments.

1 Comment

I wanted to a similar thing (multiple inserts), as this answer is marked correct, is this the optimized solution? Also "as the test that builds the query using real_escape_string is at least 10 times faster." where is that test?
0

If you use the prepared statement in a loop, it will be more efficient than running the raw query each time because of analysis that only needs to be done once with the prepared statement. So no, it is not the same, to that extent.

1 Comment

But it would be faster if you use multiple-rows insert syntax because when you use it you will be sending the query to the database only once so the overhead of multiple requests are reduced
0
public function insertMulti($table, $columns = array(), $records = array(), $safe = false) {
    self::$counter++;
    //Make sure the arrays aren't empty
    if (empty($columns) || empty($records)) {
        return false;
    }

    // If set safe to true: set records values to html real escape safe html
    if($safe === true){
        $records = $this->filter($records);
    }

    //Count the number of fields to ensure insertion statements do not exceed the same num
    $number_columns = count($columns);

    //Start a counter for the rows
    $added = 0;

    //Start the query
    $sql = "INSERT INTO " . $table;

    $fields = array();
    //Loop through the columns for insertion preparation
    foreach ($columns as $field) {
        $fields[] = '`' . $field . '`';
    }
    $fields = ' (' . implode(', ', $fields) . ')';

    //Loop through the records to insert
    $values = array();
    foreach ($records as $record) {
        //Only add a record if the values match the number of columns
        if (count($record) == $number_columns) {
            $values[] = '(\'' . implode('\', \'', array_values($record)) . '\')';
            $added++;
        }
    }
    $values = implode(', ', $values);

    $sql .= $fields . ' VALUES ' . $values;
    //echo $sql;
    $query = $this->dbConnection->query($sql);

    if ($this->dbConnection->error) {
        $this->errorLog($this->dbConnection->error, $sql);
        return false;
    } else {
        return $added;
    }
}

This function for first prepare the one INSERT query with multiple row values and Insert it once. But this is not for bulk insert at once.

1 Comment

This snippet is not secure. A good read: phpdelusions.net/pdo/sql_injection_example

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.