具有数组绑定的 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();
虽然实现命名参数将是一项艰巨的任务,但其余部分非常可行。
A 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();
我正在尝试创建一个可以采用多个参数并在其他地方重复使用的数据库查询函数,但是尝试了一些与我的方法类似的在线方法,但它们没有按预期工作。
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();
虽然实现命名参数将是一项艰巨的任务,但其余部分非常可行。
A 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();