Недавно я перенес веб-сервер со старым магазином PHP, который работает немного сложно: позвольте мне сначала объяснить. Если вы хотите опубликовать это в thedailywtf или codinghorror, пожалуйста.
Владелец магазина запускает exe-файл на своем компьютере для обновления продуктов. Программа генерирует (из базы данных MDB Access) свои собственные файлы PHP и, наконец, загружает их на целевой сервер вместе со специальным updatedb.php
и db.sql
файл (который доступен публично из wwwroot
). Затем exe-файл вызывает POST
к updatedb.sql
с параметром безопасности, который не позволяет посторонним вызывать скрипт PHP (я не буду объяснять, какой общедоступный текстовый файл содержит секретный код в своей первой строке).
Что тогда делает PHP? Просто очистите БД и повторно вставьте все данные, даже если фактическая страница магазина не загружает свои данные из MySQL, но каждый сгенерированный файл PHP содержит статическое описание и ссылки на изображения. В updatedb.php
загружает данные из db.sql
файл и запускает каждую строку в новом соединении SQL.
И старый, и новый сервер работают Apache 2
и vsftpd
. Я обнаружил, что локаль у них разная: старые способы использования ISO-8859-15
charmap и новый сервер UTF-8
. В vsftpd
конфигурация идентична
Я обнаружил, что большинство не-ASCII-символов (например, €
уро, °
и акцентированные буквы àèéìòù
) запутались, поэтому они не будут работать в операторах SQL (и вы можете догадаться, что экранирование не выполняется, и я могу это подтвердить!)
Поскольку клиент не хочет выбрасывать свой магазин, что вынуждает меня добавить несколько специальных директив конфигурации PHP для их виртуального хоста, как мне исправить кодировку символов для файлов, передаваемых через FTP?
Я думал о конфигурации в vsftpd.conf
(источник)
# Enable character convertion. Supported UTF-8 (Russian chars) = UTF8,
# Win-1251 = WIN1251 or 1251, Koi8-r = KOI8R or 878, IBM 866 = DOS or 866.
convert_charset_enable=1
# Define charset local
local_charset=UTF8
# Define default charset on remote host
remote_charset=ISO-8859-15
Но принудительная установка удаленной кодировки на iso-8859-15 не кажется хорошей. К счастью, это единственный клиент, который использует FTP-передачу из Windows XP.
[Обновление] Я только что нашел свой старый вопрос Символ евро испортился во время передачи по FTP о подобной проблеме. В этом случае из знака € вырезали строки SQL. Теперь запросы выполняются с ошибочным знаком €.