繁体   English   中英

Perl用户输入到SQL Like语句中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM