在 bind_param 中使用 s 作为 int

Using s for int in bind_param

让我们使用这个 mysqli 查询:

$query = "SELECT * FROM table WHERE (".$id_type."=?)";

$id_type 是硬编码的,可以是 "userID"(mysql table 中的 int(11))或 "sessionID"char(36) 在 mysql table).

我可以这样绑定参数吗?

$stmt->bind_param('s', $id);

bind_param 中使用 s 时,即使 $id 可能是 int,我是否应该考虑性能损失或其他问题?如果不是,为什么我以后还要费心使用正确的字母 (isd、...)?

尽可能准确以减少侧边风险总是好的effects/issues。

在你的情况下,这样做应该很容易。

示例 1

$type = $id_type == 'userID' ? 'i' : 's';
$stmt->bind_param($type, $id);

如果你只有两个选择,那会很有效。

如果你有更多,下面的方法就可以了。

示例 2

$types = [
    'userID'    => 'i',
    'sessionID' => 's',
];

$stmt->bind_param($types[$id_type], $id);

如果您需要更多列,您可以继续添加到您的 $types 数组。

是的,你可以。

边缘情况很少见,您很可能永远不需要使用特定类型。

另一个答案中提供的技巧适用于这种特殊情况。但是对于整个应用程序,当您进行一些自动化操作时,设置特定类型会很麻烦。

Stack Overflow 上有数百万个问题,涉及您永远无法想象的怪异案例。 None 个关于用例,当你使用 s 并且它导致任何问题时。

在您的旧 mysql_query 代码中,您一直在使用 '$id',没有任何问题。

PDO 一直在 s 中使用这种方法。也没有报道。

因此,如果您愿意,可以执行一些技巧,但在实践中它们是不必要的。