gpt4 book ai didi

mysql - 为什么使用 DBI 的变量绑定(bind)会导致 MySQL 查询失败?

转载 作者:行者123 更新时间:2023-11-29 01:19:01 25 4
gpt4 key购买 nike

出于某种原因,对以下 AES 键使用 DBI 的绑定(bind)参数功能会导致查询无法找到任何行。

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect('dbi:mysql:database=thedb;host=localhost');

my $aes_key = 'X`ku@wC_BI\SgY[S%/<iaB>&VXd5zDA+';
print length($aes_key), "\n";

my $test = $dbh->selectrow_hashref("SELECT COUNT(*) FROM users WHERE id = ?\
AND AES_DECRYPT(enc_pass, '$aes_key') IS NOT NULL", undef, 1);
print $test->{'COUNT(*)'}, "\n";

$test = $dbh->selectrow_hashref("SELECT COUNT(*) FROM users WHERE id = ?\
AND AES_DECRYPT(enc_pass, ?) IS NOT NULL", undef, 1, $aes_key);
print $test->{'COUNT(*)'}, "\n";

输出:

32
1
0

我看到 $aes_key 中有一个转义的“S” ,但自 \S 以来,它似乎对变量没有任何影响在 Perl 中不是有效的转义序列。不过,我确实怀疑是这个问题或类似问题。

最佳答案

当您将变量绑定(bind)到占位符时,MySQL 会使用 Perl 变量中的内容。当您将变量插入 SQL 语句时,MySQL 将其视为字符串文字。

MySQL 通过删除反斜杠来处理未知的反斜杠转义。作为 MySQL 字符串文字,'\S''S' 是等效的。当您使用占位符时,Perl 变量中的 '\S' 相当于 '\\S' 作为 MySQL 字符串文字。

看来您使用字符串文字将 key 错误地存储在数据库中,因此现在使用占位符时无法找到它。我敢打赌,如果您将初始化 $aes_key 的行更改为

my $aes_key = 'X`ku@wC_BISgY[S%/<iaB>&VXd5zDA+'; # note missing backslash

那么结果会变成

31
1
1

因为那是 MySQL 实际上一直在使用的 key 。

关于mysql - 为什么使用 DBI 的变量绑定(bind)会导致 MySQL 查询失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com