2011-03-07 69 views
0

我有一個查詢,從內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

我認爲以下查詢等同於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

8

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