====== PHP RFC: MySQLi Execute with Parameters ======
* Version: 0.1
* Date: 2020-12-26
* Author: Craig Francis, craig#at#craigfrancis.co.uk
* Status: Draft
* Published at: https://wiki.php.net/rfc/mysqli_execute_parameters
===== Introduction =====
Make //mysqli// easier to use with parameterised queries.
===== The Problem =====
Using parameterised queries with //mysqli// is too complicated:
$db = new mysqli('localhost', 'test', 'test', 'test');
$sql = 'SELECT * FROM user WHERE name LIKE ? AND type = ?';
$name = '%a%';
$type = 'admin';
$statement = $db->prepare($sql);
$statement->bind_param('ss', $name, $type);
$statement->execute();
$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
print_r($row);
}
Note that variables need to be used in //bind_param()//, because values cannot be passed by reference.
It's difficult to run a query which changes the parameters (e.g. filter by type might not always be used).
Most queries are single run, so the ability to re-issue the same //$statement// is rarely needed.
===== Proposal =====
Introduce //mysqli::execute//() (and replace the deprecated //mysqli_execute()// function) to make parameterised queries much easier, e.g.
$sql = 'SELECT * FROM user WHERE name LIKE ? AND type = ?';
$parameters = ['%a%', 'admin'];
$result = $db->execute($sql, $parameters);
while ($row = $result->fetch_assoc()) {
print_r($row);
}
We probably cannot change //mysqli::query()// because it's second argument is //$resultmode//.
===== Rough Implementation =====
Something like this:
$value) {
$ref_types .= (is_int($value) ? 'i' : 's'); // 'd' for double, or 'b' for blob.
$ref_values[] = &$parameters[$key];
}
array_unshift($ref_values, $ref_types);
call_user_func_array([$statement, 'bind_param'], $ref_values);
$statement->execute();
return $statement->get_result();
}
}
Where //$sql// should be a [[https://wiki.php.net/rfc/is_literal|safe literal string]].
===== Backward Incompatible Changes =====
None
===== Proposed PHP Version(s) =====
Next PHP 8.x
===== RFC Impact =====
==== To SAPIs ====
Not sure
==== To Existing Extensions ====
- mysqli
==== To Opcache ====
Not sure
===== Open Issues =====
- Reliably detecting the variable types: integer, double, string, blob.
===== Alternatives =====
Not sure
===== Unaffected PHP Functionality =====
Not sure
===== Future Scope =====
Not sure
===== Proposed Voting Choices =====
Yes / No?
===== Patches and Tests =====
A volunteer is needed to help with implementation.
===== Implementation =====
N/A
===== Rejected Features =====
N/A