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

背景资料:


我正在创建一个类来为我处理某些查询。其中一个查询是 SELECT 查询,用户可以在其中根据子句选择某些内容。我成功地检索了列的 TYPES,但不知道如何根据列的 TYPE 实际决定应该给哪个 TYPE 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”,而不必硬编码检索到的类型 =某封信。


慕田峪7331174
浏览 87回答 2
2回答

杨__羊羊

猜测参数类型总是有味道。而将所有参数设置为“s”在大多数情况下都可以正常工作。所以让我建议你另一种解决方案。使类型显式但可选。默认情况下它将是“s”,但可以手动定义类型,就像我在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;}当您不需要任何特定类型时(大部分时间),只需将它们排除在外:$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();简单、干净、简洁

qq_花开花谢_0

您的代码不应该尝试猜测类型。您应该将所有内容绑定为字符串。99.99% 的时间它不会有任何区别。在某些边缘情况下,实际类型会有所不同,但在这些情况下,您可以在知道类型应该是什么时对类型进行硬编码。如果您猜测类型,那么您只会给您的软件添加更多错误。您从 HTML 表单收到的所有数据都是字符串类型。MySQL 根据上下文动态地进行类型转换。为什么要费心在 PHP 中转换值?只需将所有内容原封不动地发送给 MySQL,让它决定类型应该是什么。
打开App,查看更多内容
随时随地看视频慕课网APP