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