25

在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();
4

3 回答 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.阅读更多内容。始终使用的另一个缺点是性能。阅读更多关于在 Mysql 查询中引用整数的性能缺点?PDO::PARAM_STR

因此,如果您的列的类型[TINY|SMALL|MEDIUM|BIG]INT不是 use PARAM_INT。如果 PHP 中的变量类型不是整数,则它是一个LIMIT子句而不是强制转换为整数。

于 2013-11-03T09:21:32.197 回答
1

编辑:取决于!请参阅下面的常识评论。

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

如果你没有将 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);

简而言之:

你选!严格数据与否..

于 2016-05-06T15:36:53.227 回答
-4

我无法说出 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. 此模式实际上仅适用于整数值。

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

  • 特殊的列类型,例如BIGINTBOOLEAN需要绑定精确类型的操作数(请注意,为了将 BIGINT 值与 PDO::PARAM_INT 绑定,您需要基于 mysqlnd 的安装)。
  • 一些 DBA 声称,具有重要查询计划的复杂查询可能会受到错误操作数类型的影响。尽管还没有人提供可验证的示例

所有其他问题对于松散类型都很常见,mysql 和 PDO 绑定都没有任何特殊效果。

此外,为避免可能出现的问题,您应该为数据选择正确的列类型。比如说,对于大整数,您应该使用BIGINT,而对于任何类似价格的数据,它必须是DECIMAL。比较不会有一个问题。

于 2013-11-03T09:14:23.780 回答