Mysql LongBlob 语法错误或访问冲突

Mysql LongBlob Syntax error or access violation

请注意这不是一个重复的问题,因为关于这个错误的所有其他问题都与必须转义的保留字有关,而这不是这种情况。

我有一个简单的查询,它是使用 file_get_contents 的字符串和文件内容的串联,查询将如下所示:

CALL sp_student_booking_application_attachment_insert(
    'foreignkey code', -- varchar(255)
    'filename.pdf', -- varchar(255)
    'application/pdf', -- varchar(255)
    file content, -- longblob: not quoted
    file_size -- integer(11): not quoted
);

存储过程只是对插入语句的包装,看起来完全一样。

出于同样的原因,如果我上传一个 10kb 的相对较小的文件,它可以工作,但是它不适用于任何其他更大的文件,但我也可以上传一个 200kb 的 PDF,请注意只是一个特定的 pdf ,如果我使用另一个 pdf,即使它更小也不起作用。我得到的唯一错误是:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?s(??\n??W?hcvӔ???.???a&??5+\"+w??    c??-?ƄqܷL,???-L?b?|)??K?71' at line 5

所以我尝试使用''和``引用文件内容值,但我仍然遇到同样的问题。但是,当我尝试通过 phpmyadmin 上传文件时,它甚至上传了 2mb 的文件。

这可能是有用的,这个 image/file 在 json 变量上通过 soap 服务传输并且文件内容是 base64 编码的,然后在 json soap 服务器和 base64 被解码。我已经检查过,Soap client/soap 服务器上的文件大小相同,所以不是 php 或 soap 相关的问题。

在 my.conf max_allowed_packet 上是 996776960。

您似乎没有对 escape/mask 插入到查询中的数据采取适当的措施。

您从文件中读取的二进制数据很可能包含字节序列,这些字节序列映射到在 SQL 语法中具有意义的字符,例如单引号 ' – 所以那些如果处理不当,会弄乱你的语法。

addslashes 不是用于此的函数。每个数据库接口都应该为此提供专用的 function/method;对于 PHP mysql 驱动程序(已弃用)将是 mysql_real_escape_string,对于 mysqli 它将是 mysqli_real_escape_string resp。 mysqli::real_escape_string。那些 functions/method 是专门为此特定目的而设计的,并且还考虑了连接的字符集等因素。

另一种(更好的)方法是首先使用准备好的语句。有了这些,实际的 SQL “命令”和数据将彼此分开发送到数据库,因此数据弄乱 SQL 语句语法的情况甚至不会再发生。