PDO::PARAM_INT 在bindParam 中重要吗?

问题描述 投票:0回答:3

添加

PDO::PARAM_INT
PDO::PARAM_STR
在Mysql查询中有什么意义吗?

$sql  = 'SELECT TagId FROM tagthread WHERE ThreadId = :ThreadId';

$stmt = $this->db->prepare($sql);
$stmt->bindParam(':ThreadId', $threadid, PDO::PARAM_INT);

$stmt->execute();
php mysql pdo
3个回答
25
投票

是的,使用它。

我做了一些测试(使用 PDO::ATTR_EMULATE_PREPARES

false
),我发现值周围的引号会有所不同。

当您将整数值与

PARAM_INT
绑定时,查询中将不会有引号(带有 PARAM_INT 的字符串值有引号)。如果你用
PDO::PARAM_STR
绑定一个整数值,将会有引号,并且 mysql 必须转换为整数。

示例:

$stmt->bindParam(':ThreadId', $threadid, PDO::PARAM_INT);
$threadid = 123;
// SELECT TagId FROM tagthread WHERE ThreadId = 123
$threadid = '123test';
// SELECT TagId FROM tagthread WHERE ThreadId = '123test'
// mysql will cast 123test to 123

编辑:

我进一步测试并阅读了该主题。结论:

Implicit casting is dangerous and can lead to unexpected results.
阅读更多相关内容这里。始终使用
PDO::PARAM_STR
的另一个缺点是性能。阅读有关性能的更多信息 在 Mysql 查询中引用整数的缺点?

因此,如果您的列属于

[TINY|SMALL|MEDIUM|BIG]INT
类型,请使用
PARAM_INT
。如果它是一个
LIMIT
子句,那么如果 PHP 中的变量类型不是整数,则将其转换为整数。


1
投票

这要看情况! 请参阅下面的评论。

如果该值是整数,则应将其视为整数。 将此应用到尽可能多的数据类型。

如果您不将 PDO::ATTR_EMULATE_PREPARES 的属性设置为 false,您将收到一个令人讨厌的错误。

实例:

$stmt = $dbh->prepare("SELECT * FROM table123 WHERE raw_field = :field LIMIT 1 OFFSET :offset;"); $stmt->bindParam(':field', $field); $stmt->bindParam(':offset', $offset); if ($map_stmt->execute()) { $data = stmt->fetch(PDO::FETCH_ASSOC); } else { echo 'Error :'; echo '<pre>'; print_r($map_stmt->errorInfo()); print_r($map_stmt->debugDumpParams()); echo '</pre>'; }
将返回一个令人讨厌的错误,其中包含:

错误代码:1064 您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在第 1 行“0”附近使用的语法

查询:SELECT * FROM table123 WHERE raw_field = 'home' LIMIT 1 OFFSET '0'

你将其视为整数是没有用的,它会删除字符串(例如:' ')。

$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);

简而言之:

你选择!严格数据与否..


-3
投票
我无法说出 PDO 支持的所有驱动程序,但对于 MySQL,大多数时候不使用

PDO::PARAM_INT

 也没关系。

因此,通过大量

bindParam

 调用来使代码变得臃肿是没有意义的。通常,只需将变量直接发送到 
execute()
:

$sql = 'SELECT TagId FROM tagthread WHERE ThreadId = ?'; $stmt = $this->db->prepare($sql); $stmt->execute([$threadid]);
这里你的

$threadid

变量将被默默地绑定为一个字符串,但是MySQL将它与数据库中存储的整数值进行比较不会有任何问题。 
现实中大家都是这样做的,从来没有任何问题。

通过关闭仿真模式可以轻松解决

LIMIT

子句中字符串类型绑定的问题。

请注意,

PDO::PARAM_INT

不会投射您的值。这意味着,如果您尝试使用此模式绑定字符串类型值,它将被绑定为字符串,即使您显式将类型设置为PDO::PARAM_INT
。该模式实际上仅适用于整数值。

在少数极端情况下,您可能希望显式绑定整数:

    特殊的列类型,如
  • BIGINT
    BOOLEAN
    ,需要绑定精确类型的操作数(请注意,为了将BIGINT值与
    PDO::PARAM_INT
    绑定,您需要基于mysqlnd的安装)。
  • 一些 DBA 声称具有重要查询计划的复杂查询可能会受到错误操作数类型的影响。虽然还没人提供可验证的例子
所有其他问题对于松散类型来说都很常见,MySQL 和 PDO 绑定都没有任何特殊效果。

此外,为了避免可能出现的问题,您应该为数据选择正确的列类型。

例如,对于大整数,您应该使用 BIGINT,而对于任何类似价格的数据,则必须使用

DECIMAL
。而且比较不会有任何问题。
    

© www.soinside.com 2019 - 2024. All rights reserved.