Проблема с выходом содержимого файла PHP MYSQL
-
13-09-2019 - |
Вопрос
Я пытаюсь загрузить файл .pdf в базу данных MySQL, используя php.
Все хорошо, кроме содержимого файла.Как бы я ни пытался экранировать специальные символы, запрос всегда терпит неудачу, в основном с «Неизвестной командой ».
Я использовал addslashes, mysql_real_escape_string, Removeslashes и т.д.
Есть ли у кого-нибудь идеи о том, как экранировать содержимое файла?
Большое спасибо,
Решение
Раньше я использовал следующую последовательность, которая, кажется, работает хорошо и сохраняет любые данные в базе данных, включая изображения, PDF-файлы, массивы данных и т. д.:)
Хранение данных (может быть строкой, массивом, объектом и т. д.);
Сначала преобразуйте данные в строку в кодировке Base64.
$strData = strtr(
base64_encode(
addslashes(
gzcompress( serialize($dataToStore) , 9)
)
) , '+/=', '-_,');
Затем сохраните эти строковые данные в базе данных...
Получение данных;
Извлеките строковые данные из базы данных
декодируйте данные обратно в то, что вы хотите (после этого вам может потребоваться выполнить дополнительный шаг в зависимости от входных данных, массива, изображения и т. д.)
$returnData = unserialize(
gzuncompress(
stripslashes(
base64_decode(
strtr($strDataFromDb, '-_,', '+/=')
)
)
)
);
Это, безусловно, помогло мне сохранить то, что мне нужно было сохранить в базе данных MySQL!
Другие советы
Я не понимаю, зачем вам хранить файл в базе данных, но предлагаю вам взглянуть на подготовленные заявления.
Предполагать:Вы можете столкнуться с ошибками из-за несовместимости наборов символов.PDF, вероятно, является двоичным файлом, поэтому вам необходимо убедиться, что столбец базы данных настроен для его обработки.
Помимо проблемы экранирования, вы можете столкнуться с ошибками «слишком большой пакет», если системная переменная (MySQL) max_allowed_packet установлено «маленькое» значение.
Используя расширение mysqli, подготовленные операторы и mysqli_stmt::send_long_data вы можете избежать обеих проблем.