[英]Perl user input into SQL Like statement
我试图获取用户输入并将其发送到SQL Like语句。 但是我得到了错误:无法在未定义的方法上调用方法“ bind_param”。 我的原始代码:
#!/usr/bin/perl
use DBI;
#use DBD::Oracle;
use strict;
use warnings;
use CGI;
print "Enter INCD number : ";
my $input = <>;
chomp $input;
my $DSN = 'driver={SQL Server};Server=ddsfs1; database=sdfds;TrustedConnection=Yes';
my $dbh = DBI->connect("dbi:ODBC:$DSN")
#print "connected.."
or die "$DBI::errstr\n";
my $query = $dbh->prepare("SELECT TOP 20 Id
,Created
,Updated
,Message
FROM FrameworkDEV3.Log.Entry
where Message like ?
and Created >= DATEADD(day, -10, GETDATE())
order by Created desc");
$sth->bind_param(1, '%$input%');
print $sth;
$sth->execute;
#DBI::dump_results($sth);
while( my @data = $query->fetchrow_array())
{
foreach(@data) {
print "[$_]";
}
print "\n\n";
}
$sth->finish;
$dbh->disconnect;
#print "Connected..";
print "\n";
以下代码根据Dave和Jim的评论进行了固定:
my $sth = $dbh->prepare("SELECT TOP 20 Id
,Created
,Updated
,Message
FROM FrDEVsd.Log.Entry
where Message like ?
and Created >= DATEADD(day, -10, GETDATE())
order by Created desc");
$sth->bind_param(1, "%$input%");
print $sth;
$sth->execute;
#DBI::dump_results($sth);
while( my @data = $sth->fetchrow_array())
{
foreach(@data) {
print "[$_]";
}
print "\n\n";
}
$sth->finish;
$dbh->disconnect;
打印“ \\ n”;
我现在得到的错误是
DBI :: st = HASH(0x2a9a480)
在您的代码中:
my $query = $dbh->prepare("SELECT TOP 20 Id
,Created
,Updated
,Message
FROM sdada.ada.asd
where Message like ?
and Created >= DATEADD(day, -10, GETDATE())
order by Created desc");
my $sth->bind_param(1, "%$input%");
注意,准备好的语句存储在名为$query
的变量中,但是您尝试使用从未设置且未定义的$sth
进行绑定。 这就是错误消息告诉您的内容。
在两个地方(以及稍后执行该语句时)使用相同的变量名来解决该问题。
你已经被给了一条鱼。 也许我们可以向您展示如何在将来抓住自己。
这是您的错误:
无法在未定义的方法上调用方法“ bind_param”
您在此行上调用bind_param()
:
my $sth->bind_param(1, "%$input%");
因此,您要定义一个变量(称为$sth
),并立即期望该变量是可以调用方法的对象。 当您使用my
定义变量时,除非将变量分配给该变量,否则该变量将初始化为undef
:
my $var = 'something';
您的代码与此等效。
my $sth = undef;
$sth->my $sth->bind_param(1, "%$input%");
您现在看到问题了吗?
在DBI代码中,您经常会看到变量$sth
用于存储我们用于执行语句的语句句柄。 我怀疑您已经从一些示例DBI代码中复制了此代码,并从那里获取了变量名。 如果$sth
是语句句柄,那么您当然可以在其上调用bind_param()
方法。
因此$sth
需要成为语句句柄。 然后,通过在数据库句柄上调用prepare()
方法来创建其中之一。
my $sth = $dbh->prepare($some_sql);
哦,等等,...您已经有了一条看起来很像的行:
my $query = $dbh->prepare("SELECT ...");
因此在我看来,您开始使用$query
作为变量来保存语句句柄,开始编写自己的代码。 然后,您从一些示例代码复制了bind_param()
行。 那没有编译,因为它使用了$sth
,您没有声明它,所以您只是在它前面加了一个my
来解决该问题? 这听起来完全正确吗?
您真正想要的是在已经创建的语句句柄上调用bind_param()
。
$query->bind_param(1, "%$input%");
但是,老实说,我认为对DBi相关变量使用“标准”名称是个好主意。 这就是您的维护程序员(可能六个月后会成为您!)所期望的。
因此,我将prepare()
行更改为:
my $sth = $dbh->prepare("SELECT ...");
并保持bind_param()
调用bind_param()
。 您还需要更改要在$sth
上调用的fetchrow_array()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.