为什么Perl DBI在执行之前需要一个prepare语句?

Bud*_*ast 10 php mysql perl

我目前正在研究一些Perl脚本,我对它很新.我遇到了Perl的一个问题,因为我已经习惯了Php的MySQL语法,你可以在其中创建所需的语句,然后执行它,然后将信息发送到服务器端.

但是,使用Perl和DBI模块,它需要您创建语句,准备语句,然后执行将信息发送到服务器端的语句.

是因为Perl类似于高级编程语言,并且内部有一个实用的编译器,它在执行之前需要这个prepare语句吗?

我正在使用MySQL更新语句,它是否特定于语句(更新vs选择)?

当我说'创建声明'时,我的意思是:

$query = "UPDATE table SET column = value";
Run Code Online (Sandbox Code Playgroud)

也许我没有对这个话题做过足够的研究?

fri*_*edo 21

实际上你不必prepare直接使用(有一些快捷方式.)但是使用它可以让你告诉数据库驱动程序一个可以重复执行的语句,而数据库不必每次都重新编译它.例如

my @records = ( [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8 9 ] );
my $sth = $dbh->prepare( "INSERT INTO foo VALUES ( ?, ?, ? )" );
foreach my $record( @records ) { 
    $sth->execute( @$record );
}
Run Code Online (Sandbox Code Playgroud)

这将执行相同的预备语句三次,每组三个值中的一个@records.这也演示了?占位符的使用,您应该始终使用占位符,而不是直接将变量插入到SQL字符串中.

如果您只需执行一次语句,则可以将prepare语句和execute语句组合到一个步骤中:

$dbh->do( "INSERT INTO foo VALUES ( ?, ?, ? )", undef, 1, 2, 3 );
Run Code Online (Sandbox Code Playgroud)

第一个参数是SQL字符串(最好使用占位符),秒是可选属性哈希(undef在此处留下),剩下的参数是替换占位符的内容.


Bil*_*win 9

如果要多次执行查询而不进行每次解析,则只需要prepare().

对于你的简单,我会使用do方法.

$query = "UPDATE table SET column = value";
$rows = $dbh->do($query) or die $dbh->errstr;
Run Code Online (Sandbox Code Playgroud)

  • 虽然使用`do`方法,但使用绑定值比将数据插入查询字符串要安全得多. (2认同)