工作MySQL查询失败在Perl

问题描述:

我有一个查询,从内phpMyAdmin的运行时,它的工作原理,但是当用Perl编写的网站内的集成,它失败并引发错误。 两者都具有相同的数据库的连接运行,并从当集成到网站的编码/格式方面,所有是​​正确的,同其他查询。工作MySQL查询失败在Perl

任何帮助,将不胜感激 - 感谢!

MySQL查询:

CREATE TEMPORARY TABLE tmp_lecture_days (
timeslot_id int(50) 
); 
INSERT INTO tmp_lecture_days (timeslot_id) 
SELECT DISTINCT tab_appointment.timeslot_id 
FROM tab_appointment WHERE lecture_id = '1115'; 
SELECT COUNT(timeslot_id) 
FROM tmp_lecture_days; 

MySQL查询在Perl:

  $query 
       = &statement_database(
        "CREATE TEMPORARY TABLE tmp_lecture_days (
        timeslot_id int(50) 
        ); 
        INSERT INTO tmp_lecture_days (timeslot_id) 
        SELECT DISTINCT tab_appointment.timeslot_id 
        FROM tab_appointment WHERE lecture_id = '1115'; 
        SELECT COUNT(timeslot_id) 
        FROM tmp_lecture_days;"); 

      my ($days) = $query->fetchrow_array; 

错误日志:

2011年7月3日10点14分12秒的错误你有一个错误的SQL语法; 检查与您的MySQL服务器版本相对应的手册,以找到在';'附近使用的正确语法。 2011年7月3日10时14分十二秒错误INSERT INTO tmp_lecture_days(timeslot_id) 2011年7月3日10时14分十二秒误差在3号线

我认为以下查询等同于3个查询:

SELECT COUNT(DISTINCT timeslot_id) FROM tab_appointment 
    WHERE lecture_id = '1115' 

有关详细信息,请检查COUNT()here MySQL参考手册。

+0

或者也可以工作 - 我尝试了结合,但由于某种原因,它出错了。比较你的简短版本到我的,只是结果我得到了支架在DISTINCT的错误的一面 - 谢谢一堆XD – schuhmi2 2011-03-07 13:55:08

SELECT DISTINCT tab_appoi”如果你正在使用DBI运行查询,你不允许向其中发表一个以上的陈述。尝试将CREATE TABLE ...放入一个查询中,并将INSERT ...放入另一个查询中。

+0

虽然我在想这可能是问题,我在那里创建一个临时表,所以不会关闭第一个查询也删除临时表?更改为这种方式意味着每个条目运行4个查询(第四个查询是在查询1中创建的删除表)。这可能会导致一个长长的清单上的时间问题,因为你是你必须做的数量的四倍。 – schuhmi2 2011-03-07 13:43:46

+4

临时表存在于整个连接中。只要确保你正在查询相同的连接,而不是为每个语句建立新的连接。 – jishi 2011-03-07 14:02:45

+1

DBI.pm为了您自己的安全执行此操作。禁止多个语句通常会极大地限制攻击者在发现SQL注入漏洞时可以执行的操作。声明终止分号的最着名的用法是http://xkcd.com/327/ – 2011-03-07 16:44:10