MySQLi Prepared语句 - SELECT的包装函数

时间:2016-12-22 10:50:08

标签: php mysqli prepared-statement

我最近开始使用MySQLi编写的语句。我不喜欢只有一个简单的select语句需要多少行代码。所以我创建了一个包装函数,请参阅下面的问题以下代码。 注意:get_results()或PDO不适合我。

我的问题是:

  1. 它会显着降低性能吗?

  2. 由于使用了结果数组,是否会占用更多内存?

  3. 返回前的$ stmt-> close()会导致任何问题吗?例如,结果数组数据是否也可以从内存中释放出来?
  4. 我是否需要关闭或释放其他任何内容(关闭数据库连接除外)?
  5. 您是否看到该功能有任何其他问题或是否可以改进?
  6. 代码:

    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 />";
    }
    

1 个答案:

答案 0 :(得分:0)

  

它会显着降低性能吗?

没有

  

由于使用了结果数组,它是否会占用更多内存?

不,只要您选择合理数量的数据。在现代应用程序中,您必须首先选择所有数据,因为业务逻辑应与显示逻辑分开。

  

返回前的$ stmt-&gt; close()会导致任何问题吗?例如,结果数组数据是否也可以从内存中释放出来?

为什么不试着看?

  

我是否需要关闭或释放任何其他内容(关闭数据库连接除外)?

你也不必关闭声明。

  

您是否看到该功能有任何其他问题或是否可以改进?

  • 首先。由于它是您正在编写的类,而不是函数,因此通过参数传递连接绝对没有意义。使它成为一个静态属性。
  • 另外,我建议使用默认值设置类型的最后一个参数。在大多数情况下,您不必挑选类型 - 默认字符串可以。
  • 此外,由于您的PHP版本为5.6,您可以使用splat运算符来减少代码量。您可以查看this answer of mine了解详情
  • 我还建议将您的功能分成几个方法 - 一个用于执行查询,另一个用于获取结果。它允许您为各种查询重用相同的代码
  • 确保您是watching for mysqli errors as explained here

因此,理想情况下,您可以通过这种方式调用查询

$users = DatabaseHelper::getAll("SELECT name,username FROM users WHERE id > ?", [30]);
foreach ($users as $row){
    echo $row['username'] . " ". $row['name'] . "<br />";
}

其中getAll()方法在内部使用query()方法执行查询,然后获取所有结果。同样,您可能希望编写getRow()和getOne()方法