具有数组绑定的 MySQLi 动态准备函数


MySQLi dynamic prepared function with array binding

>我正在尝试创建一个数据库查询函数,该函数可以采用多个参数并在其他地方重用,但是在线尝试了许多类似于我的方法的方法,但它们没有按预期工作。

function query($query, $bindings, $type)

我希望能够使用这个单一函数随时随地运行查询,这种类型的函数使用 PDO 驱动程序要容易得多,因为您只需在 ->execute($binding); 中输入绑定,但是在这种情况下,我被迫使用 MySQLi,因为应用程序目前依赖它,但希望将其升级为使用预准备语句。

我需要如何使用该函数来确保它是可重用和灵活的示例:

$engine->query("SELECT * FROM accounts WHERE email = :mail AND id = :id",array(':mail' => $_POST['mail'], ':id' => 2))->fetch_assoc();

让我们将它们分开。首先是语句,然后是用于绑定所用参数的数组,然后是参数的类型,最后是用于查询的fetch_类型(ASSOC、OBJECT、ARRAY)等。

"SELECT * FROM accounts WHERE email = :mail AND id = :id", array(':mail' => $_POST['mail'], ':id' => 2), "si" ->fetch_assoc();

虽然实现命名参数将是一项艰巨的任务,但其余的都是可行的。

PHP>= 5.6 变体,实现 splat 运算符:

function query($query, $params = NULL, $types = NULL)
{
    if (!$params)
    {
        return $mysqli->query($query);
    }
    $statement = $this->mysqli->prepare($select);
    $types = $types ?: str_repeat('s', count($params));
    $statement->bind_param($types, ...$params);
    $statement->execute();
    return $statement->get_result();
}

像这样使用

$sql = "SELECT * FROM accounts WHERE email = ? AND id = ?";
$row = $engine->query($sql, [$_POST['mail'], 2])->fetch_assoc();

或者,如果要显式设置类型

$row = $engine->query($sql, [$_POST['mail'], 2], "si")->fetch_assoc();