【问题标题】:php-use "s" or "i" for long in bind_param()?php-在bind_param()中长时间使用“s”或“i”?
【发布时间】:2021-04-08 05:13:50
【问题描述】:

关于prepared statementbind_param()函数,php documentations中提到:

如果您指定类型“i”(整数),它允许您拥有的最大值是 2^32-1 或 2147483647。因此,如果您在您的数据库,那么你最好使用 "s" (字符串)。

这里是说我们应该将s 用于big int 列。但我尝试i 在一个大的 int 列中插入一个 long 并且效果很好。所以这让我很困惑!对于大整数,我们实际上应该使用s 还是i?!

【问题讨论】:

  • 这不是“文档”。您必须区分文档形式 user cmets。任何人都可以在那里发布任何内容,而这样的评论可能会过时、混淆或完全错误。
  • 应该使用s 而不是i 的示例是PHP binding 'bigint' datatype (MySQLi prepared statement)。原因很简单,使用大于 2^32-1 的整数(在 32 位版本上)。但是没有人会阻止你使用s 来处理小于 2^32-1 的值。
  • @Luuk 这让我很困惑!我测试了用i 插入一个bigint,它起作用了。为什么?
  • 因为你用于 bigint 的值小于PHP_INT_MAX。但是 PHP_INT_MAX 的值取决于 32 位或 64 位系统。这就是为什么有人建议使用s,因为这将'always'工作
  • 我一直不明白键入绑定参数的目的。取值范围已经由包含实际值的 PHP 变量确定。

标签: php mysql mysqli prepared-statement bindparam


【解决方案1】:

您几乎应该总是使用s 来处理所有事情。只有少数情况下您希望 mysqli 将值转换为适合您的类型。将所有内容绑定为字符串是最安全的选择。 SQL 无论如何都会将该值转换为它需要的类型。

您在 php.net 网站上找到的评论意味着如果您将整数字符串转换为 PHP 本机整数,那么它可能会在 32 位系统上溢出。 PHP 使用有符号整数,这意味着 32 位系统上的最大值仅为 2147483647。如果您的整数大于此值,则应使用字符串来防止溢出。

BIGINT(64 位整数)和带符号的 INT 都大于 PHP 32 位系统上的最大整数。但是,如果将所有内容都绑定为字符串,则无需担心丢失任何值。

【讨论】:

  • 嗯,bigint 是那些边缘情况之一,不是吗?我记得使用字符串绑定测试 PDO 并且值较大时结果不正确。
  • @YourCommonSense I can't reproduce. 你能解释一下为什么会这样吗?
  • @Dharman s 不能用于booleantinyint(1) 列的情况之一。
  • @Soheil 那是因为当您将布尔值 false 转换为字符串时,它会变成一个不是有效整数的空字符串。 MySQL 没有布尔原语。如果要将 PHP 布尔值保存到 MySQL,则需要将其转换为整数或任何其他表示数据库设计中的真/假值的适当值。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多