Perl脚本在升级到5.8.8后损坏

 mobiledu2502871817 发布于 2023-02-13 22:51

我们有一个旧的应用程序使用Perl-5.8.5.8可以正常工作,但在Perl-5.8.8上不再有用,我确信这是一个简单的改变,但我找不到它.

DBD::mysql::st execute failed: Unknown column 'stores.id' in 'on clause' at /var/www/cgi-bin/app/list.cgi line 70

这是第70行的背景

my $sth=$dbh->prepare($sql);
$sth->execute();   ################Line 70

这是完整的计划

#!/usr/bin/perl
do "share.pl";

sub get_propertytable {
        my ($id, $devicename) = @_;
        my $content = "";
        my $sql = "SELECT propertytypes.propertyname, deviceproperties.propertyvalue FROM deviceproperties INNER JOIN propertytypes ON deviceproperties.propertytype = propertytyp$
        my $sthq = $dbh->prepare($sql);
        $sthq->execute();
        $sthq->bind_columns(\$propname, \$propvalue);
        while ($sthq->fetch()){
                if ($propname !~ /"Connected"/){
                $content .= "";}
        }
    $content .= "
$devicename $id
$propname: $propvalue
"; } sub get_storetable { my $id = @_[0]; my $content = ""; my $sql = "SELECT storename,address,postcode,phoneno FROM stores WHERE id=$id"; my $sthq = $dbh->prepare($sql); $sthq->execute(); my ($storename, $address, $postcode, $phoneno); $sthq->bind_columns(\$storename, \$address, \$postcode, \$phoneno); $sthq->fetch(); $address =~ s/,/
/g; my $content = "
Store $id
"; $content .= ""; $content .= ""; $content .= ""; $content .= "
$storename
Address :$address
Post Code :$postcode
Phone No :$phoneno
"; } sub get_franchisetable { my $id = @_[0]; if ($id){ my $content = ""; my $sql = "SELECT contactname,company,contactno,email FROM Franchisees WHERE id=$id"; my $sthq = $dbh->prepare($sql); $sthq->execute(); my ($contactname, $company, $contactno, $email); $sthq->bind_columns(\$contactname, \$company, \$contactno, \$email); $sthq->fetch(); $address =~ s/,/
/g; my $content = "
Franchise $id
"; $content .= ""; $content .= ""; $content .= ""; $content .= "
$company
Contact Name :$contactname
Contact No :$contactno
Email :$email
"; } } if ( valid_user() == 1 ) { my $sql = "SELECT id,devicename FROM devicetypes"; my $sth=$dbh->prepare($sql); $sth->execute(); $sth->bind_columns(\$id, \$devicename); while ($sth->fetch()){ $devicetypes[$id] = $devicename; } $sth->finish(); my $sql = "SELECT stores.id, stores.storename, devices.id,devices.devicetype,tradingpartner.name,tradingpartner.id FROM stores,storetradingpartner,tradingpartner LEFT JOIN devices ON devices.store = stores.id WHERE stores.id = storetradingpartner.storeid AND tradingpartner.id = storetradingpartner.partnerid ORDER BY tradingpartner.name,stores.storename,devices.devicetype,devices.id"; my $sth=$dbh->prepare($sql); $sth->execute(); ################# Line 70 #$sth->bind_columns(\$storeid, \$store, \$deviceid, \$devicetype, \$tradingpartner, \$partnerid); print "Content-type: text/html

Asset List

Back to ticket list

ysth.. 9

我怀疑你已经升级到更新的MySQL服务器版本了.

像这样的查询:

FROM stores, storetradingpartner, tradingpartner
LEFT JOIN devices ON devices.store = stores.id

我相信,从MySQL 4.0 5.0.12开始,我的解析方式不同.您应该避免将隐式连接(例如table, table2, table3)与显式连接(例如)混合使用LEFT JOIN.

试试这个:

FROM stores
INNER JOIN storetradingpartner ON stores.id = storetradingpartner.storeid
INNER JOIN tradingpartner ON tradingpartner.id = storetradingpartner.partnerid
LEFT JOIN devices ON devices.store = stores.id
ORDER BY...

http://dev.mysql.com/doc/refman/5.5/en/join.html:

以前,逗号运算符(,)和JOIN都具有相同的优先级,因此连接表达式t1,t2 JOIN t3被解释为((t1,t2)JOIN t3).现在JOIN具有更高的优先级,因此表达式被解释为(t1,(t2 JOIN t3)).此更改会影响使用ON子句的语句,因为该子句只能引用连接操作数中的列,并且优先级的更改会更改这些操作数的解释.

请注意,5.0.1和5.0.12中还有其他连接更改,以使MySQL更符合SQL标准,其中一些将导致返回行的差异,而不仅仅是产生错误,就像在这种情况下一样.

1 个回答
  • 我怀疑你已经升级到更新的MySQL服务器版本了.

    像这样的查询:

    FROM stores, storetradingpartner, tradingpartner
    LEFT JOIN devices ON devices.store = stores.id
    

    我相信,从MySQL 4.0 5.0.12开始,我的解析方式不同.您应该避免将隐式连接(例如table, table2, table3)与显式连接(例如)混合使用LEFT JOIN.

    试试这个:

    FROM stores
    INNER JOIN storetradingpartner ON stores.id = storetradingpartner.storeid
    INNER JOIN tradingpartner ON tradingpartner.id = storetradingpartner.partnerid
    LEFT JOIN devices ON devices.store = stores.id
    ORDER BY...
    

    http://dev.mysql.com/doc/refman/5.5/en/join.html:

    以前,逗号运算符(,)和JOIN都具有相同的优先级,因此连接表达式t1,t2 JOIN t3被解释为((t1,t2)JOIN t3).现在JOIN具有更高的优先级,因此表达式被解释为(t1,(t2 JOIN t3)).此更改会影响使用ON子句的语句,因为该子句只能引用连接操作数中的列,并且优先级的更改会更改这些操作数的解释.

    请注意,5.0.1和5.0.12中还有其他连接更改,以使MySQL更符合SQL标准,其中一些将导致返回行的差异,而不仅仅是产生错误,就像在这种情况下一样.

    2023-02-13 23:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有