【问题标题】:Perl Script broken after upgrade to 5.8.8升级到 5.8.8 后 Perl 脚本损坏
【发布时间】:2013-11-29 06:14:11
【问题描述】:

我们有一个旧应用程序在使用 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 = "<table><tr><th colspan=2>$devicename $id</th></tr>";
        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 .= "<tr><td>$propname</td><td>: $propvalue</td></tr>";}
        }
    $content .= "</table>";
}

sub get_storetable {
        my $id = @_[0];
        my $content = "<table><tr><th colspan=2>Store $id</th></tr>";
        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/,/<br>/g;
        my $content = "<table><tr><th colspan=2>$storename</th></tr>";
        $content .= "<tr><td valign=top>Address :</td><td>$address</td></tr>";
        $content .= "<tr><td>Post Code :</td><td>$postcode</td></tr>";
        $content .= "<tr><td>Phone No :</td><td>$phoneno</td></tr>";
        $content .= "</table>";
}

sub get_franchisetable {
        my $id = @_[0];
        if ($id){
        my $content = "<table><tr><th colspan=2>Franchise $id</th></tr>";
        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/,/<br>/g;
        my $content = "<table><tr><th colspan=2>$company</th></tr>";
        $content .= "<tr><td valign=top>Contact Name :</td><td>$contactname</td></tr>";
        $content .= "<tr><td>Contact No :</td><td>$contactno</td></tr>";
        $content .= "<tr><td>Email :</td><td>$email</td></tr>";
        $content .= "</table>";
        }
}

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

<body link='#000000' vlink='#000000' alink='#000000'>
<script type=\"text/javascript\" src=\"/clit/wz_tooltip.js\" language='javascript'>
</script>
<SCRIPT SRC=\"/clit/getpropertytable.js\">
</SCRIPT>

<script language='javascript' type=\"text/javascript\">
function hidediv(thediv) {
        if (document.getElementById(thediv).style.display == 'none'){
                document.getElementById(thediv).style.display = 'block';
        } else {
                document.getElementById(thediv).style.display = 'none';
        }
    return 0;
}


//</script>
<font face=arial>
<h1>Asset List</h1>
<a href=index.cgi>Back to ticket list</a>
<br><br>

【问题讨论】:

  • 错误消息暗示您的架构不匹配。除了更改 Perl 版本之外,您是否已移至另一台机器,或重建了数据库?
  • 我害怕 Perl 5.8.8 被认为是升级的世界。
  • 编写一个简单的 perl 来使用 DBI 并确保它可以工作
  • 没有Perl 5.8.5.8。您的意思是将5.8.5 升级到5.8.8(即2004 年7 月至2006 年1 月)?
  • 感谢大家的指点和帮助,备注...

标签: mysql perl


【解决方案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 标准,其中一些会导致返回的行不同,而不仅仅是在这种情况下产生错误。

【讨论】:

  • 我的钱花在了@ysth 上——这是一个 MySQL 错误,与 Perl 无关。给未来读者的提示 - 如果可能,一次升级一件事。如果没有,请确保您知道 什么 发生了变化。我知道我经常被类似的问题所困扰。
  • @Richard Huxton:这绝对是一个数据库错误。 MySQL 驱动程序DBD::mysql 报告Unknown column。这超出了 Perl 的管辖范围。
  • 大家好,我基本上是在尝试将运行 CentOS 4.9 的服务器迁移到 CentOS 5.10。除了此脚本上的某些内容之外,其他所有内容都有效。我确实升级了 Mysql,甚至其他涉及 mysql 和 perl 的脚本也可以正常工作。
  • TTTTTTTTTTTTTAAAAANNNNNNNK 你·
  • @Ysth 谢谢 Ysth,对解决我遇到的问题有很大帮助,我尝试过的大部分工作都与 CentOS 4.9 完全不同 - 我是这个论坛的新手,不要还知道如何更改我的用户名,很快就会做到。
猜你喜欢
  • 1970-01-01
  • 2014-12-14
  • 2016-09-14
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多