添加
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();
是的,使用它。
我做了一些测试(使用 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 中的变量类型不是整数,则将其转换为整数。
这要看情况! 请参阅下面的评论。
如果该值是整数,则应将其视为整数。 将此应用到尽可能多的数据类型。如果您不将 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);
简而言之:
你选择!严格数据与否..
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的安装)。
此外,为了避免可能出现的问题,您应该为数据选择正确的列类型。
例如,对于大整数,您应该使用 BIGINT
,而对于任何类似价格的数据,则必须使用
DECIMAL
。而且比较不会有任何问题。