【问题标题】:MySQLi Prepared statements - Wrapper function for SELECTMySQLi Prepared statements - SELECT 的包装函数
【发布时间】:2017-05-07 23:26:08
【问题描述】:

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

我的问题是:

  1. 会显着降低性能吗?

  2. 会因为使用结果数组而占用更多内存吗?

  3. return 前的 $stmt->close() 会不会造成问题?例如,结果数组数据是否也从内存中释放?
  4. 我是否需要关闭或释放其他任何东西(关闭数据库连接除外)?
  5. 您是否发现该功能有任何其他问题或是否可以改进?

代码:

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


【解决方案1】:

它会显着降低性能吗?

没有。

会不会因为使用结果数组而占用更多内存?

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

return 前的 $stmt->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() 方法

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 2016-02-19
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多