mysqli 的辅助函数,可以在预准备语句中动态绑定参数?

A helper function for mysqli that dynamically binds params in prepared statement?

提问人: 提问时间:3/2/2020 最后编辑:Your Common Sense 更新时间:9/4/2022 访问量:334

问:

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

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

查询:

$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;
        }
    }
}

我添加了一个这样的内容:foreachmysqli_stmt_bind_param

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

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

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

php 函数 mysqli foreach bindparam

评论

0赞 Jay Blanchard 3/2/2020
yo8u 可以向我们展示查询吗?
0赞 3/2/2020
@JayBlanchard 这是问题所在!我编辑了它!

答:

2赞 Your Common Sense 3/2/2020 #1

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

我曾经有过一个完全相同的想法,并实现了我自己的 mysqli 辅助函数

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内容如何,都不应该成为数据库操作的一部分!如果你想知道如何正确处理错误,这是我的另一篇文章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]);

评论

0赞 3/2/2020
非常感谢您的回答!!看起来非常漂亮!我只有一个问题!参数中包含哪些内容?$mysqli
0赞 Your Common Sense 3/2/2020
mysqli 连接,您必须在开始时严格创建一次,然后在脚本执行期间一直使用它