0

请注意,这不是重复的问题,因为有关此错误的所有其他问题都与必须转义的保留字有关,但情况并非如此。

我有一个普通查询,它是字符串的连接加上使用 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 的文件。

可能有用的是,此图像/文件正在通过 json 变量上的 soap 服务传输,并且文件内容是 base64 编码的,然后在soap服务器上将其解析为 json 并解码 base64。我已经检查过了,Soap 客户端/soap 服务器两边的文件大小相同,所以不是 php 或soap 相关的问题。

在 my.conf 中,max_allowed_pa​​cket 为 996776960。

4

1 回答 1

1

看起来您没有应用适当的措施来转义/屏蔽要插入查询的数据。

您从文件中读取的二进制数据很可能包含映射到在 SQL 语法中有意义的字符的字节序列,例如单引号'——因此如果处理不当,它们会弄乱您的语法。

addslashes不是用于此的功能。每个数据库接口都应该为此提供专用的功能/方法;对于 PHPmysql驱动程序(已弃用),它将是mysql_real_escape_string,因为mysqli它将是mysqli_real_escape_stringresp。mysqli::real_escape_string. 这些函数/方法是专门为这个特定目的而设计的,并且还考虑了连接的字符集等因素。

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

于 2015-02-05T09:01:52.973 回答