Content · Programming · PHP

Inserting Database Records with PDO

Execute an INSERT statement using a prepared PDO statement and bound values. Never infer success solely from a returned ID; handle PDO exceptions and transaction boundaries.

1 views Published Oct 17, 2026 Updated Oct 17, 2026 Know-Stuff

Execute an INSERT statement using a prepared PDO statement and bound values.

The examples focus on the operation itself, including the important distinction: An UPDATE modifies an existing row; INSERT creates a row.

What It Does


Use the examples below to observe the behavior on a small dataset before extending it to application code.

Before You Start


The examples use PHP 8.2+ features where shown. Database snippets require the corresponding PDO driver, demo tables, and credentials configured outside source code.

Example 1: Basic Use


The positional placeholders bind two values; lastInsertId is driver-specific and meaningful for generated primary keys.

<?php
$pdo = new PDO(
    "mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
    getenv("DB_USER") ?: "app",
    getenv("DB_PASSWORD") ?: "",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$email = '[email protected]';
$stmt = $pdo->prepare("INSERT INTO users (email, active) VALUES (?, ?)");
$stmt->execute([$email, 0]);
echo $pdo->lastInsertId();

This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.

Example 2: Checking Behavior


The positional placeholders bind two values; lastInsertId is driver-specific and meaningful for generated primary keys.

<?php
$pdo = new PDO(
    "mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
    getenv("DB_USER") ?: "app",
    getenv("DB_PASSWORD") ?: "",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$email = '[email protected]';
$stmt = $pdo->prepare("INSERT INTO users (email, active) VALUES (?, ?)");
$stmt->execute([$email, 0]);
echo $pdo->lastInsertId();

This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.

Example 3: Practical Example


The positional placeholders bind two values; lastInsertId is driver-specific and meaningful for generated primary keys.

<?php
$pdo = new PDO(
    "mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
    getenv("DB_USER") ?: "app",
    getenv("DB_PASSWORD") ?: "",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$email = '[email protected]';
$stmt = $pdo->prepare("INSERT INTO users (email, active) VALUES (?, ?)");
$stmt->execute([$email, 0]);
echo $pdo->lastInsertId();

This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.

Important Behavior and Edge Cases


Never infer success solely from a returned ID; handle PDO exceptions and transaction boundaries.

Comparison with Related Approaches


ApproachDifference
Inserting Database Records with PDOExecute an INSERT statement using a prepared PDO statement and bound values.
Related API or alternativeAn UPDATE modifies an existing row; INSERT creates a row.

Common Beginner Mistakes


MistakeCorrect approach
Ignoring the operation-specific limitsNever infer success solely from a returned ID; handle PDO exceptions and transaction boundaries.
Confusing it with a related APIAn UPDATE modifies an existing row; INSERT creates a row.

Key Takeaways


  • Execute an INSERT statement using a prepared PDO statement and bound values.
  • Never infer success solely from a returned ID; handle PDO exceptions and transaction boundaries.
  • An UPDATE modifies an existing row; INSERT creates a row.

Use Inserting Database Records with PDO when its documented behavior matches the problem. Test the relevant edge cases in your own runtime before deploying it.

Share this resourceSend this page to someone who may find it useful.