Mysql LongBlob Синтаксическая ошибка или нарушение прав доступа

Пожалуйста, обратите внимание, что это не дублированный вопрос, так как все остальные вопросы об этой ошибке связаны с зарезервированным словом, которое должно быть экранировано, но это не так.

У меня есть простой запрос, который представляет собой объединение строк и содержимого файла с использованием 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
);

Процедура store — это просто оболочка оператора вставки, которая выглядит точно так же.

По той же причине, если я загружаю сравнительно небольшой файл 10 КБ, он работает, однако он не будет работать с любым другим большим файлом, но я также смог загрузить PDF размером 200 КБ, пожалуйста, обратите внимание только на конкретный 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, он загружает даже файлы с 2 МБ.

Может быть полезно, чтобы это изображение / файл проходило через службу мыла для переменной json, а содержимое файла кодировалось с помощью base64, которое затем анализировалось как json на сервере мыла, и декодировалась base64. Я проверил, и файл имеет одинаковый размер с обеих сторон. Мыльный клиент / мыльный сервер, так что это не проблема, связанная с PHP или мылом.

На my.conf max_allowed_packet это 996776960.

0

Решение

Похоже, вы не применили надлежащие меры для экранирования / маскировки данных, которые вы вставляете в запрос.

Двоичные данные, которые вы читаете из файла, с большой вероятностью содержат последовательности байтов, которые отображаются на символы, имеющие значение в синтаксисе SQL, как, например, одиночная кавычка. ' — так что они могут испортить ваш синтаксис, если они не обрабатываются правильно.

addslashes это не та функция, которую можно использовать для этого. Каждый интерфейс базы данных должен предоставлять для этого отдельную функцию / метод; для PHP mysql драйвер (который не поддерживается), который будет mysql_real_escape_string, за mysqli это было бы mysqli_real_escape_string соответственно mysqli::real_escape_string, Эти функции / метод специально разработаны для этой конкретной цели, а также принимают во внимание такие факторы, как набор символов соединения.

Другой (и лучший) способ заключается в использовании готовые заявления на первом месте. С их помощью фактические «команды» SQL и данные отправляются в базу данных отдельно друг от друга, поэтому случай, когда данные портят синтаксис оператора SQL, может больше не происходить.

1

Другие решения

Других решений пока нет …