Skip to content

Insert data into multiple tables using one form

To insert data into multiple tables using one form in PHP, you can use multiple INSERT INTO statements in a single string, or you can use multiple individual SQL statements, one for each table.

Here is an example of using multiple INSERT INTO statements in a single string:

Example of using multiple INSERT INTO statements in a single string

php
<?php

$sql = "INSERT INTO table1 (column1, column2) VALUES ('$value1', '$value2');
        INSERT INTO table2 (column1, column2) VALUES ('$value3', '$value4');
        INSERT INTO table3 (column1, column2) VALUES ('$value5', '$value6')";

if ($conn->multi_query($sql) === true) {
    do {
        if ($result = $conn->store_result()) {
            $result->free();
        }
    } while ($conn->next_result());
    echo "New records created successfully";
} else {
    echo "Error: " . $conn->error;
}

<div class="alert alert-info flex not-prose"> Watch a course Learn object oriented PHP</div>

Here is an example of using multiple individual SQL statements:

Example of using multiple individual SQL statements

php
<?php

$sql1 = "INSERT INTO table1 (column1, column2) VALUES ('$value1', '$value2')";
$sql2 = "INSERT INTO table2 (column1, column2) VALUES ('$value3', '$value4')";
$sql3 = "INSERT INTO table3 (column1, column2) VALUES ('$value5', '$value6')";

$success = true;
if ($conn->query($sql1) === true) {
    if ($conn->query($sql2) === true) {
        if ($conn->query($sql3) === true) {
            echo "New records created successfully";
        } else {
            $success = false;
            echo "Error on table3: " . $conn->error;
        }
    } else {
        $success = false;
        echo "Error on table2: " . $conn->error;
    }
} else {
    $success = false;
    echo "Error on table1: " . $conn->error;
}

<div class="alert alert-warning not-prose"> Important: Executing multiple queries without a transaction risks data inconsistency if one fails. Use $conn->begin_transaction(), $conn->commit(), and $conn->rollback() to ensure atomicity. Additionally, direct variable interpolation is vulnerable to SQL injection. Always use prepared statements ($conn->prepare()) for production code. </div>

Dual-run preview — compare with live Symfony routes.