【问题标题】:MySQL stored procedure with variables first steps error #1111带有变量的 MySQL 存储过程第一步错误 #1111
【发布时间】:2017-06-28 21:11:06
【问题描述】:

我正在尝试创建一个存储过程,该过程将接受从 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 文件,该文件创建一个数组,然后对 MySQL 执行一个“CALL”,并为每个文件准备一条语句。 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 发送的下一张图片将是 image[1],因此会将 @album_id 设置为列中的最大值,从而重复 image[0] 的专辑 id。

我显然做错了什么,因为该过程存储得很好,但是当我尝试调用它时,我收到一个错误 #1111“组函数的无效使用”,从我读过的类似问题来看,它有事情要做使用 MAX() 但我看到的所有问题都在谈论 WHERE 的使用,在这种情况下我不使用它。 也许也相关:我为此使用 PHPmyAdmin 并通过内置模式菜单执行该过程,它在执行时查询以下内容:

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

在这种情况下,我试图实现的目标是否可行(甚至合乎逻辑)?我是在使用错误的方法,还是我在搞砸一些语法? 我对数据库的经验为零,并且正在学习,所以很可能我已经以某种方式倒退了,我对不同方法的建议持开放态度。 我尝试使用存储过程的原因是也不要调用 MySQL 来查看下一个 ID,然后将其与新请求一起发送回去,我希望能够只发送请求和数据和让 MySQL 来处理它。

提前致谢。

【问题讨论】:

  • album_id 是一个 AUTO INCREMENT 列,那么为什么要手动为其生成一个新数字。在多用户环境中非常危险。让自动增量做它的工作
  • 我正在避免自动递增,因为如果我上传 2 张图片,第一张图片将具有正确的 album_id 并触发 AUTO INCREMENT,因此同一上传的第二张图片将具有不同的 album_id,这不是什么我想要。
  • 专辑ID应该是引用专辑表的外键。您应该在那里自动增加它,然后在添加到 imagenes 表时使用该 ID。
  • @Barmar 使用仅存储此关系的额外表而不是使用具有 2 个键的单个表有什么好处?在我看来,拥有一个简单的结构会更好,因为相册本身在这里没有任何价值,我只对图像感兴趣并将它们分组,“相册”表除了只有一个 id 之外不包含任何数据。跨度>
  • 如果没有专辑特定的信息,将它们分组到专辑有什么意义?例如,也许你应该有专辑名称?

标签: php mysql stored-procedures upload


【解决方案1】:

错误 #1111 “无效使用组函数”

是的,显然因为没有FROM 子句,你不能像下面的代码段那样得到MAX()

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

你应该把它改成

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

(或)

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

【讨论】:

  • 谢谢,这似乎成功了,我已将其更改为 (SELECT MAX(imagenId) FROM imagenes)+1; ELSE SET @album_id =(SELECT MAX(imagenAlbumId) FROM imagenes); END IF; 当 image_number = 0 时,我现在没有得到预期的行为。但我更近了一步。我只是假设我可以在任何地方调用 MAX 函数。
猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 2012-04-09
  • 1970-01-01
  • 2016-03-29
  • 2016-08-20
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多