Home  >  Article  >  Database  >  How to Insert Multiple Rows in a Single MySQL Query with PDO?

How to Insert Multiple Rows in a Single MySQL Query with PDO?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 00:47:02859browse

How to Insert Multiple Rows in a Single MySQL Query with PDO?

PDO MySQL: Insert Multiple Rows in One Query

Inserting multiple rows in a single query using PDO can be a daunting task. However, by utilizing the power of prepared statements, we can simplify this process and avoid common errors.

The Problem: Array to String Conversion

When you encounter an "Array to string conversion" error when attempting to execute an INSERT query with multiple rows, it is likely that your PDO statement is attempting to bind an array to a placeholder instead of individual values.

Solution: Bind Individual Values

To resolve this issue, you should iterate through the values of each row and bind them individually to the prepared statement. This can be achieved using the bindParam() method of the PDO statement object.

For example, consider the following code:

$query = "INSERT INTO $table (key1, key2, key3) VALUES (:key1, :key2, :key3)";
$stmt = $pdo->prepare($query);

foreach ($data as $item) {
    $stmt->bindParam(':key1', $item['key1']);
    $stmt->bindParam(':key2', $item['key2']);
    $stmt->bindParam(':key3', $item['key3']);
    $stmt->execute();
}

This code binds each value in the $data array to the corresponding placeholder in the prepared statement and executes the query multiple times, one for each row in the array.

Alternative Solution: Use Array Bindings

Alternatively, some PDO drivers support array bindings, which allow you to bind an entire array of values to a single placeholder. However, this feature is not universally supported and may not be available in all cases.

Improved Code Example

Here is an improved version of your multipleInsert() function that uses prepared statements and binds values individually:

public function multipleInsert($table, $data = array())
{
    if (count($data) > 1) {
        $fieldnames = array_keys($data[0]);
        $query = "INSERT INTO $table (`" . implode('`, `', $fieldnames) . "`) VALUES ";
        $query .= implode(', ', array_fill(0, count($data), "(:" . implode(', :', $fieldnames) . ")"));
        $stmt = $this->start->prepare($query);

        $i = 1;
        foreach ($data as $item) {
            foreach ($item as $key => $value) {
                $stmt->bindParam(":$key$i", $item[$key]);
                $i++;
            }
        }

        $stmt->execute();

        $return['status'] = true;
        $return['lastid'] = $this->start->lastInsertId();

        return $return;
    } else {
        die('$data is less than two arrays, use single insert instead.');
    }
}

The above is the detailed content of How to Insert Multiple Rows in a Single MySQL Query with PDO?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn