PDO::P ARAM_INT 在 bindParam 中很重要?

2022-08-30 17:15:41

在Mysql查询中添加或有任何意义?PDO::PARAM_INTPDO::PARAM_STR

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

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

$stmt->execute();

答案 1

是的,使用它。

我做了一些测试(使用PDO::ATTR_EMULATE_PREPARES),我发现值周围的引号会有所不同。false

将整数值与绑定时,查询中将没有引号(带有PARAM_INT的字符串值具有引号)。如果您将整数值与整数绑定,则会出现引号,并且mysql必须转换为整数。PARAM_INTPDO::PARAM_STR

例子:

$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

编辑:

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

因此,如果您的列的类型比使用.如果它是一个子句,如果PHP中的变量类型不是整数,则转换为整数。[TINY|SMALL|MEDIUM|BIG]INTPARAM_INTLIMIT


答案 2

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

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

如果您没有将 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”附近使用正确的语法

查询:从表中选择 * 123 其中 raw_field = 'home' LIMIT 1 OFFSET '0'

无用的你把它当作一个整数,它会删除字符串(例如:'')。

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

简而言之:

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


推荐