2017-06-28 29 views
0

我試圖做一個存儲過程,將接受來自PHP發送的數據,以將一個或多個圖像存儲在名爲「imagenes」的MySQL表中。MySQL存儲過程變量第一步錯誤#1111

表結構(西班牙語,但英語是完全可以理解的)

+-------------+------------------------------------------+ 
|imagenes  |           | 
+-------------+------------------------------------------+ 
|imagenAlbumId|Primary Key INT NN doesn't auto-increment | 
+-------------+------------------------------------------+ 
|imagenId  |Primary Key INT NN doesn't auto-increment | 
+-------------+------------------------------------------+ 
|imagenData |BLOB NN         | 
+-------------+------------------------------------------+ 
|imagenCreada |DATETIME NN        | 
+-------------+------------------------------------------+ 

每個「相冊」是一款集合屬於單個項目/事件和許多圖像通過相同ALBUMID連接的這就是爲什麼我不希望字段自動遞增,ID邏輯將在PHP的一面。

總的想法是,圖像與其他事件/對象有關,因某些不當行爲而被引用的員工將在其記錄中添加一行可以包含事件圖像的行,該事件是單數的,但它可以有許多圖像。 產品可以有多個圖像,這就是我選擇這種設計的原因。

我試圖做到的,是能夠通過一個單一的HTML輸入<input type="file" name="img" multiple> 這個被髮送到創建數組,然後執行一個「CALL」到MySQL用事先準備好的聲明中的PHP文件上傳多張圖片每個文件。 圖像[0]和圖像[1]等將調用程序new_album_upload(IMAGE_NUMBER,IMAGE_DATA),過程如下所示:

DROP PROCEDURE IF EXISTS new_album_upload; 
DELIMITER $$ 
CREATE PROCEDURE new_album_upload (IN image_number INT, IN image_data BLOB) 
BEGIN 
IF image_number = 0 THEN SET @album_id = MAX(imagenes.imagenId)+1; 
ELSE SET @album_id = MAX(imagenes.imagenAlbumId); 
END IF; 
INSERT INTO imagenes (imagenalbumid, imagenid, imagendata, imagencreada) 
VALUES (@album_id, image_number, image_data, NOW()); 
END $$ 
DELIMITER; 

的想法是,PHP將循環陣列之上,而分析每個文件和如果有效發送它,image [0]將是第一個,並且將觸發IF返回TRUE,並且因此將@album_id設置爲從最高的條目到目前爲止的+1,PHP發送的下一個圖像將是image [1]和從而將@album_id設置爲列中的最高值,從而重複圖像[0]的相冊ID。

我顯然做錯了什麼,因爲程序存儲很好,但是當我嘗試調用它時,出現錯誤#1111「無效使用了組函數」,從我在類似問題上看到的錯誤請使用MAX(),但是我所見過的所有問題都討論了WHERE的用法,在這種情況下我不使用它。 也許還中肯:我使用phpMyAdmin,這和通過內置的模式菜單中執行的程序,它在執行時查詢如下:

SET @p0='0'; 
SET @p1='IMAGE 1-1'; 
CALL `new_album_upload`(@p0, @p1); 

就是我想要實現可能(甚至邏輯)在這種情況下?我使用了錯誤的方法嗎?或者這是我拙劣的一些語法問題? 我對數據庫沒有任何經驗,並且在我學習的過程中學習,所以我很可能會以某種方式反向迴應,並且我願意接受不同方法的建議。 我試圖使用存儲過程的原因是也沒有調用MySQL來查看下一個ID,然後用新的請求發回,我希望能夠發送請求和數據並讓MySQL處理它。

在此先感謝。

+0

'album_id'是一個AUTO INCREMENT列,那麼爲什麼你要爲它手動生成一個新號碼。在多用戶環境中非常危險。讓自動增量執行作業 – RiggsFolly

+0

我正在避免自動增量,因爲如果我上傳2張圖像,第一個將會有正確的album_id並觸發AUTO INCREMENT,因此同一上傳的第二張圖像會有不同的album_id,這不是我想要的。 – Max

+0

相冊ID應該是引用相冊表的外鍵。您應該在那裏自動遞增,然後在添加到imagenes表格時使用該ID。 – Barmar

回答

1

錯誤#1111「無效使用組功能的」

呀顯然,因爲沒有FROM條款,你就不能得到MAX()類似如下的代碼段

THEN SET @album_id = MAX(imagenes.imagenId)+1 

你應該將其更改爲

select @album_id = MAX(imagenId) + 1 
from imagenes 

(OR)

@album_id = (SELECT MAX(imagenId) + 1 from imagenes) 
+0

謝謝,這似乎已經完成了訣竅,我已將它更改爲'(SELECT MAX(imagenId)FROM imagenes)+1; ELSE SET @album_id =(SELECT MAX(imagenAlbumId)FROM imagenes); END IF;'當image_number = 0時,我現在沒有得到預期的行爲,但我離我近了一步。我只是假設我可以在任何地方調用MAX函數。 – Max