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

时间:2014-01-03 18:57:27

标签: php mysql perl

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

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

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

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

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

$query = "UPDATE table SET column = value";

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

2 个答案:

答案 0 :(得分:20)

您实际上不必直接使用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 );
}

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

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

$dbh->do( "INSERT INTO foo VALUES ( ?, ?, ? )", undef, 1, 2, 3 );

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

答案 1 :(得分:9)

如果您想多次执行查询而不必每次都进行解析,则只需要prepare()。

对于您的简单案例,我会使用do方法。

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