为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕田峪7331174 2023-04-15 10:45:01
背景资料:我正在创建一个类来为我处理某些查询。其中一个查询是 SELECT 查询,用户可以在其中根据子句选择某些内容。我成功地检索了列的 TYPES,但不知道如何根据列的 TYPE 实际决定应该给哪个 TYPE bind_param()(第一个参数)。我最初的计划是降低成本并简单地硬编码如果检索到的列类型是某种类型,则应该给出哪个参数。我最初想法的例子:if ($type === "varchar") {    $aVariable = "s";}//OR USE A SWITCH, BUT YOU GET THE IDEAbind_param($aVariable, $someOtherVar);然而,由于许多不同的原因,这并不是我满意的事情。所以我的问题是:问题: 如何使用列 TYPES(如果可能)来确定给定的参数是否bind_param()应该是以下类型之一:“s、i、d、b”,而不必硬编码检索到的类型 =某封信。
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

猜测参数类型总是有味道。而将所有参数设置为“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();

简单、干净、简洁


查看完整回答
反对 回复 2023-04-15
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2023-04-15
  • 2 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信