提问人: 提问时间:3/2/2020 最后编辑:Your Common Sense 更新时间:9/4/2022 访问量:334
mysqli 的辅助函数,可以在预准备语句中动态绑定参数?
A helper function for mysqli that dynamically binds params in prepared statement?
问:
我正在尝试为我的项目创建一个函数。我希望它能处理所有的检查功能。我的意思是,在开始在数据库中插入一行之前,请检查该电子邮件地址是否存在行。
要动态使用此功能,它需要灵活。所以我确实把我的变量放在一个数组中,但不能处理数组。作为解决方案,我尝试制作一个循环。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;
}
}
}
我添加了一个这样的内容:foreach
mysqli_stmt_bind_param
foreach ($types as $index => $type) {
mysqli_stmt_bind_param($stmt, $type, $variables[$index]);
}
这给了我一个错误,我不知道如何解决它:(
警告:mysqli_stmt_bind_param():变量数与预准备语句中的参数数不匹配
答:
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 连接,您必须在开始时严格创建一次,然后在脚本执行期间一直使用它
评论