Php 为什么Perl DBI在执行前需要prepare语句?

Php 为什么Perl DBI在执行前需要prepare语句?,php,mysql,perl,Php,Mysql,Perl,我目前正在编写一点Perl脚本,我对它非常陌生。我在Perl上遇到了一个问题,因为我习惯了Php的MySQL语法,您可以在这里创建所需的语句,然后执行它,然后它将信息发送到服务器端 但是,对于Perl和DBI模块,它要求您创建语句,准备语句,然后执行将信息发送到服务器端的语句 是不是因为Perl类似于高级编程语言,并且里面有一个实用的编译器,所以它在执行之前需要这个prepare语句 我使用的是MySQL update语句,它是否特定于这些语句(update vs select) 当我说“创建声

我目前正在编写一点Perl脚本,我对它非常陌生。我在Perl上遇到了一个问题,因为我习惯了Php的MySQL语法,您可以在这里创建所需的语句,然后执行它,然后它将信息发送到服务器端

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

是不是因为Perl类似于高级编程语言,并且里面有一个实用的编译器,所以它在执行之前需要这个prepare语句

我使用的是MySQL update语句,它是否特定于这些语句(update vs select)

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

$query = "UPDATE table SET column = value";
也许我没有对这个主题做足够的研究?

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

对于你的简单情况,我会使用这个方法


实际上,您不必直接使用
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字符串(最好带有占位符),第二个参数是可选的属性散列(左
unde
),剩下的参数是占位符的替代参数。

您也应该在PHP代码中使用mysqli或PDO的创建、准备、执行方法。非常感谢,那就有十倍的道理了!虽然即使使用
do
方法,使用绑定值也比将数据插入查询字符串要安全得多。@tjd,是的,我支持使用查询参数,而
do
方法使这很容易。这也很有意义!我很感激!简单、直接且易于理解的解释+1.还值得一提的是各种方便的
select**()
方法,它们提供了一种在单个调用中准备、执行和获取数据的简单方法。例如
$dbh->selectall\u arrayref(“SELECT…WHERE foo=?”,undef,$foo)
$dbh->do( "INSERT INTO foo VALUES ( ?, ?, ? )", undef, 1, 2, 3 );