J'ai récemment commencé à utiliser les instructions préparées de MySQLi. Je n'ai pas aimé le nombre de lignes de code qui étaient nécessaires pour une simple instruction select. J'ai donc créé une fonction wrapper, voir le code ci-dessous les questions ci-dessous. Note : get_results() ou PDO n'est pas une option pour moi.
Mes questions sont les suivantes :
-
Cela ralentira-t-il sensiblement les performances ?
-
L'utilisation d'un tableau de résultats nécessitera-t-elle plus de mémoire ?
-
Le fait que $stmt->close() précède le retour va-t-il causer des problèmes ? Par exemple, peut-être que les données du tableau de résultats sont également libérées de la mémoire ?
-
Dois-je fermer ou libérer quoi que ce soit d'autre (à part la fermeture de la connexion à la base de données) ?
-
Voyez-vous d'autres problèmes avec la fonction ou pourrait-elle être améliorée ?
Code :
class DatabaseHelper{
static function select($con, $query, $formats, $params){
$a_params = array();
$param_type = '';
$n = count($formats);
for($i = 0; $i < $n; $i++) {
$param_type .= $formats[$i];
}
$a_params[] = & $param_type;
for($i = 0; $i < $n; $i++) {
$a_params[] = & $params[$i];
}
$stmt = $con->prepare($query);
call_user_func_array(array($stmt, 'bind_param'), $a_params);
$stmt->execute();
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$columns[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $columns);
while ($stmt->fetch()) {
foreach($row as $key => $val) {
$x[$key] = $val;
}
$results[] = $x;
}
$stmt->close();
return $results;
}
}
Utilisé comme ceci par exemple :
$users = DatabaseHelper::select($conn, "SELECT name,username FROM users WHERE id > ?", "i", array(30));
foreach ($users as $row){
echo $row['username'] . " ". $row['name'] . "<br />";
}