微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DBD :: Pg :: st执行失败:错误:在“$ 1”或其附近的语法错误

尝试在Perl和DBI中设置Postgresql的值,从而设置DBD :: Pg。

我得到一个奇怪的错误

2013-05-23 19:02:36.641139500 updating status to 0 2013-05-23 19:02:36.641410500 DBD::Pg::st execute Failed: ERROR: Syntax error at or near "$1" 2013-05-23 19:02:36.641418500 LINE 1: UPDATE instances SET $1 = $2 2013-05-23 19:02:36.641423500 ^ at /usr/lib/perl5/vendor_perl/Mitel/MslRest/mbg.pm line 161. 2013-05-23 19:02:36.642425500 [Thu May 23 19:02:36 2013] [error] DBD::Pg::st execute Failed: ERROR: Syntax error at or near "$1" 2013-05-23 19:02:36.642438500 LINE 1: UPDATE instances SET $1 = $2 2013-05-23 19:02:36.642443500 ^ at /usr/lib/perl5/vendor_perl/Mitel/MslRest/mbg.pm line 161. 2013-05-23 19:02:36.642447500

相关的代码

my $sql = "UPDATE instances SET ? = ?"; my $dbh = Mitel::tug::getdbh(); $dbh->begin_work; my $sth = $dbh->prepare($sql); unless ($sth) { return $self->internal_error("prepare Failed: " . $dbh->errstr); } foreach my $propname (sort keys %{ $raw_data }) { my $propval = $raw_data->{$propname}; print STDERR "updating $propname to $propvaln"; if (! $sth->execute($propname,$propval)) { $dbh->rollback; $sth->finish; return $self->internal_error("execute: " . $dbh->errstr); } } $dbh->commit; $sth->finish;

所以我试图更新“状态”为0,使用执行方法,以防止sql注入,但由于某种原因,我得到一个语法错误

错误OCIEnvNlsCreate。 检查ORACLE_HOME(Linux)env var或PATH(Windows)和/或NLS设置,权限等

perl dbi:odbc崩溃/使用奇怪的文件

Perl – DBI和.pgpass

无法在Perl中findDBI.pm模块

使用Perl DBI模块或设置系统DSN并使用ODBC会更好吗?

任何人遇到这个?

root@miketug2 ~]# perl -v This is perl,v5.10.1 (*) built for i386-linux-thread-multi perl-DBD-Pg-2.15.1-4.el6_3.i686 postgresql84-server-8.4.14-1PGDG.rhel6.i686 root@miketug2 ~]# uname -a Linux miketug2 2.6.32-279.22.1.el6.i686 #1 SMP Wed Feb 6 00:31:03 UTC 2013 i686 i686 i386 GNU/Linux

为什么DBD :: sqlite不能通过我的Perl CGI脚本插入到数据库中?

如何安装DBD :: Advantage

Postgresql更喜欢在位置上使用编号的占位符( $1 , $2 ,…) 占位符,所以有人正在翻译你的? 占位符号码占位符; 这就是为什么你的sql

UPDATE instances SET ? = ?

最终结果如下:

UPDATE instances SET $1 = $2

错误信息中。

现在真正的问题是,你不能使用占位符作为标识符(表名,列名,…),你只能使用占位符的值。 你不能说SET ? = ? SET ? = ? ,您必须以其他方式提供列名称,可能是通过字符串插值。 这意味着你必须把你的循环内容转移到这样的东西上:

foreach my $propname (sort keys %{ $raw_data }) { my $prop = $dbh->quote_identifier($propname); my $propval = $raw_data->{$propname}; my $sth = $dbh->prepare("UPDATE instances SET $prop = ?"); $sth->execute($propval); $sth->finish(); }

当然,您的真实代码将包含错误处理。 请注意使用quote_identifier使列名安全的插值。 如果你打算结束这个简单的prepare , execute , finish顺序,那么你可能只想用do来代替。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐