尝试在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] 举报,一经查实,本站将立刻删除。