具有变量的MySQL存储过程首先执行错误#1111

时间:2017-06-28 21:11:06

标签: php mysql stored-procedures upload

我正在尝试创建一个存储过程,接受从PHP发送的数据,将一个或多个图像存储在名为“imagenes”的MySQL表中。

表格结构(用西班牙语,但用英语完全可以理解)

+-------------+------------------------------------------+
|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> 这将被发送到一个PHP文件,该文件创建一个数组,然后执行一个'CALL'到MySQL,并为每个文件准备一个语句。 image [0]和image [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发送的下一个图像将是图像[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处理它。

提前致谢。

1 个答案:

答案 0 :(得分: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)