Php 如何在mysqli prepared语句中动态绑定参数?

Php 如何在mysqli prepared语句中动态绑定参数?,php,function,mysqli,foreach,bindparam,Php,Function,Mysqli,Foreach,Bindparam,我正在尝试为我的项目创建一个函数。我希望它能处理所有的检查功能。我的意思是,在你开始在数据库中插入一行之前,你要检查一行是否存在该电子邮件地址 要动态使用此功能,它需要灵活。所以我确实把变量放在了一个数组中,但是mysqli\u stmt\u bind\u param不能处理数组。作为一个解决方案,我尝试了一个foreach循环 查询: $sql = "SELECT users_id, users_email FROM users WHERE users_id = ? AND users_ema

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

要动态使用此功能,它需要灵活。所以我确实把变量放在了一个数组中,但是
mysqli\u stmt\u bind\u 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;
        }
    }
}
我的原始功能:

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\u stmt\u bind\u参数添加了一个
foreach
,如下所示:

foreach ($types as $index => $type) {
    mysqli_stmt_bind_param($stmt, $type, $variables[$index]);
}
这给了我一个错误,我不知道如何解决它:(

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


您的思路非常正确!对于每个使用mysqli的PHP程序员来说,这样的函数应该是一个日常伴侣,但奇怪的是,很少有人想到创建一个

我曾经有过一个完全相同的想法,并实现了我自己的一个:

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;
}
与您的方法的主要区别

  • 连接只进行一次。代码每次执行查询时都会连接,这绝对不是它应该做的
  • 它可以用于任何查询,而不仅仅是选择。您可以在本文下面的示例部分检查该函数的多功能性
  • 类型是可选的,因为大多数时候您不喜欢该类型
  • 没有奇怪的$location变量。老实说,任何HTTP内容都不应该成为数据库操作的一部分!如果您想知道如何正确处理错误,这里是我的另一篇文章
对于您的示例查询,它可以这样使用

$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]);

yo8u能给我们看看这个查询吗?@JayBlanchard问题中有这个!我编辑了它!非常感谢你的回答!!它看起来很好!我只有一个问题。
$mysqli
参数中有什么?你必须在开始时严格创建一次mysqli连接,然后在脚本执行过程中一直使用它