【发布时间】:2017-05-07 23:26:08
【问题描述】:
我最近开始使用 MySQLi 准备好的语句。我不喜欢仅仅一个简单的选择语句就需要多少行代码。所以我创建了一个包装函数,请参阅下面问题下方的代码。 注意:get_results() 或 PDO 不适合我。
我的问题是:
会显着降低性能吗?
会因为使用结果数组而占用更多内存吗?
- return 前的 $stmt->close() 会不会造成问题?例如,结果数组数据是否也从内存中释放?
- 我是否需要关闭或释放其他任何东西(关闭数据库连接除外)?
- 您是否发现该功能有任何其他问题或是否可以改进?
代码:
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;
}
}
例如这样使用:
$users = DatabaseHelper::select($conn, "SELECT name,username FROM users WHERE id > ?", "i", array(30));
foreach ($users as $row){
echo $row['username'] . " ". $row['name'] . "<br />";
}
【问题讨论】:
-
你的php版本是多少?
-
PHP 版本 5.6.27
标签: php mysqli prepared-statement