Please read Preventing SQL injection with Parametrized Queries for a complete discussion of why prepared statements help you secure your SQL statements from SQL Injection attacks
The $conn
variable here is a MySQLi object. See MySQLi connect example for more details.
For both examples, we assume that $sql
is
$sql = "SELECT column_1
FROM table
WHERE column_2 = ?
AND column_3 > ?";
The ?
represents the values we will provide later. Please note that we do not need quotes for the placeholders, regardless of the type. We can also only provide placeholders in the data portions of the query, meaning SET
, VALUES
and WHERE
. You cannot use placeholders in the SELECT
or FROM
portions.
Object oriented style
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param("si", $column_2_value, $column_3_value);
$stmt->execute();
$stmt->bind_result($column_1);
$stmt->fetch();
//Now use variable $column_1 one as if it were any other PHP variable
$stmt->close();
}
Procedural style
if ($stmt = mysqli_prepare($conn, $sql)) {
mysqli_stmt_bind_param($stmt, "si", $column_2_value, $column_3_value);
mysqli_stmt_execute($stmt);
// Fetch data here
mysqli_stmt_close($stmt);
}
The first parameter of $stmt->bind_param
or the second parameter of mysqli_stmt_bind_param
is determined by the data type of the corresponding parameter in the SQL query:
Parameter | Data type of the bound parameter |
---|---|
i | integer |
d | double |
s | string |
b | blob |
Your list of parameters needs to be in the order provided in your query.
In this example si
means the first parameter (column_2 = ?
) is string and the second parameter (column_3 > ?
) is integer.
For retrieving data, see How to get data from a prepared statement