📖 Scenario: You are building a simple PHP script to safely insert user data into a database. This is important to stop bad people from messing with your database by typing harmful commands.
🎯 Goal: You will create a PHP script that uses prepared statements to safely add a user's name and email into a database table called users.
📋 What You'll Learn
Create a PDO connection to a MySQL database
Prepare an SQL INSERT statement with placeholders
Bind user input variables to the prepared statement
Execute the prepared statement safely
Print a success message after insertion
💡 Why This Matters
🌍 Real World
Prepared statements are used in real websites to keep user data safe and stop hackers from changing the database.
💼 Career
Knowing how to prevent SQL injection is a key skill for web developers and backend programmers working with databases.
Progress0 / 4 steps
1
Set up the database connection
Create a variable called $pdo that connects to a MySQL database named testdb on localhost with username root and password password using PDO.
PHP
Hint
Use new PDO() with the DSN string for MySQL, username, and password.
2
Prepare the SQL statement
Create a variable called $stmt that prepares the SQL INSERT statement INSERT INTO users (name, email) VALUES (:name, :email) using the $pdo connection.
PHP
Hint
Use $pdo->prepare() with the SQL string containing :name and :email placeholders.
3
Bind values and execute the statement
Create variables $name with value 'Alice' and $email with value 'alice@example.com'. Then bind these variables to the prepared statement $stmt using bindParam for :name and :email. Finally, execute the statement.
PHP
Hint
Use bindParam to connect variables to placeholders, then call execute().
4
Print success message
Write a print statement that outputs 'User added successfully.' after the statement executes.
PHP
Hint
Use print('User added successfully.'); to show the message.
Practice
(1/5)
1. What is the main purpose of using prepared statements in PHP when working with databases?
easy
A. To allow multiple database connections at once
B. To prevent SQL injection by separating SQL code from user data
C. To automatically format the output of SQL queries
D. To speed up the execution of all SQL queries
Solution
Step 1: Understand SQL injection risks
SQL injection happens when user input is mixed directly with SQL code, allowing attackers to change the query.
Step 2: Role of prepared statements
Prepared statements separate the SQL code from the data, so user input cannot change the query structure.
Final Answer:
To prevent SQL injection by separating SQL code from user data -> Option B
Quick Check:
Prepared statements prevent injection = D [OK]
Hint: Prepared statements separate code and data to stop injection [OK]
Common Mistakes:
Thinking prepared statements speed up all queries
Believing they format output automatically
Confusing with multiple connections
2. Which of the following is the correct way to prepare and execute a statement in PHP PDO to prevent SQL injection?
easy
A. $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]);
B. $stmt = $pdo->query('SELECT * FROM users WHERE id = $id');
C. $stmt = $pdo->prepare('SELECT * FROM users WHERE id = $id'); $stmt->execute();
D. $stmt = $pdo->execute('SELECT * FROM users WHERE id = ?'); $stmt->prepare([$id]);
Solution
Step 1: Check correct prepare syntax
Use prepare() with placeholders like ? for parameters.
Step 2: Execute with parameters
Call execute() with an array of values to bind to placeholders.
Final Answer:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]); -> Option A
Quick Check:
prepare + execute with array = A [OK]
Hint: Use prepare() then execute() with array for safe queries [OK]
Common Mistakes:
Using query() with variables directly
Putting variables inside prepare() string
Calling execute() before prepare()
3. What will be the output of the following PHP code snippet?
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->fetchColumn();
echo $result;
Assuming the user with id 2 has the name 'Alice'.
medium
A. 2
B. Array
C. Alice
D. Error
Solution
Step 1: Understand prepare and execute
The statement prepares a query with a placeholder and executes it with id = 2.
Step 2: Fetch the result
fetchColumn() returns the first column of the first row, which is the name 'Alice'.
Final Answer:
Alice -> Option C
Quick Check:
fetchColumn returns name 'Alice' = C [OK]
Hint: fetchColumn() returns first column value from executed statement [OK]
Common Mistakes:
Expecting fetchColumn() to return an array
Confusing id with name output
Not passing parameters to execute()
4. Identify the error in this PHP code that uses prepared statements:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(':email' => $email);
medium
A. execute() should be called before prepare()
B. The placeholder should be a question mark (?) instead of :email
C. prepare() cannot use named placeholders like :email
D. The execute() method argument should be an array, but syntax is incorrect
Solution
Step 1: Check placeholder usage
Named placeholders like :email are valid in prepare statements.
Step 2: Check execute() argument syntax
execute() expects an array, but ':email' => $email is not inside an array here.
Final Answer:
The execute() method argument should be an array, but syntax is incorrect -> Option D
Quick Check:
execute() needs array argument = A [OK]
Hint: Pass parameters as array to execute() [OK]
Common Mistakes:
Using wrong placeholder style
Passing parameters without array brackets
Calling execute() before prepare()
5. You want to insert multiple user records safely using prepared statements in PHP. Which approach correctly prevents SQL injection and efficiently inserts multiple rows?
A. foreach ($users as $user) {
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->execute([$user['name'], $user['email']]);
}
B. $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->execute($users);
C. foreach ($users as $user) {
$sql = "INSERT INTO users (name, email) VALUES ('{$user['name']}', '{$user['email']}')";
$pdo->query($sql);
}
D. $sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = $pdo->prepare($sql);
$stmt->execute();
Solution
Step 1: Check safe insertion of multiple rows
foreach ($users as $user) {
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->execute([$user['name'], $user['email']]);
} prepares once per iteration and executes with user data safely bound as parameters.
Step 2: Analyze other options
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->execute($users); passes array of arrays directly to execute(), which is invalid. foreach ($users as $user) {
$sql = "INSERT INTO users (name, email) VALUES ('{$user['name']}', '{$user['email']}')";
$pdo->query($sql);
} uses string interpolation risking injection. $sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = $pdo->prepare($sql);
$stmt->execute(); calls execute() without parameters.
Final Answer:
foreach ($users as $user) {
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->execute([$user['name'], $user['email']]);
} -> Option A
Quick Check:
Prepare and execute per user with parameters = B [OK]
Hint: Prepare inside loop and execute with user data array [OK]
Common Mistakes:
Passing multidimensional array directly to execute()
Using string interpolation instead of parameters
Calling execute() without parameters
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.