在Mysql查询中添加PDO::PARAM_INT
或有什么意义?PDO::PARAM_STR
$sql = 'SELECT TagId FROM tagthread WHERE ThreadId = :ThreadId';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':ThreadId', $threadid, PDO::PARAM_INT);
$stmt->execute();
是的,使用它。
我做了一些测试(使用 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.
阅读更多内容。始终使用的另一个缺点是性能。阅读更多关于在 Mysql 查询中引用整数的性能缺点?PDO::PARAM_STR
因此,如果您的列的类型[TINY|SMALL|MEDIUM|BIG]INT
不是 use PARAM_INT
。如果 PHP 中的变量类型不是整数,则它是一个LIMIT
子句而不是强制转换为整数。
编辑:取决于!请参阅下面的常识评论。
如果该值是整数,则应将其视为整数。将其应用于尽可能多的数据类型。
如果你没有将 PDO::ATTR_EMULATE_PREPARES 的 Attribute 设置为 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);
简而言之:
你选!严格数据与否..
我无法说出 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
通过关闭仿真模式可以轻松解决字符串类型 bindnig in子句的问题。
请注意,PDO::PARAM_INT
这不会投射您的 value。意味着如果您尝试使用此模式绑定字符串类型值,即使您将 type 显式设置为PDO::PARAM_INT
. 此模式实际上仅适用于整数值。
在少数情况下,您可能希望显式绑定整数:
BIGINT
或BOOLEAN
需要绑定精确类型的操作数(请注意,为了将 BIGINT 值与 PDO::PARAM_INT 绑定,您需要基于 mysqlnd 的安装)。所有其他问题对于松散类型都很常见,mysql 和 PDO 绑定都没有任何特殊效果。
此外,为避免可能出现的问题,您应该为数据选择正确的列类型。比如说,对于大整数,您应该使用BIGINT
,而对于任何类似价格的数据,它必须是DECIMAL
。比较不会有一个问题。