在 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
,我是否应该考虑性能损失或其他问题?如果不是,为什么我以后还要费心使用正确的字母 (i
、s
、d
、...)?
尽可能准确以减少侧边风险总是好的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
中使用这种方法。也没有报道。
因此,如果您愿意,可以执行一些技巧,但在实践中它们是不必要的。
让我们使用这个 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
,我是否应该考虑性能损失或其他问题?如果不是,为什么我以后还要费心使用正确的字母 (i
、s
、d
、...)?
尽可能准确以减少侧边风险总是好的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
中使用这种方法。也没有报道。
因此,如果您愿意,可以执行一些技巧,但在实践中它们是不必要的。