【问题标题】:Using s for int in bind_param在 bind_param 中将 s 用于 int
【发布时间】:2020-01-30 11:06:47
【问题描述】:

让我们来看看这个 mysqli 查询:

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

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

我可以像这样绑定参数吗?

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

bind_param 中使用s 时是否有性能损失或其他我应该考虑的因素,即使$id 可能是int?如果没有,我为什么还要在将来使用正确的字母(isd、...)?

【问题讨论】:

  • 或者你可以这样做:$type = $id_type == 'userID' ? 'i' : 's';。那你只需要:$stmt->bind_param($type, $id);.
  • 重要的是该值将作为不同的类型发送到 MySQL。大多数情况下,MySQL 将自己的类型转换为适合上下文的类型,所以通常这并不重要。但经常并不总是
  • @deceze 感谢您提供这些见解。这个案子怎么办?在这种情况下重要吗?

标签: php mysqli prepared-statement bindparam


【解决方案1】:

尽可能准确以减少副作用/问题的风险总是好的。

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

示例 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 数组中。

【讨论】:

    【解决方案2】:

    是的,你可以。

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

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

    Stack Overflow 上有数以百万计的问题,涉及到您无法想象的奇怪案例。当您使用s 并导致任何问题时,它们都没有关于用例。

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

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

    因此,您可以根据需要执行一些技巧,但实际上它们是不必要的。

    【讨论】:

    • 您能解释一下您所说的“Stack Overflow 上有数百万个问题,关于这些您永远无法想象的奇怪案例。”你的意思是我在stackoverflow.com/a/58773685/1839439 中描述的一个例子吗
    • 你的例子是公平的,我没想到
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多