Bird
Raised Fist0
PHPprogramming~5 mins

Preventing injection with prepared statements in PHP - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is SQL injection?
SQL injection is a security risk where attackers insert harmful SQL code into input fields to manipulate or access the database in unauthorized ways.
Click to reveal answer
beginner
What are prepared statements in PHP?
Prepared statements are a way to safely run SQL queries by separating the SQL code from the data, which helps prevent SQL injection.
Click to reveal answer
intermediate
How do prepared statements prevent SQL injection?
They treat user input as data only, never as part of the SQL command, so harmful code can't change the query's meaning.
Click to reveal answer
beginner
Show a simple PHP example using prepared statements to insert a username safely.
$pdo = new PDO($dsn, $user, $pass); $stmt = $pdo->prepare('INSERT INTO users (username) VALUES (:username)'); $stmt->execute(['username' => $inputUsername]);
Click to reveal answer
beginner
Why is it unsafe to directly insert user input into SQL queries?
Because attackers can add SQL code in the input that changes the query, leading to data leaks, data loss, or unauthorized access.
Click to reveal answer
What does a prepared statement do in PHP?
ASeparates SQL code from data to prevent injection
BAutomatically encrypts the database
CDeletes user input before running SQL
DRuns SQL queries faster by caching
Which PHP function is used to prepare a SQL statement?
Aprepare()
Bexecute()
Cquery()
Dfetch()
Why should you avoid inserting user input directly into SQL strings?
AIt uses more memory
BIt makes the code run slower
CIt can cause SQL injection attacks
DIt is harder to read
What does the execute() method do in prepared statements?
ACloses the database connection
BRuns the prepared SQL query with given data
CPrepares the SQL query
DFetches results from the database
Which of these is a benefit of using prepared statements?
AEncrypts user passwords
BAutomatically backs up the database
CMakes the website load faster
DPrevents SQL injection
Explain how prepared statements help prevent SQL injection in PHP.
Think about how the database sees the input versus the command.
You got /3 concepts.
    Describe the steps to safely insert user input into a database using prepared statements in PHP.
    Remember the order: connect, prepare, execute.
    You got /3 concepts.

      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

      1. Step 1: Understand SQL injection risks

        SQL injection happens when user input is mixed directly with SQL code, allowing attackers to change the query.
      2. Step 2: Role of prepared statements

        Prepared statements separate the SQL code from the data, so user input cannot change the query structure.
      3. Final Answer:

        To prevent SQL injection by separating SQL code from user data -> Option B
      4. 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

      1. Step 1: Check correct prepare syntax

        Use prepare() with placeholders like ? for parameters.
      2. Step 2: Execute with parameters

        Call execute() with an array of values to bind to placeholders.
      3. Final Answer:

        $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]); -> Option A
      4. 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

      1. Step 1: Understand prepare and execute

        The statement prepares a query with a placeholder and executes it with id = 2.
      2. Step 2: Fetch the result

        fetchColumn() returns the first column of the first row, which is the name 'Alice'.
      3. Final Answer:

        Alice -> Option C
      4. 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

      1. Step 1: Check placeholder usage

        Named placeholders like :email are valid in prepare statements.
      2. Step 2: Check execute() argument syntax

        execute() expects an array, but ':email' => $email is not inside an array here.
      3. Final Answer:

        The execute() method argument should be an array, but syntax is incorrect -> Option D
      4. 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?
      $users = [
        ['name' => 'John', 'email' => 'john@example.com'],
        ['name' => 'Jane', 'email' => 'jane@example.com']
      ];
      // Which code below is correct?
      hard
      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

      1. 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.
      2. 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.
      3. Final Answer:

        foreach ($users as $user) { $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)'); $stmt->execute([$user['name'], $user['email']]); } -> Option A
      4. 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 unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard