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 语句语法的情况甚至不会再发生。
请注意这不是一个重复的问题,因为关于这个错误的所有其他问题都与必须转义的保留字有关,而这不是这种情况。
我有一个简单的查询,它是使用 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 语句语法的情况甚至不会再发生。