如何根据检索到的列类型动态分配正确的类型来绑定\u param?

yrdbyhpb  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(347)

背景信息:
我正在创建一个类,它将为我处理某些查询。其中一个查询是select查询,用户可以根据子句选择一些内容。我成功地检索到了列的类型,但是不知道如何根据列的类型来决定应该给哪个类型 bind_param() (第一个参数)。
我最初的计划是降低成本,简单地硬编码,如果检索到的列类型是某个类型,那么应该给出哪个参数。
我最初想法的例子:

if ($type === "varchar") {
    $aVariable = "s";
}
//OR USE A SWITCH, BUT YOU GET THE IDEA
bind_param($aVariable, $someOtherVar);

然而,这不是我满意的事情,因为许多不同的原因。所以我的问题是:
问:如何使用列类型(如果可能的话)来确定 bind_param() 应该是以下类型之一:“s,i,d,b”,而不必硬编码检索到的类型=某个字母。

5lwkijsr

5lwkijsr1#

猜测参数类型总是有味道的。然而,将所有参数设置为“s”在大多数情况下都是完美的。
所以让我给你建议另一个解决方案。使类型显式但可选。默认情况下,它将是“s”,但可以手动定义类型,就像我在mysqli helper函数中所做的那样:

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

当您不需要任何特定类型(大多数情况下)时,只需将它们排除在外:

$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id > ?";
$res = prepared_query($conn, $sql, [1])->get_result();

但是每次你需要它时,它都已经在这里显式了,所以你可以设置你想要的确切类型:

$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id > ?";
$res = prepared_query($conn, $sql, [1], "i")->get_result();

简洁明了

b91juud3

b91juud32#

您的代码不应该试图猜测类型。你应该把所有东西都绑成绳子。99.99%的时候都没什么区别。在某些情况下,实际类型会产生差异,但在这些情况下,当您知道类型应该是什么时,可以对类型进行硬编码。如果你猜的类型,那么你只会添加更多的错误到你的软件。
从html表单接收的所有数据都是string类型。mysql根据上下文动态地执行类型转换。为什么要费心在php中转换值呢?只需将所有内容按原样发送到mysql,让它决定应该是什么类型。

相关问题