【问题标题】:How to dynamically bind params in mysqli prepared statement?如何在mysqli准备好的语句中动态绑定参数?
【发布时间】:2020-12-11 13:29:17
【问题描述】:

我正在尝试为我的项目创建一个函数。我希望它能够处理所有检查功能。我的意思是在您开始在数据库中插入一行之前,您检查该电子邮件地址是否存在一行。

要动态使用此功能,它需要灵活。所以我确实把我的变量放在了一个数组中,但是mysqli_stmt_bind_param 不能处理数组。作为解决方案,我尝试制作一个foreach 循环。

查询:

$sql = "SELECT users_id, users_email FROM users WHERE users_id = ? AND users_email = ?;";

调用函数:

check_database($sql, array($id, $mail), array("s", "s"), $location);

我原来的功能:

function check_database($sql, $variables, $types, $location)
{
    require $_SERVER['DOCUMENT_ROOT'] . '/includes/db/db.inc.php';
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("Location: " . $location . "?error=sqlerror");
        exit();
    } else {
        mysqli_stmt_bind_param($stmt, $types, $variables);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        if (!$row = mysqli_fetch_assoc($result)) {
            return true;
        }
    }
}

我向mysqli_stmt_bind_param 添加了foreach,如下所示:

foreach ($types as $index => $type) {
    mysqli_stmt_bind_param($stmt, $type, $variables[$index]);
}

这给了我一个错误,我不知道如何解决它:(

警告:mysqli_stmt_bind_param():变量的数量与准备好的语句中的参数数量不匹配

【问题讨论】:

  • 你能告诉我们查询吗?
  • @JayBlanchard 这是问题所在!我编辑了它!

标签: php function mysqli foreach bindparam


【解决方案1】:

你走在一个非常正确的轨道上!这样的函数应该是每个使用 mysqli 的 PHP 程序员的日常伴侣,但奇怪的是,只有少数人有创建它的想法。

我曾经有一个完全相同的想法并实现了我自己的mysqli helper function

function prepared_query($mysqli, $sql, $params, $types = "")
{
    $types = $types ?: str_repeat("s", count($params));
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt;
}

与您的方法的主要区别

  • 连接只进行一次。您的代码每次执行查询时都会连接,这绝对不是它应该做的事情
  • 它可以用于任何查询,而不仅仅是 SELECT。您可以在文章下方的示例部分中检查函数的多功能性
  • 类型是可选的,因为大多数时候你并不关心类型
  • 没有奇怪的 $location 变量。老实说,任何 HTTP 内容都不应该成为数据库操作的一部分!如果你好奇如何正确处理错误,这里是我的另一篇文章Error reporting in PHP

通过您的示例查询,它可以像这样使用

$check = prepared_query($sql, [$id, $mail])->get_result()->fetch_row();

或者,如果你想要一个独特的功能,你也可以这样做

function check_database($mysqli, $sql, $params, $types = "")
{
    return prepared_query($mysqli, $sql, $params, $types)->get_result()->fetch_row();
}

现在它可以被称为

$check = check_database($sql, [$id, $mail]);

【讨论】:

  • 非常感谢您的回答!!它看起来很不错!我只有一个问题! $mysqli 参数中有什么内容?
  • 一开始必须严格创建一次,然后在脚本执行过程中一路使用的mysqli连接
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多