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.
1 ответ
Похоже, вы не применили надлежащие меры для экранирования / маскировки данных, которые вы вставляете в запрос.
Двоичные данные, которые вы читаете из файла, с большой вероятностью содержат последовательности байтов, которые отображаются на символы, имеющие значение в синтаксисе SQL, как, например, одиночная кавычка. '
- так что они могут испортить ваш синтаксис, если они не обрабатываются правильно.
addslashes
это не та функция, которую можно использовать для этого. Каждый интерфейс базы данных должен предоставлять для этого отдельную функцию / метод; для PHP mysql
драйвер (который не поддерживается), который будет mysql_real_escape_string
, за mysqli
это было бы mysqli_real_escape_string
соответственно mysqli::real_escape_string
, Эти функции / метод специально разработаны для этой конкретной цели, а также учитывают такие факторы, как набор символов соединения.
Другой (и лучший) способ - это использовать подготовленные утверждения в первую очередь. С их помощью фактические "команды" SQL и данные отправляются в базу данных отдельно друг от друга, поэтому случай, когда данные портят синтаксис оператора SQL, может больше не происходить.