如何根据检索到的列类型动态地将正确的类型分配给 bind_param?

How to assign the correct type to bind_param dynamically based on retrieved column types?

背景资料:

我正在创建一个 class 来为我处理某些查询。其中一个查询是 SELECT 查询,其中用户可以 select 基于子句的内容。我成功检索了列的类型,但不知道如何根据列的类型实际决定应将哪种类型提供给 bind_param()(第一个参数)。

我最初的计划是降低成本并简单地硬编码如果检索到的列类型是某种类型,则应该给出哪个参数。

我原创的例子:

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

然而,由于许多不同的原因,这并不是我满意的事情。所以我的问题是:

问题: 我如何使用列 TYPES(如果可能)来确定给 bind_param() 的参数是否应该是以下类型之一:"s, i, d, b",而不必硬编码检索到的类型 = a某个字母。

猜参数类型总是有味道。而将所有参数设置为 "s" 大多数时候都可以正常工作。

所以让我向您推荐另一种解决方案。明确类型,但 可选 。默认情况下它将是 "s" 但可以手动定义类型,就像我在 mysqli helper function:

中所做的那样
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();

简单、干净、简洁

您的代码永远不要尝试猜测类型。您应该将所有内容绑定为字符串。 99.99% 的时间它不会有任何区别。在某些边缘情况下,实际类型会有所不同,但在这些情况下,您可以在知道类型应该是什么时对类型进行硬编码。如果您猜测类型,那么您只会给您的软件添加更多错误。

您从 HTML 表单收到的所有数据都是字符串类型。 MySQL 根据上下文动态进行类型转换。您为什么要费心将值转换为 PHP?只需将所有内容原样发送到 MySQL 并让它决定类型应该是什么。